collision

这个题目名字是hash碰撞,其实就是一个加减乘除的题目,和第一题一样.简单..

一开始看到程序,他就是要求我们输入的数据长度为20的字符串,每四个字符合体转为int,然后int数据一共5个,相加等于0x21DD90CE,即可

一开始我的思维一直卡在可以显示的字符上面,后来看别人的writeup,才发现,我是卡在不了解python -c这种机制上面,一些不可以显示的字符,可以使用'\x**'来表示,这样代表16进制数据上传,下面是python -c 的用法说明:

python -c cmd 运行时以命令行字符串形式提交的Python脚本(exe文件不考虑...用不了python-c)
当对于elf文件来说,argv[0]="./collision",argv[1]="输入的参数"
当对于python文件来说,argv[0]="-c",argv[1]="输入的参数"

这里对于处理输入的字符串有两种方法,从大佬博客中看到的:

first:(博客园)

对20个字节,要构造输入的整型转换后的5个整数求和 == 0x21DD09EC,第一个想法是:前16个字节赋\x00,最后4个字节为0xEC09DD21,但是\x09是HTab,输入会被阻断

一开始,我以为是这样的,但是我试了一下,前面16个全是0的话,python,会认为输入的是20个字符,但是C语言就会认为是4个字符,而且如果说\x09是HTab,输入会被阻断的话,我输入了\x08退格或者其他特殊字符都不会执行对应的操作,所以我觉得还是需要自己多进行验证的)。 第二个想法:前16个字节赋\x01,最后4个字节为\xE8\x05\xD9\x1D.

./col `python -c "print '\x01' * 16 + '\xE8\x05\xD9\x1D'"`

second:()

直接除以五,多的减1,少的补1

>>> 0x21DD09EC
568134124
>>> 0x21DD09EC/5
113626824.8
>>> hex(int(0x21DD09EC/5+0.2))
'0x6c5cec9'
>>> 0x6c5cec9*5
568134125
./col $(python -c 'print "\xc9\xce\xc5\x06"*4+"\xc8\xce\xc5\x06"')

flag:daddy! I just managed to create a hash collision :)

你可能感兴趣的:(collision)