MD5 Collision Attack Lab
Task1生成有相同md5hash的两个不同文件
首先两个文件有相同的前缀,使用md5collgen就可以实现这一点,不论任意内容都可以有相同前缀,该程序工作流程如下
给出一个前缀文件prefix.txt,将会输出两个文件out1.bin,out2.bin
然后可以使用md5sum校验每个输出文件的hash是否相同
Task2理解md5的性质
Md5将输入的数据按照64字节一组进行切分,然后在这些分组上进行迭代地计算。其狠心是压缩函数,其接受两个输入,分别是64字节的数据分组和前一次迭代的输出,压缩函数compression function会输出128位的IHV(intermediate hash value),这个输出将在下一次迭代时参与运算。如果当前的迭代是最后一次,IHV就是最终的hash值。而第一次迭代IHV0的IHV的输入是固定值。
基于其如何工作的,我们可以得到md5算法的性质:给两个输入M和N,如果MD5(M)=MD5(N),那么对于任意输入T,都有MD5(M||T) =MD5(N||T),||表示拼接。
这意味着如果M和N有相同的hash,添加相同的后缀T将会让两个输出有相同的hash值。不仅md5有这个性质,其他的hash算法也有。
可以使用cat命令来连接两个文件(二进制文件、文本文件都可以)
Task3
可以把可执行文件分成三部分
我们可以使用md5collgen生成两个有相同md5hash值的文件,使用P和Q分别代表其output的第二部分(各有128字节)
因此我们有
基于前面提到的性质,给他们加上相同的后缀,得到的hash值依然是相同的,即
所以我们只需使用P和Q来提到数组的128字节,这样我们就可创建有相同hash的两个不同二进制文件。它们的输出是不同的,因为他们每个都会打印出有不同内容的数组。
可以使用bless查看二进制文件并找到数组的位置。
在切分二进制文件时可以使用head,tail。
Task4 制作两个行为不同的程序
Task3中只是打印的内容不容,其执行的还是相同的指令序列。
对于那些先是对文件md5,然后对hash进行签名的证书来说,通过hash碰撞就有可能实现给恶意软件签名的效果。
方法类似于task3,原理如下