记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

漏洞分析学习之cve-2012-0158

2020-03-31 10:58

漏洞分析学习之cve-2012-0158

测试环境:

X推荐环境备注
操作系统win_xp_sp3简体中文版
虚拟机vmware15.5
调试器WindbgWindbg_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, dps,dqs

  • dds 将4个字节视为一个符号,英文猜测是dump dword symbol
  • dqs 将8个字节视为一个符号,英文猜测是dump qword symbol
  • dps 根据处理器架构来选择

这里我们利用dps来看栈,因为此时esp是不会被破坏的,然后我们看下esp

这里可以看到有一个dll出现了,MSCOMCTL,我们通过ub查看此处的汇编代码

这里看到了一个call,我们记录下来

地址指令
275c8a05call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)

然后继续断下,回溯,基于栈回溯的漏洞分析方法,然后可以得到一张表

地址指令
275c8a05call MSCOMCTL!DllGetClassObject+0x41a29 (275c876d)
275c89c7push 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

利用截图

总结

  1. 至此,漏洞战争栈溢出部分算复现完了,还有一篇无法复现,由于找不到那个版本的office,所以暂时放弃
  2. 栈溢出在有了linux的pwn基础上,还是相对比较简单的,因为套路几乎都是一样的,只是seh部分攻击感觉比较新一点(just for me)
  3. 这次也终于利用上了 sxe ld:模块名,还测试得比较好
  4. 此篇参考文章较少,只有在栈回溯那会,不知道命令,查了下,dps命令

接下来要进入win的堆的学习了,相信会是一个很大的挑战

Windbg总结

sxe ld:模块名 在加载模块时候断下

dds, dps,dqs

  • dds 将4个字节视为一个符号,英文猜测是dump dword symbol
  • dqs 将8个字节视为一个符号,英文猜测是dump qword symbol
  • dps 根据处理器架构来选择

参考文章

cve-2012-0158两种poc分析


知识来源: xz.aliyun.com/t/7464

阅读:70241 | 评论:0 | 标签:漏洞 学习 CVE

想收藏或者和大家分享这篇好文章→复制链接地址

“漏洞分析学习之cve-2012-0158”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

❤人人都能成为掌握黑客技术的英雄❤

ADS

标签云

本页关键词