CVE-2012-0158 MSCOMCTL.ocx棧溢出漏洞分析

  此次是不當心撿到一個poc.doc文檔,致使Word出錯來展開分析的。首先打開poc.doc時候,出現Access Violation錯誤(即EIP=0x41414141)。shell

此時能夠從棧中回溯到上層調用函數的返回地址,可見0x275C8A0A處,難道咱們當前出錯函數就是mscomctl.275C876D了嗎?那咱們在0x275C8A05處打上斷點探究一下...函數

當咱們再次打開poc.doc運行來看時發現,真正Crack的地方是在0x275C8A56處的ret 8,這說明以前某個部分複製數據到棧上致使棧溢出覆蓋掉了本來的返回地址了。code

此次咱們單步運行發現複製的地方處於0x275C87CD處的rep指令,此時咱們將rep指令所處函數命名爲VulnFunc,將以前ret 8所處函數命名爲CrackFunc。那麼咱們在IDA Pro中解析能夠獲得以下代碼,文檔

VulnFunc第一次調用,使得程序從文件中得到dwBytes(dwBytes=0x00008282)和v5(0x6A626F43),而dwBytes>=8,使得VulnFunc第二次調用,從文件從複製dwBytes字節數據到&dst(&dst=bp-8,也就是棧上的位置)處,以後再判斷overwritten_bytes([bp-4])是否爲0,如是即返回。咱們再來看看VulnFunc中的內容,it

VulnFunc大體是先從堆中申請dwBytes字節空間,而後將文件內容複製到此處空間內,最後再從堆中將數據複製到dst處(qmemcpy(...)),致使外層函數棧溢出了。io

    以上所需關鍵數據0x6A626F4三、0x0000828二、0x41414141均可以在poc.doc中找到,程序

由於CrackFunc返回前須要判斷overwritten_bytes,因此0x1309-0x1320都必須是‘0’,有由於返回指令是ret 8,因此「41414141」後面16字節不能存在payload。因此最終的shellcode=‘0’*24+ROP(jmp esp)+‘0’*16+payload。im

-----------------------------------------------------------------------------------------------效果如上圖命名

相關文章
相關標籤/搜索