漏洞分析学习之cve-2012-0158
漏洞分析学习之cve-2012-0158
测试环境:
X | 推荐环境 | 备注 |
---|---|---|
操作系统 | win_xp_sp3 | 简体中文版 |
虚拟机 | vmware | 15.5 |
调试器 | Windbg | Windbg_x86 |
反汇编器 | IDA pro | 版本号:7.0 |
漏洞软件 | office | 版本号: 2007_pro |
office下载地址,ed2k
ed2k://|file|en_office_professional_2007_cd_X12-42316.iso|458766336|D2DA91160A98717D3BA6487A02C57880|/
激活码为:
D283T-87RKQ-XK79C-DQM94-VH7D8
序言
这个环境可真是折腾我好久,msdn i tell you开头下载很慢,放弃了,找了很多下载站,下下来的都运行不了执行弹计算器的,无奈,最后返回msdn i tell you下载的,
下完安装好后开始调试,同样,先进行基于poc的验证分析
基于poc的验证分析
这个poc直接用漏洞战争随书资料里的poc进行测试,附加运行后
很明显看到eip被改了,用kn看栈发觉栈被破坏的很严重,这里先补充一点知识windbg命令
dds dpsdqs
- dds 将4个字节视为一个符号,英文猜测是dump dword symbol
- dqs 将8个字节视为一个符号,英文猜测是dump qword symbol
- dps 根据处理器架构来选择
这里我们利用dps来看栈,因为此时esp是不会被破坏的,然后我们看下esp
这里可以看到有一个dll出现了,MSCOMCTL,我们通过ub查看此处的汇编代码
这里看到了一个call,我们记录下来
地址 | 指令 |
---|---|
275c8a05 | call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d) |
然后继续断下,回溯,基于栈回溯的漏洞分析方法,然后可以得到一张表
地址 | 指令 |
---|---|
275c8a05 | call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d) |
275c89c7 | push ebp |
这里注意的是还需要用一个指令
sxe ld:MSCOMCTL
这是在加载MSCOMCTL这个dll的时候断下,因为是动态加载的,没办法一开头下断,所以需要注意下,这里我们可以在275c8a05断下后跟进分析,第一次我先步过,查看结果
看到这里,栈已经被破坏掉了,他破坏的是外层结构的栈,
在看到这里的时候,我觉得就找到地点了,运行后,确实如此,这里ecx值偏大了导致溢出,ecx本身是0x8282,然后右移变为0x20a0
步过后
这里可以看到,上一层的栈结构已经被破坏了,没有必要在跟了
我们回溯法找到该函数开头
而275c89c7便是函数开头了,找到关键便可以进行源码分析了
源码分析
打开ida找到275c89c7
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; }
这里可以进行合理的猜测,毕竟没有函数名,lpMem为传入的字符串,而关键点便在
v4 = sub_275C876D((int)&v6 v2 COLLSTREAMHDR.cbSize);
这里很像 strncpy 也就是size太大导致,栈溢出
漏洞利用
知道漏洞成因,但现在还不知道漏洞如何利用,看下poc如何写的
在poc中搜索41414141
这里需要注意两个点,一个是返回地址,一个是复制长度,跟我分析的第一篇office的类似啊,那篇是rtf的,不过差不多,反正知道怎么利用就行,我们这里限制长度,然后进行利用就行了,然后接下来就是jmp esp了,具体利用就不在细说了,需要注意的是,这里有ret 8所以溢出点往后移动16位才是shellcode地址,跟上一篇一样,
这里分析下msf生成的exp吧,一样在call处下断,跟进去,追到复制部分,然后复制过后查看栈
看这里,外层的栈已经变成了jmp esp了,接下来就是执行shellcode了,至于构造部分,看我上一篇
漏洞分析学习之cve-2010-3333
利用截图
总结
- 至此,漏洞战争栈溢出部分算复现完了,还有一篇无法复现,由于找不到那个版本的office,所以暂时放弃
- 栈溢出在有了linux的pwn基础上,还是相对比较简单的,因为套路几乎都是一样的,只是seh部分攻击感觉比较新一点(just for me)
- 这次也终于利用上了 sxe ld:模块名,还测试得比较好
- 此篇参考文章较少,只有在栈回溯那会,不知道命令,查了下,dps命令
接下来要进入win的堆的学习了,相信会是一个很大的挑战
Windbg总结
sxe ld:模块名 在加载模块时候断下
dds dpsdqs
- dds 将4个字节视为一个符号,英文猜测是dump dword symbol
- dqs 将8个字节视为一个符号,英文猜测是dump qword symbol
- dps 根据处理器架构来选择
参考文章
cve-2012-0158两种poc分析