• CVE-2010-3974:Windows 传真封面编辑器 FxsCover.exe 双重释放漏洞调试分析


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

  • 相关阅读:
    【Coursera】Third Week(2)
    【TCP/IP详解 卷一:协议】第二章:链路层
    【Coursera】Third Week(1)
    【Coursera】SecondWeek(2)
    【Coursera】SecondWeek(1)
    【Coursera】History: Dawn of Electronic Computing学后小结
    【TCP/IP详解 卷一:协议】第一章概论 学习笔记
    NS3 fifth.cc 拥塞窗口实例
    NS3 利用Gnuplot生成拥塞窗口例子fifth.cc的png图像
    C++小结:迟到的小结和重新起航的故事
  • 原文地址:https://www.cnblogs.com/csnd/p/11800520.html
Copyright © 2020-2023  润新知