collision
Daddy told me about cool MD5 hash collision today.
I wanna do something like that too!
ssh col@pwnable.kr -p2222 (pw:guest)
本题考察哈希碰撞思想。
源码如下:
#include <stdio.h> #include <string.h> unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i<5; i++){ res += ip[i]; } return res; } int main(int argc, char* argv[]){ if(argc<2){ printf("usage : %s [passcode]\n", argv[0]); return 0; } if(strlen(argv[1]) != 20){ printf("passcode length should be 20 bytes\n"); return 0; } if(hashcode == check_password( argv[1] )){ system("/bin/cat flag"); return 0; } else printf("wrong passcode.\n"); return 0; }
程序把传入的第一个参数(长20)每4个分为一组,共5组,加和等于hashcode则目标达成。
因此可以考虑如下构造方法,让每组都等于hashcode除以5,但是因为hashcode为568134124无法被5整除,因此将hashcode先加一再除以5,再将其中一个结果减一即可
注意大小端序的转化,同时对于无法直接输入的部分,可以用`python -c "print '语句' "`进行处理,-c可以让python执行一行语句
推荐用python2进行输入,python3涉及到部分unicode,传入的不一定长度为20
因此对于本题而言,(hashcode+1)/5=0x6c5cec9,因此传参为`python -c "print '\xc9\xce\xc5\x06\xc9\xce\xc5\x06\xc9\xce\xc5\x06\xc9\xce\xc5\x06\xc8\xce\xc5\x06'"`