当前位置: 首页 > news >正文

CVE-2024-1112 Resource Hacker 缓冲区溢出分析

漏洞简述

CVE-2024-1112 是 Resource Hacker 软件的一个缓冲区溢出漏洞。该漏洞存在于版本 3.6.0.92 中。由于软件在处理命令行中的文件路径时未对文件字符串长度进行限制,过长的字符串参数导致内存被过度写入,从而引发缓冲区溢出。

漏洞复现

构造长度300的字符串当做参数传入Resource Hacker
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9
Resource Hacker崩溃
在这里插入图片描述

异常偏移为0x316a4130,也就是对应的0Aj1。由此看出通过构造的字符串参数是可以造成程序溢出并劫持执行流。
在这里插入图片描述

漏洞分析

由于字符串作为参数使用,漏洞产生和处理字符串参数有关,先在GetCommandLine函数下断点,一步步找到溢出点。
通过下图得知,传入的参数溢出覆盖了SHE的处理函数,在程序出现异常后会调用异常处理函数的地址
在这里插入图片描述

分析溢出函数
这个函数主要是对传入的字符串参数进行处理,并将处理后的字符串赋给v6变量,由于未对传入的参数做长度限制,导致栈溢出。
在这里插入图片描述

从上图可知,函数内部设置处理接收参数的的数组大小为264个字节,对此进行测试。
如果传入268个字节参数,淹没了函数返回值地址,在函数返回时发现返回值地址不存在进入异常处理,找到对应的异常处理函数并抛出异常。
在这里插入图片描述

如果传入272个字节参数,指向下个SEH链的指针被覆盖,无法找到对应的异常处理函数,程序崩溃。
在这里插入图片描述

如果传入292个字节参数,SEH链的指针及处理函数都被传入的参数淹没,并且在函数返回前就出现访问异常,调用异常处理函数时出现崩溃。
在这里插入图片描述

通过上述测试可以发现有2种利用方式
1.传入构造的272字节参数,利用跳转指令跳转到前面的268字节执行shellcode
2.传入构造的大于292个字节参数,利用jmp esp跳板指令跳转到292字节后的执行shellcode

利用限制

虽然传入的字符串参数能导致栈溢出,但是基本不可能达到稳定利用成功。
1.由于是在命令行中传入的,很多不可见字符被复制到命令行中时字符发生改变。
2.想要执行我们的shellcode需要找到存在"jmp esp",“call ebp”,“pop pop ret"等汇编指令的地址,但是这个溢出函数对字符做了很多限制,很难利用当前模块的地址。
在这个循环中,首先判断传入参数的每个字符,如果小于0x20,就结束循环。虽然能构造参数第三个字符为0x22(”)进入里层循环不对小于0x20的字符限制,但是不能存在0字符。

while ( 1 ){v4 = *a1;if ( (unsigned __int8)*a1 <= 0x20u )break;if ( v4 == 0x22 ){++a1;while ( 1 ){v3 = *a1;if ( !*a1 || v3 == 0x22 )break;v6[v2++] = v3;++a1;}if ( *a1 )++a1;}else{v6[v2++] = v4;++a1;}}

也就是说在这个以0x00400000为基址的程序当前模块地址写入shellcode时,由于出现0x00,后面的字符被截断,只能利用前面200多个字节的空间做shellcode。
理论上有200多字节的空间,但是需要找跳板指令,只能找到call/jmp dword ptr ss:[ebp-(>)18],在当前模块能找到比较好的也就是call dword ptr ss:[ebp-75]了,这样又进一步压缩了shellcode的使用空间,很难去利用。

参考

https://enessakircolak.netlify.app/posts/2024/exploit-101/

在这里插入图片描述

http://www.lryc.cn/news/444858.html

相关文章:

  • WebGL渲染与创建2D内容
  • ArcGIS Desktop使用入门(三)图层右键工具——拓扑(下篇:地理数据库拓扑)
  • LeetCode题练习与总结:二叉树的最近公共祖先--236
  • uni-app 多环境配置
  • 【d48】【Java】【力扣】LCR 123. 图书整理 I
  • 【MySQL】InnoDB 索引为什么使用B+树而不用跳表?
  • 【学习笔记】TLS/SSL握手之Records
  • 【MySQL】创建新账号新数据库并授权
  • Nginx反向代理简介,作用及配置;Nginx负载均衡简介,作用及配置;
  • SAP MIGO M7146不支持移动原因
  • vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源
  • 重型工程车辆数据集
  • 【Kubernetes】常见面试题汇总(三十三)
  • ubuntu安装无线网卡驱动(非虚拟机版)
  • 保障电气安全的电气火灾监控系统主要组成有哪些?
  • gitlab集成CI/CD,shell方式部署
  • UE学习篇ContentExample解读-----------Blueprint_Mouse_Interaction
  • 得物App荣获新奖项,科技创新助力高质量发展
  • 傅里叶变换(对称美)
  • 基于单片机与 PC 机通信的数据采集控制系统设计
  • MyBatis参数处理
  • Beyond 5.5旗舰版和高级版激光软件
  • python爬虫/引用requests/基本使用
  • 输电线塔目标检测数据集yolo格式该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。
  • MySQL之基本查询(二)(update || delete || 聚合函数 || group by)
  • 全栈开发(五):初始化前端项目(nuxt3+vue3+element-plus)+前端代理
  • Linux环境变量进程地址空间
  • C++读取txt文件中的句子在终端显示,同时操控鼠标滚轮(涉及:多线程,产生随机数,文件操作等)
  • Android 中使用高德地图实现根据经纬度信息画出轨迹、设置缩放倍数并定位到轨迹路线的方法
  • LeetCode从入门到超凡(二)递归与分治算法