CVE-2012-0158個人分析

Ox9A82發表於2016-03-22

CVE-2012-0158是一個比較有名的老漏洞了,這次從論壇上找到一個poc檔案,利用這個poc來分析CVE-2012-0158漏洞的形成。

http://bbs.pediy.com/showthread.php?t=207638

參考自此帖子,但是分析是個人獨立完成的,只是參考了poc並沒有抄襲思路。

本文步驟:重現漏洞-->漏洞分析-->漏洞利用-->總結

1.重現漏洞

開啟poc檔案,結果如圖

環境如下

如圖可見漏洞復現成功,彈出一個計算器。

2.漏洞分析

透過已有的POC找出漏洞產生的原因。

首先定位shellcode在記憶體中的地址,這裡使用的是透過對api下斷點找到shellcode的地址。

如圖。可見此時shellcode已在棧中。00121461即為棧中空間,從3個nop起為shellcode

在此時看一下棧的整體結構,如下圖

4個byte的nop之後接的便是shellcode,根據棧溢位的特點我猜測,7FFA4512為覆蓋棧返回地址的地方。跟一下發現如圖

原來7FFA4512處是一個jmp esp

這是一個常見的棧溢位跳板。據此我判斷這是一個使用跳板地址覆蓋棧返回地址的棧溢位,而且此時的esp正好指向shellcode的起始位置,4個byte的nop用來

抵消retn 0x8造成的esp下移。據此棧示意圖如下

接下來查詢是哪裡發生的覆蓋,因為是當前函式的棧禎發生溢位,說明肯定是子函式或者當前函式導致的覆蓋。但是本棧禎已經被覆蓋的一塌糊塗了,怎麼知道這個函式的地址呢?

那麼就只能對棧進行回溯,正好可以發現一個已經用過的函式返回地址,找到發生溢位的這個棧禎。經過單步跟進最終發現產生問題的語句在這裡,如圖

可見是一個rep movs導致的溢位。

 

如圖可知溢位函式處於mscomctl模組

相關文章