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

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.kler.cn/a/322501.html

相关文章:

  • 网络协议之UDP
  • 前端处理input框只能输入带小数点的数字
  • Restful API接⼝简介及为什么要进⾏接⼝压测
  • Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】
  • 爬取链家二手房房价数据存入mongodb并进行分析
  • 人工智能训练师 综合测试题库一
  • 防火墙详解(二)通过网页登录配置华为eNSP中USG6000V1防火墙
  • 基于springBoot校园健康驿站管理平台(源码+教程)
  • 如何将很多个pdf拼接在一起?很多种PDF拼接的方法
  • GloVe(全局词向量嵌入)
  • net core mvc 数据绑定 《1》
  • 串匹配问题的三种算法
  • 卫星导航定位原理学习(三)
  • C语言malloc()函数与calloc()函数的区别
  • Unity 设计模式 之 行为型模式-【命令模式】【责任链模式】
  • 个人网站介绍和部署(开源)
  • HTML和CSS做一个无脚本的手风琴页面(保姆级)
  • 打开ffmpeg编码器的时候报错:avcodec_open2()返回-22
  • 数据结构之“队列”
  • Comfyui 学习笔记1
  • Java设计模式——工厂模式扩展
  • 算法打卡:第十一章 图论part02
  • 2024年Oceanbase考试认证的习题以及注意事项
  • 基于SpringBoot+Vue+MySQL的医院信息管理系统
  • 系统架构笔记-2-计算机系统基础知识
  • 数据处理与统计分析篇-day11-RFM模型案例