题目一
题目1:可在ubuntu主机上预先安装md5collgen,题目为“生成两个MD5哈希值一致但是文件内容不同的文件”。
所谓“文件内容不同但却有相同的哈希值”就是 碰撞。
在这个题目中,我们将生成两个具有相同MD5哈希值的不同文件。这两个文件的开始部分需要相同,即它们共享相同的前缀。我们可以使用md5collgen程序实现这一点,它允许我们提供具有任意内容的前缀文件。
md5collgen的原理
MD5将输入的数据按照64字节一组(M1-Mn)进行切分,然后在这些分组上进行迭代地计算。其核心是压缩函数,其接受两个输入,分别是64字节的数据分组和前一次迭代的输出,压缩函数compression function会输出128位的IHV(intermediate hash value),这个输出将在下一次迭代时参与运算。如果当前的迭代是最后一次,IHV就是最终的hash值。而第一次迭代IHV0的IHV的输入是固定值。
安装md5collgen
先从github下载md5collgen工具包源码,将其上传至ubuntu中(官网下载好像没makefile文件)
然后进行解压 unzip
sudo apt install build-essential
sudo apt install libboost-all-dev
然后执行make命,安装好md5collgen工具
利用md5collgen生成文件
在md5collgen-master下新建一个文本文件 prefix.txt(作为相同前缀的文件)
执行命令:
./md5collgen -p prefix.txt -o out1.bin out2.bin
目录下生成了对应的两个文件
diff out1.bin out2.bin
md5sum out1.bin
md5sum out2.bin
文件不一样,但哈希值一致。
hexdump -C out1.bin
hexdump -C out2.bin
在图形界面也可以看出,两个文件不一致
经观察可得两文件的前缀相同,文件内容有不同。通过分析md5collgen的原理可以明白形成这一现象原因。从prifix.txt中取前缀,若前缀不是64的倍数,则用零填充。md5collgen为两个输出文件生成128字节的内容,这两个输出文件就是在这128字节中存在部分差异。
题目二
新建一个文件source_code.c,用于存放源代码(并给定数组的内容)
执行编译:
编译后的结果:
在二进制文件中找到xyz数组的位置:
hexdump -C source_code
我们可以选择前 12480 个字节作为前缀prefix文件,中间12480到12608作为中间的128字节文件,后面第12609个字节到文件结束作为后缀suffix文件。
head -c 12480 source_code > prefix
tail -c +12609 source_code > suffix
前缀prefix文件:(部分)
后缀suffix文件:(部分)
用前缀prefix文件上运行md5collgen 来生成两个具有相同MD5散列值的输出(即数组内容相同):
./md5collgen -p task2_prefix -o task2_out1.bin task2_out2.bin
diff task2_out1.bin task2_out2.bin
md5sum task2_out1.bin
md5sum task2_out2.bin
可视化:
文件内容不同
哈希值相同
版权归原作者 hxh207 所有, 如有侵权,请联系我们删除。