CVE-2010-3974:Windows 传真封面编辑器 FxsCover.exe 双重释放漏洞调试分析
2024-09-08 03:03:01
0x01 堆空间申请后的双重释放
- Windows FxsCover 程序存储封面编辑器的信息,封面编辑器是传真服务的一个组件,通过解析特定的传真封面文件(.cov)时,会调用类析构函数对同一内存中的栈空间进行第二次释放,从而导致了双重释放的漏洞,所以本质也是 UAF 漏洞的一种
- 实验环境:Windows 7 + FxsCover.exe + Poc.cov(提取码:hdnr)
0x02 使用 Windbg + IDA 进行调试分析
- 打开传真封面编辑器,使用 Windbg 附加进程后拖入 Poc.cov,之后断在了如下位置
- 之所以断在了 RtlReportCriticalFailure 中,原因是由于临界区发生故障
- 顺手检查此时的堆栈情况,从调用情况可以看出由 CDrawDoc 类中的 Remove 函数调用了 CDrawRoundRect 类的析构函数,之后由析构函数调用 free 来释放 CDrawRoundRect 类中的资源;由于因为异常断了下来,所以肯定是 free 函数二次释放堆空间的结果
- 为了看的更明白,直接利用 IDA 载入之后看静态反汇编结果,由于没有开启系统的 ASLR,所以通过地址就可以很容易的找到 Remove 函数的地址,调用 Remove 函数之前传递了一个 struct CDrawObj 的结构体,当中保存着需要释放资源的对象
- 之后进入 Remove 函数,再如下位置发现析构函数的调用信息,push 1 说明释放的是单个对象,如果是 push 3 就说明释放的是对象数组,ecx 保存着释放对象的地址,由上面的栈信息分析需要出释放资源的对象是 CDrawRoundRect,最后调用了 CDrawRoundRect 类的析构函数进行释放资源的操作
- 直到了漏洞的原理,下面只需要找到需要释放堆空间信息即可,重新使用 windbg 载入 FxsCover.exe,拖入 Poc 样本后断在了和刚刚一样位置,这时可以不用理会,按 F5 继续运行,直到发生堆栈释放异常为止,如图所以断在触发异常的地方,查询一下 ecx 的地址,发现所在的内存空间已经变为了 MEM_FREE 状态,表示已经是释放过了
0x03 漏洞利用
- 对于双重释放的漏洞理论上利用起来还是很简单的,通过覆盖将要被二次释放的堆空间的虚表指针,这样就可以控制 call 的地址执行 shellcode 恶意代码;但是通过什么样的方法才能精确的覆盖,这就非常复杂了,需要视具体情况而定
- 参考资料:0day安全:软件漏洞分析技术 + 漏洞战争
CVE-2010-3974 的分析到此结束,如有错误,欢迎指正
最新文章
- BZOJ1925[SDOI2010]地精部落
- java selenium (五) 元素定位大全
- Msyql-检测数据库版本
- iOS边练边学--iOS中的XML数据解析
- python 代码片段11
- js复习(一)
- 有趣的动画视图集合:Android View Animations
- php缓存相关
- hiveQL去重
- what is yaml ?
- Windows系统还原失败心得
- obj-c编程09:块的语法
- logistic 回归
- 面向对象___str__和__repr__
- Class实例在堆中还是方法区中?
- 洛谷P3959 宝藏
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十七之铭文升级版
- T-SQL :TOP和OFFSET-FETCH筛选 (五)
- HTML的语义化和一些简单优化
- JDK JRE JVM的关系
热门文章
- 微服务分布式事务之LCN、TCC
- 数据库Redis(一)
- P2260 [清华集训2012]模积和 【整除分块】
- Codeforces 1015E1 Stars Drawing (Easy Edition)
- ASP.NET .Core 集成 React SPA 应用
- pwnable.kr第三题bof
- java例题_34 用指正对三个数排序
- java例题_05 判断分数等级
- Java单链表反转图文详解
- Golang 基于Prometheus Node_Exporter 开发自定义脚本监控