漏洞分析学习之cve-2012-0158
字数 1099 2025-08-25 22:58:20

CVE-2012-0158漏洞分析与利用教学文档

1. 漏洞概述

CVE-2012-0158是Microsoft Office中的一个栈缓冲区溢出漏洞,存在于MSCOMCTL.OCX控件中。该漏洞允许攻击者通过特制的Office文档执行任意代码。

2. 测试环境配置

组件 版本/说明
操作系统 Windows XP SP3 简体中文版
虚拟机 VMware 15.5
调试器 Windbg x86
反汇编器 IDA Pro 7.0
漏洞软件 Office 2007 Professional

Office下载地址

ed2k://|file|en_office_professional_2007_cd_X12-42316.iso|458766336|D2DA91160A98717D3BA6487A02C57880|/

激活码

D283T-87RKQ-XK79C-DQM94-VH7D8

3. 漏洞分析

3.1 基于PoC的验证分析

  1. 使用Windbg附加Office进程运行PoC

  2. 观察到EIP被修改,栈被严重破坏

  3. 使用Windbg命令分析栈状态:

    • dds: 将4个字节视为一个符号(dump dword symbol)
    • dqs: 将8个字节视为一个符号(dump qword symbol)
    • dps: 根据处理器架构选择
  4. 关键调用栈回溯:

    275c8a05 call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)
    275c89c7 push ebp
    
  5. 使用sxe ld:MSCOMCTL命令在加载MSCOMCTL模块时断下

3.2 关键函数分析

IDA反汇编关键函数:

int __stdcall sub_275C89C7(int a1, BSTR lpMem)
{
  BSTR v2; // ebx
  int result; // eax
  int v4; // esi
  COLLSTREAMHDR COLLSTREAMHDR; // [esp+Ch] [ebp-14h]
  int v6; // [esp+18h] [ebp-8h]
  int v7; // [esp+1Ch] [ebp-4h]

  v2 = lpMem;
  result = sub_275C876D((int)&COLLSTREAMHDR, lpMem, 0xCu);
  if ( result >= 0 )
  {
    if ( COLLSTREAMHDR.dwMagic == 0x6A626F43 && COLLSTREAMHDR.cbSize >= 8 )
    {
      v4 = sub_275C876D((int)&v6, v2, COLLSTREAMHDR.cbSize);
      if ( v4 >= 0 )
      {
        if ( !v6 )
          goto LABEL_8;
        lpMem = 0;
        v4 = sub_275C8A59((UINT)&lpMem, (int)v2);
        if ( v4 >= 0 )
        {
          sub_27585BE7(lpMem);
          SysFreeString(lpMem);
LABEL_8:
          if ( v7 )
            v4 = sub_275C8B2B(a1 + 20, v2);
          return v4;
        }
      }
      return v4;
    }
    result = -2147418113;
  }
  return result;
}

3.3 漏洞成因

漏洞位于sub_275C876D函数调用处:

v4 = sub_275C876D((int)&v6, v2, COLLSTREAMHDR.cbSize);

该函数类似于strncpy,但由于COLLSTREAMHDR.cbSize值过大(0x8282右移后变为0x20a0),导致栈缓冲区溢出。

4. 漏洞利用

4.1 利用要点

  1. 控制返回地址
  2. 控制复制长度
  3. 由于存在ret 8指令,shellcode地址需要放在溢出点后16字节处

4.2 利用步骤

  1. 构造恶意文档,包含超长的cbSize
  2. 覆盖返回地址为jmp esp指令地址
  3. 在适当位置放置shellcode
  4. 利用栈溢出跳转到shellcode执行

4.3 利用截图

成功执行计算器的截图(见原文)

5. Windbg调试技巧总结

  1. 模块加载断点

    sxe ld:模块名
    
  2. 栈分析命令

    • dds: 将4个字节视为一个符号
    • dqs: 将8个字节视为一个符号
    • dps: 根据处理器架构选择
  3. 回溯分析

    • 使用kn查看调用栈
    • 使用ub查看前序指令

6. 总结

  1. 该漏洞是典型的栈缓冲区溢出漏洞
  2. 利用方式与CVE-2010-3333类似
  3. 栈溢出在有了Linux pwn基础后相对容易理解
  4. SEH攻击方式相对新颖
  5. 下一步可研究Windows堆漏洞

7. 参考文章

  1. cve-2012-0158两种poc分析
CVE-2012-0158漏洞分析与利用教学文档 1. 漏洞概述 CVE-2012-0158是Microsoft Office中的一个栈缓冲区溢出漏洞,存在于MSCOMCTL.OCX控件中。该漏洞允许攻击者通过特制的Office文档执行任意代码。 2. 测试环境配置 | 组件 | 版本/说明 | |------|-----------| | 操作系统 | Windows XP SP3 简体中文版 | | 虚拟机 | VMware 15.5 | | 调试器 | Windbg x86 | | 反汇编器 | IDA Pro 7.0 | | 漏洞软件 | Office 2007 Professional | Office下载地址 : 激活码 : 3. 漏洞分析 3.1 基于PoC的验证分析 使用Windbg附加Office进程运行PoC 观察到EIP被修改,栈被严重破坏 使用Windbg命令分析栈状态: dds : 将4个字节视为一个符号(dump dword symbol) dqs : 将8个字节视为一个符号(dump qword symbol) dps : 根据处理器架构选择 关键调用栈回溯: 使用 sxe ld:MSCOMCTL 命令在加载MSCOMCTL模块时断下 3.2 关键函数分析 IDA反汇编关键函数: 3.3 漏洞成因 漏洞位于 sub_275C876D 函数调用处: 该函数类似于 strncpy ,但由于 COLLSTREAMHDR.cbSize 值过大(0x8282右移后变为0x20a0),导致栈缓冲区溢出。 4. 漏洞利用 4.1 利用要点 控制返回地址 控制复制长度 由于存在 ret 8 指令,shellcode地址需要放在溢出点后16字节处 4.2 利用步骤 构造恶意文档,包含超长的 cbSize 值 覆盖返回地址为 jmp esp 指令地址 在适当位置放置shellcode 利用栈溢出跳转到shellcode执行 4.3 利用截图 成功执行计算器的截图(见原文) 5. Windbg调试技巧总结 模块加载断点 : 栈分析命令 : dds : 将4个字节视为一个符号 dqs : 将8个字节视为一个符号 dps : 根据处理器架构选择 回溯分析 : 使用 kn 查看调用栈 使用 ub 查看前序指令 6. 总结 该漏洞是典型的栈缓冲区溢出漏洞 利用方式与CVE-2010-3333类似 栈溢出在有了Linux pwn基础后相对容易理解 SEH攻击方式相对新颖 下一步可研究Windows堆漏洞 7. 参考文章 cve-2012-0158两种poc分析