CVE-2013-0077:Microsoft DirectShow quartz.dll m2p 文件堆溢出漏洞简单分析

0x01 前言

  • 2012 年 10 月 5 日,exploit-db 漏洞公布站点上发布了 QQplayer.exe 3.7.892 m2p quartz.dll Heap Pointer OverWrite PoC,后被人提交至乌云。这个漏洞与 QQplayer.exe 没有任何关系,而是系统的 quartz.dll 在解析 .m2p 文件头时没有限制复制数据的大小,导致复制的数据超出了申请的栈空间
  • 调试所用到的 POC 和 QQplayer.exe 文件:CVE-2013-0077.zip(提取码:svor)

0x02 简单分析

  • 开启堆页保护,打开 QQplayer.exe 使用 windbg 附加进程,运行之后将 PoC 拖入 QQplayer 引发异常
    在这里插入图片描述
  • 出问题的 rep 指令,有经验的可以看出问题出在 quartz.dll 中
    在这里插入图片描述
  • 断下这个断点,重新运行至断点处,并且查询 edi 和 esi 的值,执行完 rep 指令之后,会将 0x26c88f38 地址的值循环复制到 0x270e0f64中,每次复制 4 个字节
    在这里插入图片描述
  • 查看 ecx 的值,可以发现复制的次数为,0x30 次,所以复制的字符串长度为 0x30 * 4 = 0xC0
    在这里插入图片描述
  • 对比样本中的数据,发现 ba 之后全是填充的 A 字符
    在这里插入图片描述
  • 下面通过对比 rep 指令执行前后来计算堆块可用空间的大小
  • 触发堆页保护异常前,edi 指向的地址
    在这里插入图片描述
  • 触发堆页保护异常时,edi 指向的地址
    -
  • 所以该堆块空间的最大容量为 0x9C,而复制的时候字符串的大小为 0xC0,超出了 0x24 个字节,导致堆溢出
    在这里插入图片描述
  • 这个就是 IDA 反汇编出来的伪 C 代码
  • a1 由参数传入,其值为 rep 指令中的 esi 指向的地址;a2 为复制的大小,并且没有做过滤
    在这里插入图片描述
  • 至于利用的话可以覆盖堆栈的 HEAP_FREE_ENTRY 结构,操纵虚表指针的方式来执行任意代码
  • 漏洞修复的话只需要限制 a2 的大小即可,微软在颁布补丁的时候限制了 a2 的大小不得超过 8c,从而达到了防止栈溢出的目的

以上就是 CVE-2013-0077 的简单分析,如有错误,欢迎指正

猜你喜欢

转载自blog.csdn.net/qq_38924942/article/details/88078851