如何使用相同的 MD5 哈希创建两个二进制文件

当我如何使用相同的 MD5 哈希创建两个 PHP 文件时,有人问我一个问题:它适用于编译的二进制文件吗?

答案是肯定的,事实上,这就是我在这个演示中第一次得到这个想法的地方。

该示例使用 C 程序作为目标,并执行二进制操作,这略微模糊了它的工作方式。它还利用了 Wang 攻击的一个非常缓慢的旧实现来生成碰撞。为了更好、更快速地展示它是如何为即将到来的演讲工作的,我创建了一个非常简单的示例,使用 PHP 脚本在编译后操作二进制文件。

我已经把这里使用的所有代码都放在了github上。

下面是一个超级简单的 C 程序,它比较两个字符串,如果它们不匹配,它会打印出天使的 ASCII 艺术图片。如果它们确实匹配,你会得到一张魔鬼的照片。

它可以用 gcc 编译并执行,只需执行程序将打印出天使,因为两个字符串在最后一个字母中不同。

现在我们有了编译的二进制文件,我们需要对它做一些处理。我们要做的是将 MD5 冲突插入到虚拟文本的长串 A 中。我们只需要插入两个 64 字节的块,但我们需要将其插入到块的开头,即当字节长度是 64 字节的倍数时。

当我们第一次在它上运行 php 脚本时,它会找到这样的位置并计算文件中该点 MD5 的四个链接变量的值。它打印出连接在一起的十六进制值作为哈希值。

现在,我们可以获取该值并搜索与该初始状态的 MD5 冲突。最好的 MD5 碰撞查找器是 Marc Stevens fastcoll。它通常可以在几秒钟内使用 Wang 攻击的变体找到碰撞。下载后,您需要对其进行编译。github 上的代码中应该有一个 Makefile。运行它指定初始状态和输出文件如下所示。

-o 选项指定输出文件,因此将创建两个新文件 a 和 b,其中包含 2 个二进制数据块。此时,这些块仅作为二进制文件中的 MD5 冲突起作用。第二次运行 php 脚本将创建原始编译二进制文件的两个副本,并将冲突插入到适当的位置。
所以现在我们又创建了两个文件,天使和魔鬼。运行其中每个都应该给出不同的输出。

但它们应该具有相同的 MD5 值。

$ chmod +x angel devil

如果 运行 fastcoll 缺少库 libboost_filesystem.so.1.75.0 ,需要 找到库,加入路径:

原文链接:Nat McHugh:如何使用相同的 MD5 哈希值制作两个二进制文件

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部