關於ms06-012的簡單分析

看到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,不過該異常不在棧內
經粗略分析,應該是命名區域的問題,下一步需要分析命名區域的格式
再作打算!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章