md5 hash의 collision을 발견했단다.
대단하다.
나도 함 발견하게 소스코드를 보자.
main의 argument로 받은 20byte를 parameter로 check_password를 실행해 받아온 값이
hashcode의 값과 같으면 flag를 볼 수 있다.
그럼 check_password함수의 코드를 보자
( 너무 길어서 한번에 설명하자니 글만 많아져 사진을 잘랐다. )
parameter로 넘어온 값의 pointer를 int *로 캐스팅한다.
int는 4byte를 갖는 data type이므로 int p[5]와 같은 셈이다.
check_password함수는 이 int형 배열의 값들을 모두 더한 값을 반환한다.
즉 argument값으로 0x21DD09EC/5를 한 값을 5번 연달아 입력해주면 된다.
0x21DD09EC / 5 = 0x06C5CEC8 ........ 4
입력값으로 0x06C5CEC806C5CEC806C5CEC806C5CEC806C5CECC를 넣어주자.
***
little endian표기법에 의해 int의 4byte단위로 값을 거꾸로 넣어주어야 의도한대로 연산이 처리된다.
python을 사용해 hex값을 입력해 줄 수 있다.
***
./col `python -c 'print "\xc8\xce\xc5\x06"*4+"\xcc\xce\xc5\x06"'`
나도 md5의 collision을 발견했다.
이 연산을 md5 hash라고 하는 이유는 정확히는 모르겠다
그냥 block방식으로 hash를 해서 그런거 아닐까