CVE-2012-0158栈溢出漏洞分析
文章目錄
- 漏洞描述
- 分析環境
- 漏洞分析
- 尋找漏洞函數
- 驗證漏洞函數
- 縮小漏洞范圍
- 探究漏洞本質
- 漏洞修復
漏洞描述
該漏洞發生在MSCOMCTL.OCX模塊中,在一段內存拷貝時,由于檢查條件錯誤造成基于棧的緩沖區溢出
分析環境
| 操作系統 | W7 x64 |
| 調試器 | windbg |
| 反匯編器 | IDA Pro |
| 漏洞軟件 | Office 2003 SP3 |
| Office格式分析工具 | OffVis |
漏洞分析
尋找漏洞函數
首先用windbg附加WINWORD.EXE,接著打開漏洞樣本,輸入g命令運行
此時觸發異常崩潰,觸發異常的模塊為C:\Windows\SysWOW64\MSCOMCTL.OCX,奔潰的地址是0x41414141
接下來查看 一下函數的堆棧,發現堆棧地址已經被破壞了
接著查看一下前面的堆棧,接著又看到了41414141這個地址
接著在IDA中查看MSCOMCTL.OCX,發現275c8a0a是漏洞模塊的返回地址
驗證漏洞函數
接下來我們來驗證一下sub_275C876D這個函數是不是漏洞函數,重新用windbg附加WINWORD.EXE。用sxe ld命令給MSCOMCTL.OCX下模塊斷點
斷下來之后在漏洞函數地址下bp斷點
斷下來之后,需要分析堆棧中的內容
這里發現了MSCOMCTL模塊內的一個地址275e701a,用IDA查看下是不是外層函數的返回地址
接著我們進到sub_275C89C7這個函數
發現這個函數就是我們之前找到的漏洞函數,那么說明這個地址就是外層函數的返回地址
F10步過這個函數,再查看esp,發現這個返回地址已經被修改為41414141,這也就驗證了這個函數就是觸發漏洞的函數
縮小漏洞范圍
用IDA F5查看這個函數內部,通過猜測加驗證可以得出,觸發漏洞的函數就是這個qmemcpy這個函數
重新用windbg附加WINWORD.EXE,繼續在剛才驗證過的漏洞函數下斷點。
斷下之后,查看esi和edi的內容
275e701a是我們剛才驗證過的函數的返回地址,這里在進行內存拷貝的時候被41414141覆蓋。這樣,我們就確定了溢出點
探究漏洞本質
我們在IDA中在往外回溯一層,找到調用這個漏洞函數的地方,觸發這個漏洞的根本原因就在這一句
if ( v5 == 1784835907 && dwBytes >= 8 )當dwBytes >= 8時,條件成立,走下面的漏洞函數。這一句本來是用來控制memcpy函數拷貝的變量的大小的。結果缺因為程序員的代碼邏輯錯誤,將原本是<=8寫成了>=8。如果說這個地方是<=8的話,那么內存拷貝的字節數也就不存在溢出的可能了
總結:
CVE2012-0158之所以經典不是因為它是一個棧溢出,而是一個很典型的由于程序員代碼邏輯的失誤導致的棧溢出漏洞。
漏洞修復
直接用IDA查看修復后的模塊
我們發現這里判斷了拷貝的大小是否等于8,如果不等于8,則函數直接返回。
總結
以上是生活随笔為你收集整理的CVE-2012-0158栈溢出漏洞分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft RTF栈溢出漏洞(C
- 下一篇: CVE-2017-11882漏洞分析