首页 > 其他分享 >网络攻防技术——哈希碰撞

网络攻防技术——哈希碰撞

时间:2024-01-05 17:11:55浏览次数:31  
标签:攻防 两个 相同 文件 碰撞 哈希 MD5

实验3:MD5碰撞试验

实验内容:

本次实验主要是加深大家对MD5碰撞及其原理的理解,使用SEED实验环境中的工具及编程语言,完成以下任务:

  1. 使用md5collgen生成两个MD5值相同的文件,并利用bless十六进制编辑器查看输出的两个文件,描述你观察到的情况;
  2. 参考Lab3_task2.c的代码,生成两个MD5值相同但输出不同的两个可执行文件。
  3. 参考Lab3_task3.c的代码,生成两个MD5值相同但代码行为不相同的可执行文件。
  4. 回答问题:通过上面的实验,请解释为什么可以做到不同行为的两个可执行文件具有相同的MD5值?

 

 

  1. lab1

    该实验的基础是:根据相同的前缀,可以生成两个文件,这两个文件的前缀相同,但后面却不同,同时具有相同的哈希值,即产生了哈希碰撞

    下面进行演示,新建并写入文字到prifix.txt

    使用md5collgen工具创建出两个产生碰撞的文件

    使用diff命令发现两个文件不同,但却产生了相同的哈希值,成功产生碰撞

    1. Q1:观察发现如果给出的前缀不足64,即在md5计算中无法构成一个完整的运算块,md5会进行补0填充

      注:hexdump命令可以将二进制文件以十六进制的形式显示出来

      `hexdump -C <fileName>`

    2. Q2:我们给一个正好等于64字节大小的前缀文件,再进行哈希碰撞,发现没有补0,正好构成了一个运算块

    3. Q3:通过观察我们发现只有很少的一部分字节发生了改变,这样才使得算出的哈希值有可能相同,不同的字节在下图用红框框出

  2. lab2

    MD5算法原理:

    MD5将输入数据划分为64字节的块,然后在这些块上迭代计算哈希。MD5算法的核心是一个压缩函数,它接受两个输入,一个64字节的数据块和上一次迭代的结果。压缩函数产生一个128位的IHV,代表"中间散列V值";然后将该输出馈送到下一次迭代中。如果当前迭代是最后一次迭代,则IHV将是最终的哈希值

    于是可以推出,给定两个输入M和N,如果MD5(M)=MD5(N),,则对于任何输入T,MD5(M||T)=MD5(N||T),因为M和N产生的IHV一样,这是前面的数据唯一影响最终哈希值的部分,是一样的

    向上面生成的两个产生哈希碰撞的文件分别追加相同的字符串"task2",然后再计算哈希值,发现哈希值相同,验证了相同哈希的字符加上相同一段字符后,两者的哈希值依然相同

  3. lab3

    目前验证软件是否正版或者是否被篡改的方法就是校验两个文件的哈希是否相同,如果可以纂改一个软件后哈希值不变,就可以逃过检验

    可以将程序分成下面三个部分,prefix生成128字节后,哈希值相同,再加上相同的后缀后依然相同

    编写好要用到的程序,程序内容为定义一个长度为200的字符数组,然后通过for循环将该字符数组打印出来

    查看文件的二进制形式,发现数组位于0x3020+1处,于是将之前的内容取出作为产生哈希碰撞的前缀

    观察产生的前缀文件profix,发现截取正确,于是使用md5collgen产生两个碰撞的文件

    因为0x3020不是64的倍数,所以在计算碰撞时会补32个0,计算后缀时要记得减去

    文件原长度减去产生碰撞的前缀的长度,再减去产生的128字节,得到需要截取的后缀的长度(0x4258-0x3020-128-32=4504),因为我们要保证改动前后文件的总长度不变,还要保证改动部分不会超过数组空间,防止破坏程序结构和功能,尽量数组空间选大一些,所以这里选的是200

    将前后缀拼接在一起,得到两个二进制文件,分别执行两个二进制文件,发现输出结果不同,但有相同的哈希

  4. lab4

    上面构造的程序只是将数组输出的内容变了,我们需要更加恶意的行为,我们当然可以直接将良性代码改成恶意代码,但这样构造哈希碰撞比较困难,所以依然采用上面的思想,定义两个字符数组,并比较两个数组,如果相等则执行恶意代码部分,如果不相等则执行良好代码部分(虽然这种恶意代码过不了恶意代码检测系统的审核,但毕竟只是个实验)

    编译该文件得到二进制文件,复制两份(file1和file2),分别作为良好程序和恶意程序以对比

    通过观察发现第一个数组在0x3020(十进制的12320)处开始,上面的任务我们默认使用了碰撞的补零机制,但是strcmp函数遇到00会停止比较(00截断,00是C语言中的字符串终止符),所以选择0x3040作为开始,取一个能被64整除的前缀

    生成两个前缀文件

    profix1生成的128位字节是P部分, profix2生成的128位字节是Q部分。将P部分替换file1的第二个数组和file2的两个数组的前128个字节位置;将Q部分替换file1的第一个数组部分,达到的效果如下图所示:

    为方便,这里我们就选择在图形化界面直接覆盖:

    分别运行file1和file2,结果如下:

  5. 结果分析

    由于哈希函数的特性,产生碰撞是不可避免的,通过一些已有的工具可以快速算出能发生碰撞的两个值,并且如果将两个值加上相同的一部分,再进行哈希计算,得到的哈希值依然相同,这就给了我们可以去构造恶意程序的空间,现在我们有两个程序,而我们只修改一小部分就会有完全不同的效果,我们就可以将这两个可执行文件的相同前缀取出,然后把生成的碰撞哈希加到后面,这两个碰撞哈希只有微小的不同,我们将其放在变量的位置,这样不会影响程序的结构,那么我们可以通过修改程序的的变量值,达到相同哈希但结果不同的程序,也可以构造出巧妙的函数结构(如task4中),当然也可以选择构造其他的结构,以达到相同哈希但程序行为不同的效果,通过这种方法我们可以绕过哈希检查,这说明md5哈希算法存在着很大的漏洞,用md5哈希值去证明程序的抗抵赖性和恶意程序检测是有风险的。

标签:攻防,两个,相同,文件,碰撞,哈希,MD5
From: https://www.cnblogs.com/leo1017/p/17947665

相关文章

  • 网络攻防技术——环境变量和Set-UID攻击
    实验6:环境变量与set-uid实验实验内容:本实验室的学习目标是让学生了解环境变量如何影响程序以及系统行为。环境变量是一组动态命名值,可以影响正在运行的进程将在计算机上运行。大多数操作系统都使用它们,因为它们是1979年引入Unix。尽管环境变量会影响程序行为,但它们是如何实现的......
  • 数据库攻防学习之MySQL
    MySQL0x01mysql学习MySQL是瑞典的MySQLAB公司开发的一个可用于各种流行操作系统平台的关系数据库系统,它具有客户机/服务器体系结构的分布式数据库管理系统。可以免费使用使用,用的人数很多。0x02环境搭建这里演示用,phpstudy搭建的环境,然后安装phpmyadmin0x03漏洞复现日志文件包含ge......
  • 数据库攻防学习之Redis
    Redis0x01redis学习在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识,那么什么是redis?redis就是个数据库,常见端口为6379,常见漏洞为未授权访问。0x02环境搭建这里可以自己搭建一个redis环境,也可以用vulfocus搭建一个环境,可以两个都搭建,因为一些攻击手法,需要自己搭......
  • 哈希冲突
    我们先模拟一下,其实题目就是要我们从\(y\)这个位置开始跳,每次跳\(x\)步,然后把每次跳到的数的和加起来就是最终的答案我们发现当\(x\)比较大的时候是可以暴力的,但是比较小的时候就不行了这时就有一个套路了,我们找出一个分界点,比这个分界点大的时候我们暴力否则使用其他方法那么......
  • 网络攻防技术——shellcode编写
    实验5:shellcode编写实验实验内容:shellcode广泛用于许多涉及代码注入的攻击中。编写shellcode是相当有挑战性的。虽然我们可以很容易地从互联网上找到现有的shellcode,但是能够从头开始编写我们自己的shellcode总是令人兴奋的。shellcode中涉及到几种有趣的技术。本实验室的目的是......
  • 网络攻防技术——栈溢出
    作业题目本实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞改变程序的流控制,甚至执行任意代码。此漏洞是由于数据存储......
  • 【黑产攻防道04】利用pow工作量证明降低黑产的破解效率
    上一期我们提到,黑产有三种常见的破解方式:1.通过识别出验证码图片答案实现批量破解验证,即图片答案识别;2.在了解通讯流程之后直接携带相关参数发请求,即协议破解;3.使用各种客户端模拟器来模拟真人通过验证,即模拟器破解。针对这黑产的“三板斧”,极验总结了一一对应的验证码攻防点:图片答......
  • 云上攻防--云服务&&对象存储(域名接管)&&弹性计算(元数据泄露)
    云上攻防--云服务&&对象存储(域名接管)&&弹性计算(元数据泄露)对象存储各个厂商对于对象存储的叫法不同,但是除了叫法基本没有其他区别。对象存储各大云名词:阿里云:OSS腾讯云:COS华为云:OBS谷歌云:GCS微软云:Blob亚马逊云:S3对于对象存储的漏洞或者说错误配置点如下权限配置......
  • 深入浅出一致性哈希
    哈希是什么哈希又称散列,是一种计算数据指纹的方法。哈希函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来业务场景常见的业务场景;网站用户请求后,为了性能一般都会加一层缓存。缓存有多个节点,每个节点存储了不同数据。获取数据,先根据数据取模(哈希)找到缓存节点......
  • 哈希集合、哈希表的拉链法实现
    哈希表705.设计哈希集合//拉链法structListNode{intval;structListNode*next;};typedefstruct{structListNode*data;}MyHashSet;//模constinthashSize=1009;MyHashSet*myHashSetCreate(){MyHashSet*myHashSet=(MyHashSet......