CVE-2011-0104
2018.10.28
V1NKe
 热度
℃
前言 :
又来还债来了,拖了好久了的。今天花了时间解决了一下,感觉要加快一下进度了,堆方面的东西又得花蛮久的了。而且撸了一眼指令,还是有点麻烦了的。得花时间了。
正文 :
关于office的漏洞。先把进程attach上去然后打开exploit的文件。查看程序崩溃在这里:
查看一下栈回溯,发现此处函数地址的入口处为:0x300ce252
在此处下断点,重新运行程序。
查看esp的内容,此处为该函数的返回地址。
返回地址:0x13aa90
。
在此处下内存访问断点。继续运行程序。发现程序断在了此处:
与此同时,esi所指向的字符串为:
这时候edi与ebp之间的偏移为:0x54,而所覆盖的字符串为0x300,远大于栈空间的大小,发生栈溢出。
再查看一下恶意文档的十六进制内容:
发现刚好与位于偏移0x670
地址处的内容一样。
栈回溯一下:
查看调用情况:
0x306df0dc
处调用了溢出函数。之后在此处下断点,然后查看一下该函数的参数:
三个参数依次为:0x13AA3B
、0x300
、0xFFFFEFE1
。
我们可以根据前面所出现到的ebp:0x13AA3B
大致猜测一下该函数的具体功能:第一参数为复制的目的地址,第二参数为复制的字节数,第三个参数为最大复制字节数。
现在再来理清一下程序执行的思路:
经过反复查看调用,发现整个程序执行流程是这样的:
从最开始crash的函数入口开始:
经跳转:
后调用函数:
后调用:
后就进入了溢出地址了。进入溢出地址后跳转到了最开始crash函数崩溃的地址了,我们在崩溃地址前下一个断点,执行:
eax的值为eax:0x51453844
,ecx:0x00000006
,此时的eax的地址是不存在的,所以会崩溃。因为poc样本是为2007所写的,2003并不适用,所以这里我们可以自己手动修改样本内容,达到shellcode的目的,此处我们可以抬高shellcode的位置,并把eax处的值修改为一个存在且可写的地址:
修改为如下:
其中0x308d5d8b
为内存中一处call esp
的地址,所以能够成功执行shellcode。
还有个后话,就是观察一下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字段控制着复制的目标地址。
修复 :
控制一下复制字节数即可。