漏洞分析学习之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的验证分析
-
使用Windbg附加Office进程运行PoC
-
观察到EIP被修改,栈被严重破坏
-
使用Windbg命令分析栈状态:
dds: 将4个字节视为一个符号(dump dword symbol)dqs: 将8个字节视为一个符号(dump qword symbol)dps: 根据处理器架构选择
-
关键调用栈回溯:
275c8a05 call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d) 275c89c7 push ebp -
使用
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 利用要点
- 控制返回地址
- 控制复制长度
- 由于存在
ret 8指令,shellcode地址需要放在溢出点后16字节处
4.2 利用步骤
- 构造恶意文档,包含超长的
cbSize值 - 覆盖返回地址为
jmp esp指令地址 - 在适当位置放置shellcode
- 利用栈溢出跳转到shellcode执行
4.3 利用截图
成功执行计算器的截图(见原文)
5. Windbg调试技巧总结
-
模块加载断点:
sxe ld:模块名 -
栈分析命令:
dds: 将4个字节视为一个符号dqs: 将8个字节视为一个符号dps: 根据处理器架构选择
-
回溯分析:
- 使用
kn查看调用栈 - 使用
ub查看前序指令
- 使用
6. 总结
- 该漏洞是典型的栈缓冲区溢出漏洞
- 利用方式与CVE-2010-3333类似
- 栈溢出在有了Linux pwn基础后相对容易理解
- SEH攻击方式相对新颖
- 下一步可研究Windows堆漏洞