关于ms06-012的简单分析

来源:互联网 发布:unity3d屠夫钩子 编辑:程序博客网 时间:2024/05/18 10:35

看到xfocus上新贴了microsoft office excel 缓冲区溢出漏洞

就想自己分析一下其原理,可惜没有搞定,只是明白了其大概

分析过程如下

第一
EXCEl每打开一个.xls文件时都会执行如下代码,准备开辟一块缓冲区,
缓冲区的大小应该是固定的,具体情况要根据函数被调用的上下文决定。
3003FCAC <EXCEL.tab1-1>         movzx eax,word ptr ds:[ebx]
3003FCAF                        xor ecx,ecx
3003FCB1                        cmp eax,0E
3003FCB4                        mov dword ptr ss:[ebp-8],ecx
3003FCB7                        jg <EXCEL.tab1-2>

第二
缓冲区的长度存储在ds:[ebx]处,取该值放于eax中,只有该值大于14时,
才对缓冲区初始化。

第三
缓冲区的起始地址是ss:[ebp-130],因为用ebp作索引,肯定在栈中。
301BFF47 <EXCEL.tab1-2>         mov byte ptr ss:[ebp+ecx-130],cl
301BFF4E                        inc ecx
301BFF4F                        cmp ecx,0E
301BFF52                        jle short <EXCEL.tab1-2>

第四
缓冲区的前15个字节初始化如下
000102030405060708090A0B0C0D0E

第五
缓冲区的剩余部分(eax-15字节),也就是从地址ss:[ebp+15-130]开始,
以4个字节为单位,用0E0E0E0E初始化。
301BFF54                        cmp ecx,eax
301BFF56                        mov dword ptr ss:[ebp-8],ecx
301BFF59                        jg EXCEL.3003FE14
301BFF5F                        sub eax,ecx
301BFF61                        lea edi,dword ptr ss:[ebp+ecx-130]
301BFF68                        inc eax
301BFF69                        mov edx,eax
301BFF6B                        mov eax,0E0E0E0E
301BFF70                        mov ecx,edx
301BFF72                        mov esi,ecx
301BFF74                        shr ecx,2
301BFF77                        rep stos dword ptr es:[edi]//该处存在缓冲区溢出的可能

第六
剩余部分的计算方法是
eax-15+1--->二进制右移2位(除以4)--->得的值乘以4(单位byte)

第七
考虑溢出的原因?
缓冲区的大小是固定的(eax的值),
缓冲区的初始化是分两部分完成的15bytes+在上文第六点中得出的结果。
如果初始化的长度大于缓冲区的固定大小,就导致栈缓冲区溢出了。
举一个例子,eax=46
46-15+1=32
32的二进制表示是100000,右移2位1000,即8
8*4+15=47>46这样就缓冲区溢出了。

第八
是谁导致了溢出?
有两点值得怀疑,
一是eax的初始值,如果该值错了,肯定有缓冲区溢出的可能;
二是上文第六点中计算剩余部分的算法有问题,正如第七点中的例子所示。

第九
调试的问题?
ollydbg + microsoft excel 2000 + test.xls
该溢出只有在特殊的.xls文件作用下才会触发,
对于一般的.xls文件,eax的值是0E,根本就走不到溢出点
要想利用该漏洞,有两种办法
一是,找到或者构造特殊的.xls文件,进一步跟踪调试,
这种方式是最方便的;
二是,分析eax值得来源,从代码看,就是反向追溯和正向跟踪,
从原理上找到原因。

第十
进一步的思考
这个漏洞是与.xls文件相关的,并且必须是精心构造的.xls文件
其中eax值应该与.xls文件的某个属性有关。
为此,我查看了.xls的文件格式BIFF,其中有一种记录类型PRECISION,
它的操作码是0E,或许和这个漏洞有一定的关系。

第十一
下一步的工作量就很大了,我短时间内很难搞定。

第十二
看到有些网站有如下描述:

如果能够通过Excel .xls文件的数据字段向"msvcrt.memmove()"传送很大的值的话,
就可能导致内存破坏,执行任意代码。

然后构造很大的数据字段,并定位到msvcrt.memmove(),却没有截获到异常:(

又看到另一则描述:

Overview:
=========
A vulnerability exists in Microsoft Excel which can be exploited to run
a code of attacker's choice on user's PC.

Affected products:
==================
All tests were performed using Microsoft Excel 2003 (11.6560.6568) on
Windows XP and Windows 2000 Pro platforms. It is likely that all MS Excel
products are vulnerable.

Cause and Effect:
=================
Sufficient data validation is not performed when parsing "Named Range"
definitions in the document file, which makes possible to produce a negative
32-bit value that is later used as a length parameter for msvcrt.memmove()
function. As a result, a large chunk of memory is copied overwriting
critical memory ranges, including the stack space.

Demonstration:
==============
Below is a fragment of the empty XLS file containing a named range definition
"Sheet1!TEST1". Two bytes marked with asterisks cause exception to occur
when set to 0xFF.

00000720  00 80 00 ff 93 02 04 00  14 80 05 ff 60 01 02 00  |............`...|
00000730  00 00 85 00 0e 00 ba 05  00 00 00 00 06 00 53 68  |..............Sh|
00000740  65 65 74 31 8c 00 04 00  01 00 01 00 ae 01 04 00  |eet1............|
00000750  01 00 01 04 17 00 08 00  01 00 00 00 00 00 00 00  |................|
00000760  18 00 1b 00 00 00 00 05  07 ** ** 00 00 00 00 00  |................|
00000770  00 00 00 54 45 53 54 31  3a 00 00 00 00 00 00 c1  |...TEST1:.......|
00000780  01 08 00 c1 01 00 00 22  be 01 00 fc 00 08 00 00  |......."........|
00000790  00 00 00 00 00 00 00 ff  00 02 00 08 00 63 08 15  |.............c..|

仿照上面的方法也构造了一个test.xls文件,类似的fragment如下
00000870h: 93 02 04 00 14 80 06 FF 60 01 02 00 01 00 85 00 ; ?...€.`.....?
00000880h: 0E 00 ED 06 00 00 00 00 06 00 53 68 65 65 74 31 ; ..?......Sheet1
00000890h: 8C 00 04 00 56 00 56 00 AE 01 04 00 01 00 01 04 ; ?..V.V.?......
000008a0h: 17 00 08 00 01 00 00 00 00 00 00 00 18 00 1B 00 ; ................
000008b0h: 00 00 00 05 07 ** ** 00 00 00 00 00 00 00 00 74 ; .............t
000008c0h: 65 73 74 31 3A 00 00 00 00 00 00 C1 01 08 00 C1 ; est1:......?..?

000008d0h: 01 00 00 80 38 01 00 FC 00 08 00 00 00 00 00 00 ; ...€8..?.......
000008e0h: 00 00 00 FF 00 02 00 08 00 0A 00 00 00 09 08 10 ; ...............

结果跟踪到异常,出现在excel.memmove()处
异常的原因是memmove的第三个参数为负值
在上例中n=FFFFFF07(-249),异常语句是308D0168,不过该异常不在栈内
经粗略分析,应该是命名区域的问题,下一步需要分析命名区域的格式
再作打算!