通过异常处理机制实现漏洞利用
字数 1863 2025-08-27 12:33:30

通过异常处理机制实现漏洞利用 - MS09-032漏洞分析与利用

0x1 MS09-032漏洞简介

MS09-032是微软DirectShow MPEG-2视频ActiveX控件中的远程代码执行漏洞,具体信息如下:

  • 微软编号:MS09-032
  • CVE编号:CVE-2008-0015
  • 补丁号:KB 973346
  • 受影响组件:msvidctl.dll(路径:C:\WINDOWS\system32\msvidctl.dll)
  • 漏洞类型:参数传递错误导致的S.E.H覆盖漏洞

漏洞原理:程序员将传入参数buff误写为&buff,导致数据被写入错误的内存位置,恰巧该位置附近存放着S.E.H异常处理函数指针,可通过覆盖S.E.H并结合Heap spray技术实现利用。

0x2 Windows异常处理机制

S.E.H(Structure Exception Handler)基本结构

S.E.H是Windows异常处理机制的重要数据结构,每个S.E.H包含:

  • 8字节大小(两个DWORD指针)
    • 第一个DWORD:Next S.E.H recoder(指向下一个S.E.H的指针)
    • 第二个DWORD:Exception handler(异常处理函数句柄)

S.E.H关键特性

  1. S.E.H结构体存放在系统栈中
  2. 线程初始化时自动安装一个S.E.H作为默认异常处理
  3. 栈中通常同时存在多个S.E.H
  4. 多个S.E.H通过链表指针在栈内形成单向链表(栈顶→栈底)
  5. 链表顶端的S.E.H通过T.E.B(线程环境块)0字节偏移处的指针标识
  6. 异常发生时,操作系统从T.E.B开始依次尝试异常处理函数
  7. 所有处理函数都失败时,系统使用默认异常处理函数(通常会弹出错误对话框并关闭程序)

0x3 实验环境准备

  • 操作系统:Windows XP SP3
  • 调试工具:
    • OllyDbg(OD)
    • IDA Pro
  • 浏览器:IE7
  • 漏洞文件:msvidctl.dll版本6.5.2600.5512

0x4 漏洞原理分析

POC代码分析

POC使用HTML页面触发漏洞,主要包含以下关键部分:

  1. Heap Spray技术实现

    var nop="\u9090\u9090"; 
    var shellcode="\u68fc\u0a6a\u1e38\u6368\ud189\u684f..."; // 弹窗shellcode
    
    // 生成1MB大小的nop滑板
    while(nop.length<=0x100000/2) { nop+=nop; }
    nop=nop.substring(0,0x100000/2-32/2-4/2-shellcode.length-2/2);
    
    // 创建200个内存片(约200MB)
    var slide = new Array();
    for(var i=0;i<200;i++) {
      slide[i] = nop + shellcode;
    }
    
  2. ActiveX控件触发

    var myObject=document.createElement('object');
    DivID.appendChild(myObject);
    myObject.width='1';
    myObject.height='1'; 
    myObject.data='./logo.gif'; // 加载畸形文件触发异常
    myObject.classid='clsid:0955AC62-BF2E-4CBA-A2B9-A63F772D46CF'; 
    

漏洞触发流程

  1. Heap Spray分配约200MB内存,覆盖0x0C0C0C0C地址处的数据
  2. 加载畸形MPEG-2文件触发异常
  3. 异常发生时,S.E.H的异常处理函数指针已被覆盖为0x0C0C0C0C
  4. 程序跳转到0x0C0C0C0C执行,该处已被nop指令覆盖
  5. EIP滑过nop后执行shellcode

关键漏洞点分析

通过调试发现:

  1. 异常发生在msvidctl.dll0x59F0D5A8地址处,指令为:

    cmp dword ptr [ebx+8], esi
    

    尝试读取无效内存地址ds:[00000028]导致异常

  2. 漏洞根源函数位于0x59F0D3BA,是一个递归函数

  3. 关键错误发生在0x59F0D74D处的ReadFile调用:

    • 本应传递[EBP+8](安全数组指针)
    • 实际传递了EBP+8(指针地址本身)
    • 导致数据被写入错误的内存位置(EBP+8而非[EBP+8]
  4. 错误写入位置距离最近的S.E.H句柄仅48字节(S.E.H位于0x01E0922C

畸形文件构造

要在MPEG-2文件数据部分的41-48字节处放置:

  • 0xFFFFFFFF(伪造Next S.E.H)
  • 0x0C0C0C0C(覆盖异常处理函数指针)

这样当异常触发时,程序会跳转到0x0C0C0C0C执行shellcode。

0x5 漏洞利用总结

  1. 利用条件

    • 通过Heap Spray占领内存
    • 构造特殊畸形文件
    • 触发异常处理流程
  2. 利用关键

    • 利用参数传递错误覆盖S.E.H
    • 精确控制覆盖位置和内容
    • 结合Heap Spray提高命中率
  3. 防护机制绕过

    • Vista/2008系统虽有保护机制,但漏洞仍然存在
    • 需要额外技术绕过保护执行shellcode

0x6 防御建议

  1. 及时安装微软安全补丁KB 973346
  2. 禁用或限制ActiveX控件执行
  3. 启用DEP(数据执行保护)等缓解措施
  4. 对浏览器进行安全加固,限制脚本执行权限

附录:相关技术术语

  • Heap Spray:一种内存分配技术,通过大量分配包含shellcode的内存块,增加攻击成功率
  • S.E.H:结构化异常处理,Windows处理程序错误的核心机制
  • ActiveX:微软的组件对象模型技术,允许网页嵌入可执行内容
  • DEP:数据执行保护,防止在非可执行内存区域执行代码的安全特性
通过异常处理机制实现漏洞利用 - MS09-032漏洞分析与利用 0x1 MS09-032漏洞简介 MS09-032是微软DirectShow MPEG-2视频ActiveX控件中的远程代码执行漏洞,具体信息如下: 微软编号:MS09-032 CVE编号:CVE-2008-0015 补丁号:KB 973346 受影响组件:msvidctl.dll(路径:C:\WINDOWS\system32\msvidctl.dll) 漏洞类型:参数传递错误导致的S.E.H覆盖漏洞 漏洞原理:程序员将传入参数 buff 误写为 &buff ,导致数据被写入错误的内存位置,恰巧该位置附近存放着S.E.H异常处理函数指针,可通过覆盖S.E.H并结合Heap spray技术实现利用。 0x2 Windows异常处理机制 S.E.H(Structure Exception Handler)基本结构 S.E.H是Windows异常处理机制的重要数据结构,每个S.E.H包含: 8字节大小(两个DWORD指针) 第一个DWORD:Next S.E.H recoder(指向下一个S.E.H的指针) 第二个DWORD:Exception handler(异常处理函数句柄) S.E.H关键特性 S.E.H结构体存放在系统栈中 线程初始化时自动安装一个S.E.H作为默认异常处理 栈中通常同时存在多个S.E.H 多个S.E.H通过链表指针在栈内形成单向链表(栈顶→栈底) 链表顶端的S.E.H通过T.E.B(线程环境块)0字节偏移处的指针标识 异常发生时,操作系统从T.E.B开始依次尝试异常处理函数 所有处理函数都失败时,系统使用默认异常处理函数(通常会弹出错误对话框并关闭程序) 0x3 实验环境准备 操作系统:Windows XP SP3 调试工具: OllyDbg(OD) IDA Pro 浏览器:IE7 漏洞文件:msvidctl.dll版本6.5.2600.5512 0x4 漏洞原理分析 POC代码分析 POC使用HTML页面触发漏洞,主要包含以下关键部分: Heap Spray技术实现 : ActiveX控件触发 : 漏洞触发流程 Heap Spray分配约200MB内存,覆盖0x0C0C0C0C地址处的数据 加载畸形MPEG-2文件触发异常 异常发生时,S.E.H的异常处理函数指针已被覆盖为0x0C0C0C0C 程序跳转到0x0C0C0C0C执行,该处已被nop指令覆盖 EIP滑过nop后执行shellcode 关键漏洞点分析 通过调试发现: 异常发生在 msvidctl.dll 的 0x59F0D5A8 地址处,指令为: 尝试读取无效内存地址 ds:[00000028] 导致异常 漏洞根源函数位于 0x59F0D3BA ,是一个递归函数 关键错误发生在 0x59F0D74D 处的 ReadFile 调用: 本应传递 [EBP+8] (安全数组指针) 实际传递了 EBP+8 (指针地址本身) 导致数据被写入错误的内存位置( EBP+8 而非 [EBP+8] ) 错误写入位置距离最近的S.E.H句柄仅48字节(S.E.H位于 0x01E0922C ) 畸形文件构造 要在MPEG-2文件数据部分的41-48字节处放置: 0xFFFFFFFF(伪造Next S.E.H) 0x0C0C0C0C(覆盖异常处理函数指针) 这样当异常触发时,程序会跳转到0x0C0C0C0C执行shellcode。 0x5 漏洞利用总结 利用条件 : 通过Heap Spray占领内存 构造特殊畸形文件 触发异常处理流程 利用关键 : 利用参数传递错误覆盖S.E.H 精确控制覆盖位置和内容 结合Heap Spray提高命中率 防护机制绕过 : Vista/2008系统虽有保护机制,但漏洞仍然存在 需要额外技术绕过保护执行shellcode 0x6 防御建议 及时安装微软安全补丁KB 973346 禁用或限制ActiveX控件执行 启用DEP(数据执行保护)等缓解措施 对浏览器进行安全加固,限制脚本执行权限 附录:相关技术术语 Heap Spray :一种内存分配技术,通过大量分配包含shellcode的内存块,增加攻击成功率 S.E.H :结构化异常处理,Windows处理程序错误的核心机制 ActiveX :微软的组件对象模型技术,允许网页嵌入可执行内容 DEP :数据执行保护,防止在非可执行内存区域执行代码的安全特性