
다음 문제는 collision !

ls 명령어로 디렉토리 내에 있는 파일을 먼저 살펴보았다.
내 권한은 col 이므로 col 파일은 실행 / col.c 파일은 읽기 / flag는 아무것도 할 수 없다.
먼저 읽을 수 있는 파일을 파악해야 실행 파일을 활용할 수 있을 것 같아 col.c 파일을 읽어보았다.

unsigned long 형의 hashcode을 정의하고 16진수 21DD09EC를 대입했다.
unsigned long 형의 check_password 함수를 정의했다.
함수는 인자를 int 형으로 변환하여 4byte 씩 5번 읽고, res에 추가한다.
res를 return 하고 함수가 종료된다.
main 함수로 넘어와보자.
argc가 2 미만일 경우 즉 인자가 없을 경우에 fd 문제와 동일하게 문장을 출력, 종료한다.
argv[1]의 길이가 20byte가 아닐 경우에 "passcode length should be 20 bytes\n"를 출력, 종료한다.
hashcode와 check_password(argv[1]))가 일치할 경우 flag를 cat하고, 종료한다.
즉, 함수를 거친 res 값과 hashcode가 일치해야 한다.
다를 경우에는 else에서 "wrong passcode.\n"을 출력, 종료한다.

입력되는 인자는 크기는 20byte여야 하며 check_password를 지나서
나온 값이 hashcode의 값인 0x21DD09EC와 일치해야 한다.
check_password는 20byte를 4byte 씩 쪼개서 5개를 모두 합친다.
0x21DD09EC / 5 = 0x6C5CEC8이지만
0x6C5CEC8 * 5 = 0x21DD09E8 이므로 0x21DD09EC와 일치하지 않고 0x04만큼 작다.
그러므로 다섯 조각 중 마지막 조각에만 0x04를 더하여 페이로드를 작성하면 "0x6C5CEC8 * 4 + 0x6C5CECC"이 된다.
[ 페이로드 ]
0x6C5CEC8 * 4 + 0x6C5CECC

Collision의 flag는 "daddy! I just managed to create a hash collision :)"