CVE-2011-0104 Microsoft Office Excel緩衝區溢位漏洞 分析
漏洞簡述
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 複製的最大值
到這裡漏洞分析就已經結束了,下面會來研究一下為什麼會產生這個漏洞。
相關文章
- 緩衝區溢位小程式分析2020-02-02
- IMail SMTP 緩衝區溢位漏洞 (APP,缺陷) (轉)2007-12-07AIAPP
- 緩衝區溢位漏洞那些事:C -gets函式2022-03-28函式
- 緩衝區溢位漏洞的原理及其利用實戰2022-03-01
- 一個緩衝區溢位漏洞的簡易教程2015-09-08
- 緩衝區溢位實驗2024-10-30
- cve-2010-3333 Microsoft Office Open XML檔案格式轉換器棧緩衝區溢位漏洞 分析2016-07-27ROSXML
- CVE-2010-2883-CoolType.dll緩衝區溢位漏洞分析2020-10-17
- Redis緩衝區溢位及解決方案2023-04-12Redis
- MS15-002 telnet服務緩衝區溢位漏洞分析與POC構造2020-08-19
- pwntools緩衝區溢位與棧沒對齊2024-08-12
- MikroTik RouterOS 中發現了可遠端利用的緩衝區溢位漏洞2018-03-21ROS
- 淺談C#緩衝區溢位的祕密2010-12-28C#
- 駭客中級技術--緩衝區溢位攻擊(轉)2007-09-18
- 緩衝區分析2017-01-16
- CVE 2015-0235: GNU glibc gethostbyname 緩衝區溢位漏洞2020-08-19
- 緩衝區溢位攻擊初學者手冊(更新版)2017-03-18
- CVE-2010-2883Adobe Reader和Acrobat CoolType.dll棧緩衝區溢位漏洞分析2016-07-28BAT
- Python經典棧緩衝區溢位獲取root許可權2018-02-28Python
- CMD.EXE中dir超長字串緩衝區溢位原理學習2013-07-31字串
- 快取區溢位漏洞工具Doona2017-04-13快取
- SMT整型溢位漏洞分析筆記2018-06-19筆記
- ASLR 是如何保護 Linux 系統免受緩衝區溢位攻擊的2019-03-05Linux
- CVE-2010-3333-office RTF棧溢位漏洞分析2021-04-10
- WebGIS 8-1 緩衝區分析2016-07-28Web
- Linux核心即時入侵檢測安全增強-防止緩衝區溢位的核心補丁(轉)2007-08-15Linux
- 一個簡單的遠端溢位漏洞分析2016-03-10
- C 標準庫IO緩衝區和核心緩衝區的區別2018-02-26
- Java NIO:緩衝區2020-10-05Java
- getchar緩衝區2016-07-18
- 解決呼叫DBMS_OUTPUT時出現緩衝器溢位的錯誤2005-02-21
- 網路安全(超級詳細)零基礎帶你一步一步走進緩衝區溢位漏洞和shellcode編寫!2019-05-09
- Java NIO 之緩衝區2021-09-09Java
- Unity深度緩衝區指令2021-01-05Unity
- Java整數緩衝區2020-12-23Java
- nginx 緩衝區構造2013-04-07Nginx
- stdio流緩衝區2024-10-02
- YoungzsoftCMailServer遠端棧溢位漏洞2017-11-12AIServer