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 的分析到此结束,如有错误,欢迎指正

最新文章

  1. BZOJ1925[SDOI2010]地精部落
  2. java selenium (五) 元素定位大全
  3. Msyql-检测数据库版本
  4. iOS边练边学--iOS中的XML数据解析
  5. python 代码片段11
  6. js复习(一)
  7. 有趣的动画视图集合:Android View Animations
  8. php缓存相关
  9. hiveQL去重
  10. what is yaml ?
  11. Windows系统还原失败心得
  12. obj-c编程09:块的语法
  13. logistic 回归
  14. 面向对象___str__和__repr__
  15. Class实例在堆中还是方法区中?
  16. 洛谷P3959 宝藏
  17. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十七之铭文升级版
  18. T-SQL :TOP和OFFSET-FETCH筛选 (五)
  19. HTML的语义化和一些简单优化
  20. JDK JRE JVM的关系

热门文章

  1. 微服务分布式事务之LCN、TCC
  2. 数据库Redis(一)
  3. P2260 [清华集训2012]模积和 【整除分块】
  4. Codeforces 1015E1 Stars Drawing (Easy Edition)
  5. ASP.NET .Core 集成 React SPA 应用
  6. pwnable.kr第三题bof
  7. java例题_34 用指正对三个数排序
  8. java例题_05 判断分数等级
  9. Java单链表反转图文详解
  10. Golang 基于Prometheus Node_Exporter 开发自定义脚本监控