盒子
盒子
文章目录
  1. 前言 :
  2. 正文 :
    1. 修复 :

CVE-2011-0104

前言 :

又来还债来了,拖了好久了的。今天花了时间解决了一下,感觉要加快一下进度了,堆方面的东西又得花蛮久的了。而且撸了一眼指令,还是有点麻烦了的。得花时间了。

正文 :

关于office的漏洞。先把进程attach上去然后打开exploit的文件。查看程序崩溃在这里:

609054D2-18E6-4E8C-BEBE-731573707FD4

查看一下栈回溯,发现此处函数地址的入口处为:0x300ce252

在此处下断点,重新运行程序。

查看esp的内容,此处为该函数的返回地址。

D509E699-AC6C-4280-B5CA-47D2C5427259

返回地址:0x13aa90

在此处下内存访问断点。继续运行程序。发现程序断在了此处:

F890C68C-CE8C-4160-A746-FBD73E33D6F7

与此同时,esi所指向的字符串为:

818D1185-FF44-497C-869F-495269F33C23

这时候edi与ebp之间的偏移为:0x54,而所覆盖的字符串为0x300,远大于栈空间的大小,发生栈溢出。

再查看一下恶意文档的十六进制内容:

7656A29B-ECA6-4279-B47C-FF8F39049A25

发现刚好与位于偏移0x670地址处的内容一样。

栈回溯一下:

F8C40EA4-19E0-459C-9EF1-37D4A62CB5BA

查看调用情况:

BD42B46C-B6C5-45E0-A440-14123041AD86

0x306df0dc处调用了溢出函数。之后在此处下断点,然后查看一下该函数的参数:

AEBEBE88-A7E9-4A14-A723-44C115C8E989

三个参数依次为:0x13AA3B0x3000xFFFFEFE1

我们可以根据前面所出现到的ebp:0x13AA3B大致猜测一下该函数的具体功能:第一参数为复制的目的地址,第二参数为复制的字节数,第三个参数为最大复制字节数。

现在再来理清一下程序执行的思路:

经过反复查看调用,发现整个程序执行流程是这样的:

从最开始crash的函数入口开始:

3CD80AB0-40F5-4260-BD9F-67DD66B2AEC2

经跳转:

B4074B2A-54F4-4060-8CEA-329F201F98C4

后调用函数:

09C404BD-7971-4F8B-95AC-EAE9F42AAE82

后调用:

8C617EDB-9E5C-49CF-AB2D-D4CEDB355B24

后就进入了溢出地址了。进入溢出地址后跳转到了最开始crash函数崩溃的地址了,我们在崩溃地址前下一个断点,执行:

CC9F815A-0359-4EC8-A33E-CB286D15F862

eax的值为eax:0x51453844,ecx:0x00000006,此时的eax的地址是不存在的,所以会崩溃。因为poc样本是为2007所写的,2003并不适用,所以这里我们可以自己手动修改样本内容,达到shellcode的目的,此处我们可以抬高shellcode的位置,并把eax处的值修改为一个存在且可写的地址:

3A920164-EB80-4A9B-8B67-4FA6F3D9DE16

修改为如下:

09FFD748-AEFF-4E51-A419-CEAA811302A1

其中0x308d5d8b为内存中一处call esp的地址,所以能够成功执行shellcode。

7257B694-196A-442C-8EBE-B5365E1A0CC3

还有个后话,就是观察一下IDA中的伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
else if ( v90 == 167 )  ---->判断recode type是否为0xA7
{
v8 = (int)&v6[v5];
v9 = dword_30861CA0 < 5;
LOBYTE(v9) = dword_30861CA0 >= 5;
v92 = (unsigned int)&v6[v5];
LOWORD(v8) = *(_WORD *)(v6 + 1);
v77 = *(_WORD *)(v6 + 1);
v10 = 2 * v9 + 2;
v11 = (unsigned int)&v6[v10 * v77 + 3];
v87 = (char *)v8;
i = v6 + 3;
v91 = v10;
if ( (signed __int16)v8 > 0 )
{
while ( 1 )
{
--v87;
v12 = (int)i;
while ( 1 )
{
v13 = v88;
if ( dword_30861CA0 >= 5 )
{
v93 = *(_DWORD *)v12;
}
else
{
LOWORD(v93) = *(_BYTE *)v12;
HIWORD(v93) = *(_BYTE *)(v12 + 1);
}
if ( (_WORD)v93 )
break;
v12 += v91;
v14 = (signed __int16)v87--;
v88 = 1;
i = (char *)v12;
if ( !v14 )
{
v13 = v88;
break;
}
}
if ( HIWORD(v93) & 0x12F && v11 >= v92 )
{
v90 = sub_300CE402(); --->v90 = 0x3c
if ( v90 != 60 ) --->判断recode type是否0x3c
goto LABEL_182; ---->不跳转
v15 = sub_300CE402(); ----->返回复制字节0x300
v16 = v91 * v77;
v92 = v15;
v11 = (unsigned int)&v89[v91 * v77 + 3];
v17 = sub_300ADBAB();
sub_300CE380(v11, v92, (char *)(-3 - v16 + v17), *(int *)&v54); -------->漏洞函数!
if ( a5 && *((_DWORD *)off_308595A8 + 11) )
sub_30481AF7(v11, v92, 1);
v13 = v88;
v92 += v11;
}

Excel中的文件格式就不多说了,跟着上面所注释的地方可以看见两个格式类起着重要作用:TOOLBARDEF[0xA7]、CONTINUE[0x3C]。其中CONTINUE中的Len值0x300作为复制字节数。TOOLBARDEF中记录的Len值与cbtn字段控制着复制的目标地址。

修复 :

控制一下复制字节数即可。

支持一下
扫一扫,支持v1nke
  • 微信扫一扫
  • 支付宝扫一扫