看到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,不过该异常不在栈内
经粗略分析,应该是命名区域的问题,下一步需要分析命名区域的格式
再作打算!