zoukankan      html  css  js  c++  java
  • 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,从而达到了防止堆溢出的目的
    • 参考资料:0day安全:软件漏洞分析技术 + 漏洞战争

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

  • 相关阅读:
    spring boot 启动后执行初始化方法
    Linux CentOS 7 下 JDK 安装与配置
    Linux rpm 命令参数使用详解[介绍和应用]
    异常处理: 重载Throwable.fillInStackTrace方法已提高Java性能
    dubbo 配置属性
    centos7 操作防火墙
    springBoot 打包 dubbo jar包
    直播中聊天场景的用例分享
    解决在安装Fiddler4.6版本后,在手机上安装证书出现的问题解决方法
    系统调优方案思路分享
  • 原文地址:https://www.cnblogs.com/csnd/p/11800532.html
Copyright © 2011-2022 走看看