漏洞簡(jiǎn)介
實(shí)驗(yàn)環(huán)境
動(dòng)態(tài)分析-定位漏洞
先用OllyDbg加載WinWord打開(kāi)poc,此時(shí)產(chǎn)生了crash,可以看到EIP被篡改成了AAAA铃在,并且通過(guò)棧回溯我們可以看到最近的一個(gè)返回地址為275C8A0A在MSCOMCTL中碍遍。
此時(shí)我們跟到275C8A0A處定铜,發(fā)現(xiàn)是在函數(shù)275C89C7中,查看其上一句調(diào)用了275C876D函數(shù)怕敬。
看棧里面的內(nèi)容:剛剛看到的275C8A0A返回地址在崩潰時(shí)跳轉(zhuǎn)地址AAAA的低地址方向,說(shuō)明這個(gè)棧已經(jīng)被收回了赖捌。也就是說(shuō)祝沸,已經(jīng)執(zhí)行完275C876D這個(gè)函數(shù),在275C89C7函數(shù)返回時(shí)越庇,執(zhí)行到AAAA,導(dǎo)致程序崩潰奉狈。并且在ret前調(diào)用的最后一個(gè)函數(shù)是275C876D卤唉,從執(zhí)行完275C876D函數(shù)往下看經(jīng)過(guò)jl跳轉(zhuǎn)最后ret發(fā)現(xiàn)并沒(méi)有太多的棧操作,所以推斷造成溢出是發(fā)生在275C876D函數(shù)中仁期。
我們?cè)?strong>275C8A05處下斷點(diǎn)桑驱,重新執(zhí)行poc竭恬,觸發(fā)斷點(diǎn)后步進(jìn)275C876D函數(shù)。
步過(guò)執(zhí)行到275C87CB處熬的,發(fā)現(xiàn)該代碼實(shí)現(xiàn)將8D92008處數(shù)據(jù)往棧里復(fù)制0x20A0長(zhǎng)度的操作痊硕,并且出現(xiàn)了AAAA,可以看出復(fù)制后剛好可以把棧上121820處的返回地址覆蓋成AAAA押框。
之后就是執(zhí)行完275C876D岔绸,返回到275C89C7函數(shù),執(zhí)行完再返回時(shí)EIP指向41414141產(chǎn)生程序崩潰橡伞。
靜態(tài)分析-分析漏洞
用IDA打開(kāi)MSCOMCTL.OCX盒揉,直接跳轉(zhuǎn)到我們的漏洞函數(shù)275C89C7,可以看到觸發(fā)漏洞的275C876D函數(shù)其實(shí)是叫CopyOLEdata兑徘。其中傳入了在EBP-8位置的參數(shù)v7刚盈、字符串bstrString,以及一個(gè)通過(guò)if判斷后大于等于8的dwBytes挂脑。觸發(fā)條件為首先從bstrString中讀取0xC字節(jié)到臨時(shí)變量v5中藕漱,并且判斷v5的前四字節(jié)是否為Cobj以及dwBytes是否大于等于8。
跟進(jìn)觸發(fā)漏洞的函數(shù)崭闲,可以看到會(huì)有一個(gè)qmemcpy函數(shù)(也就是之前在OllyDbg里看到的那條REP MOVS指令)將剛剛的bstrString復(fù)制dwBytes的長(zhǎng)度到高港的EBP-8的位置肋联,發(fā)生了棧溢出。
TODO
- 分析POC
- 構(gòu)造EXP