CVE-2011-0104 Microsoft Office Excel緩衝區溢位漏洞 分析

Ox9A82發表於2016-07-28

    漏洞簡述

     Microsoft Excel是Microsoft Office元件之一,是流行的電子表格處理軟體。
        Microsoft Excel中存在緩衝區溢位漏洞,遠端攻擊者可利用此漏洞以當前使用者許可權執行任意程式碼,造成拒絕服務。Microsoft Office Excel處理特製Excel檔案的方式中存在一個遠端程式碼執行漏洞。成功利用此漏洞的攻擊者便可完全控制受影響的系統。攻擊者可隨後安裝程式;檢視、更 改或刪除資料;或者建立擁有完全使用者許可權的新帳戶。

    同樣是用泉哥的poc去調的,開啟poc,EXCEL退出,說明漏洞正常觸發。本來第一次是用那個exp去調的,結果應該是我的excel版本有問題,導致exp執行到一個很奇怪的地方,棧什麼的通通被破壞了,感覺無從下手,除非抓出來檔案中的shellcode程式碼,從shellcode入手才行,所以這裡就改用poc來調了。用windbg掛載excel開啟poc崩潰資訊如下所示,可以看到是被9090給填滿了。我們的目的是找到溢位棧的語句,即關鍵語句,那麼首先我們得搞清楚棧是誰的棧?

(b50.900): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=90909090 ebx=0013ca60 ecx=00000006 edx=01155000 esi=00000000 edi=00000400
eip=300e9eda esp=0013aa1c ebp=0013aa88 iopl=0         nv up ei ng nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010286
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for Excel.EXE - 
Excel!Ordinal41+0xe9eda:
300e9eda 8908            mov     dword ptr [eax],ecx  ds:0023:90909090=????????

執行dc esp;dc ebp ,結果如下。可以看這條語句所處的棧保護棧下的空間已經被90給完全覆蓋了,這說明就是Excel!Ordinal41+0xe9eda這條語句所處的函式的棧發生了溢位。為什麼一定要揪出是哪個函式的棧呢?因為只有知道是哪個函式的棧才可以像泉哥說的那樣去對棧底下寫入斷點。
為了確認,我們可以看下棧回溯但是估計棧被搞成這樣子估計是不行了。執行kp,結果如下,果然不行了。

0:000> kp
ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
0013aa88 90909090 Excel!Ordinal41+0xe9eda
0013aa8c 90909090 0x90909090
0013aa90 90909090 0x90909090
0013aa94 90909090 0x90909090
0013aa98 90909090 0x90909090
0013aa9c 90909090 0x90909090
0013aaa0 90909090 0x90909090
0013aaa4 90909090 0x90909090
0013aaa8 90909090 0x90909090
0013aaac 90909090 0x90909090
0013aab0 90909090 0x90909090
0013aab4 90909090 0x90909090
0013aab8 90909090 0x90909090
0013aabc 90909090 0x90909090
0013aac0 90909090 0x90909090
0013aac4 90909090 0x90909090
0013aac8 90909090 0x90909090
0013aacc 90909090 0x90909090
0013aad0 90909090 0x90909090
0013aad4 90909090 0x90909090

我們用ida開啟excel.exe,定位到Excel!Ordinal41+0xe9eda語句,然後發現是屬於sub_300E9D90的,對300E9D90下斷,重新執行程式,斷到300E9D90時對棧底下斷點,關於棧底有幾個基本的知識,比如ebp+4是返回地址ebp+8是第一個參,這個是常識。我們對ebp+4下寫入斷點,繼續執行發現可以斷到類memcpy函式。如下所示,這裡注意下,等棧幀建立好了再去對ebp+4下斷。之前就是忘了這個,還在一臉懵逼的想怎麼沒斷下來。

Breakpoint 0 hit
eax=0013ae10 ebx=00000000 ecx=76ab6048 edx=00000000 esi=00000001 edi=0013ca60
eip=300e9d90 esp=0013aa8c ebp=0013ad9c iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
Excel!Ordinal41+0xe9d90:
300e9d90 55              push    ebp
0:000> p
eax=0013ae10 ebx=00000000 ecx=76ab6048 edx=00000000 esi=00000001 edi=0013ca60
eip=300e9d91 esp=0013aa88 ebp=0013ad9c iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
Excel!Ordinal41+0xe9d91:
300e9d91 8bec            mov     ebp,esp
0:000> p
eax=0013ae10 ebx=00000000 ecx=76ab6048 edx=00000000 esi=00000001 edi=0013ca60
eip=300e9d93 esp=0013aa88 ebp=0013aa88 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
Excel!Ordinal41+0xe9d93:
300e9d93 83ec60          sub     esp,60h
0:000> ba w 1 ebp+4
0:000> g
Breakpoint 1 hit
eax=00000300 ebx=00000300 ecx=000000a0 edx=00000300 esi=3088fc20 edi=0013aaa7
eip=300e9d60 esp=001379c8 ebp=0013aa27 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
Excel!Ordinal41+0xe9d60:
300e9d60 f3a5            rep movs dword ptr es:[edi],dword ptr [esi] es:0023:0013aaa7=4a5f7800 ds:0023:3088fc20=90909090

可以看到300e9d60就是我們要的複製語句了,我們對300e9d60下斷重新執行,發現ecx變了。說明這裡是一個子函式,而且這個子函式被呼叫過多次。我們對這個語句下一個條件記錄斷點來看一下到底這個函式是怎麼被呼叫的。使用語句bu Excel!Ordinal41+0xe9d5e "r ecx;gc"來記錄複製語句到底是怎麼被呼叫的。重新執行,結果如下。可以看到總共被呼叫了2次。第一次是1,第二次是0xc0,用屁股想一想也知道1肯定不會溢位。

0:000> g
ecx=00000001
ecx=000000c0
(9e4.ae0): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=90909090 ebx=0013ca60 ecx=00000006 edx=01155000 esi=00000000 edi=00000400
eip=300e9eda esp=0013aa1c ebp=0013aa88 iopl=0         nv up ei ng nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010286
Excel!Ordinal41+0xe9eda:
300e9eda 8908            mov     dword ptr [eax],ecx  ds:0023:90909090=????????

於是在第二次執行到這裡時斷下。kp一下看棧回溯,結果發現很有問題。。如下

0:000> kp
ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
0013aa27 13aa88b6 Excel!Ordinal41+0xe9d5e
0013aa2b a7cfe000 0x13aa88b6
0013aa2f 13ca6006 0xa7cfe000
0013aa33 00000000 0x13ca6006

 0x13aa88b6這個地址明顯是有問題,我們對retn    0Ch下斷,發現要返回時,返回地址變了=。=,如下所示。。。

0:000> g
Breakpoint 1 hit
eax=00000300 ebx=000000ff ecx=00000000 edx=00000320 esi=0013aa27 edi=0000303c
eip=300e9d8d esp=001379d8 ebp=00139ac4 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
Excel!Ordinal41+0xe9d8d:
300e9d8d c20c00          ret     0Ch
0:000> dd esp l1
001379d8  3070e44e

我們對這個函式下記錄斷點,如下,0x300=4*0xc0。而0013aa27就是複製的目的地址。

0:000> bu Excel!Ordinal41+0xe9d18 "dc esp l3;gc"
001379d8  3070e31a 001379e8 00000004           ..p0.y......
001379d8  3070e44e 0013aa27 00000300           N.p0'.......

 由此我們來看一下程式的流程,如下圖

call    sub_300E9CF1    ; 計算要複製的大小
mov     edi, [ebp+0F3Ch+var_F08]
imul    edi, [ebp+0F3Ch+var_ECC]
mov     [ebp+0F3Ch+var_EC0], eax
mov     eax, [ebp+0F3Ch+var_ED0]
lea     esi, [edi+eax+3]
call    sub_300C5576
push    0FFFFFFFDh
pop     ecx
sub     ecx, edi
add     eax, ecx
push    eax
push    [ebp+0F3Ch+var_EC0]
push    esi
call    sub_300E9D18      ; 參1 目的地址
                          ; 參2 複製的大小、
                          ; 參3 複製的最大值

到這裡漏洞分析就已經結束了,下面會來研究一下為什麼會產生這個漏洞。

相關文章