Equation漏洞混淆利用分析总结(下)
樣本三
如下所示在該樣本中,使用了Ole10Native的流,因此沒(méi)有equative head,默認(rèn)讀取紅框中的4位長(zhǎng)度。之后的metf head為01.
?
可以看到metf head的長(zhǎng)度為01時(shí),直接進(jìn)入到if判斷中(該if中的函數(shù)實(shí)際是一個(gè)異常處理函數(shù),但是當(dāng)傳入的參數(shù)為45,145時(shí)不影響之后的漏洞利用),之后讀取0A一位,因此當(dāng)metf head的version為01時(shí),實(shí)際的metf head的長(zhǎng)度只有兩位。
?
往后讀取01,進(jìn)入11882流程,導(dǎo)致直接返回,進(jìn)入case流程。
?
進(jìn)入case中的0798流程,讀取08,進(jìn)入之后的fun_Matrixdispatch,此時(shí)進(jìn)入fun_Matrixdispatch中的11882/0802流程。
?
?
樣本四
如下所示可以看到樣本使用的是常用的equationative流,長(zhǎng)度為1c的字節(jié),之后緊跟metf頭,但是咋看之下卻并不能確定其具體的漏洞cve,從metf之后的88字節(jié)來(lái)看,應(yīng)該是對(duì)應(yīng)的11882/0802漏洞
?
從vt上報(bào)的漏洞類型來(lái)看,大多數(shù)廠商的識(shí)別是0802系列,由于從上文所知,metf之后的構(gòu)造擁有多種方式,因此我們就來(lái)看看這個(gè)漏洞是否真是0802.
可以看到fun_ParseMTEFData函數(shù)中,metf頭檢驗(yàn)之后,向后讀取一字節(jié),此時(shí)獲取的為0d,作為參數(shù)進(jìn)入到正常的11882/0802流程,0d>09,因此函數(shù)直接跳過(guò)再次向下讀取。?
一直跳過(guò)0D 0A,直到藍(lán)色框中的01字節(jié)。
?
01被正常11882/0802返回,直接dispatch到case1中。
進(jìn)入case1流程中的0798,向下再讀取一字節(jié)01。?
0798中由01 ?dispatch進(jìn)入到case0流程。
?
如上文所示,在樣本二中提到進(jìn)入該函數(shù)中實(shí)際上是有方法進(jìn)入到對(duì)應(yīng)的equation流程中,但是在當(dāng)時(shí)的漏洞利用樣本中,該函數(shù)直接進(jìn)入到if流程中,當(dāng)時(shí)的分析中提到要進(jìn)入else中需要相關(guān)的特殊構(gòu)造,即a4等于1,else中實(shí)際是一個(gè)while循環(huán),依次讀取并傳入到0798的dispatch中。
可以看到while循環(huán)中之后會(huì)讀取02的tag,在該tag中會(huì)以此處理之后的3個(gè)字節(jié),樣本中一共構(gòu)造了四對(duì)02的tag用于混淆,之后處理35tag,35tag->5,即tag 5,而tag5實(shí)際上就是0798的漏洞tag,因此基本可以證明該樣本使用的漏洞是0798.
?
如下所示,讀取對(duì)應(yīng)的35位tag
導(dǎo)致dispatch到case4中,即對(duì)應(yīng)的0798漏洞流程中。
?
0798函數(shù)中,以此向后讀取5字節(jié)的內(nèi)容,其中第四,第五字節(jié)將導(dǎo)致溢出,即下圖中的20,80,之后分別以這兩字節(jié)內(nèi)容為長(zhǎng)度進(jìn)行棧上數(shù)據(jù)的拷貝,一共調(diào)用兩次,最終兩段棧上數(shù)據(jù)連成一片,從而造成溢出。
第一次拷貝,參數(shù)為20,及0012f3fc,0012f3fc為目標(biāo)棧上的地址。
?
第二次,拷貝,參數(shù)一為80,參數(shù)二為0012f404??梢钥吹降诙慰截惖牡刂吩诘谝淮慰截惖母叩刂烦?。
?
拷貝前的堆棧。
?
拷貝之后的堆棧,可以看到此時(shí)返回地址已經(jīng)被覆蓋,但是這個(gè)覆蓋的數(shù)據(jù)是不是很奇怪,50505050這個(gè)地址并沒(méi)有意義,難道這只是測(cè)試樣本?但是從沙箱的結(jié)果來(lái)看樣本是執(zhí)行成功的。
?
仔細(xì)再看一下漏洞函數(shù)可以發(fā)現(xiàn),實(shí)際上在溢出之后,函數(shù)返回之前,還有相當(dāng)一部分的操作,即之后的sub_4428F0函數(shù),及之后的還有一次0798的操作,也就是還能向后讀取數(shù)據(jù),結(jié)合對(duì)應(yīng)的樣本數(shù)據(jù),可以發(fā)現(xiàn)確實(shí)還能向后拷貝,sub_4428F0函數(shù)之后將其結(jié)果作為參數(shù),返回給0798漏洞流程,同時(shí)也能看到第一次溢出的拷貝的數(shù)據(jù)v6,是作為第四個(gè)參數(shù)傳入到該函數(shù)中的,我們的看看這個(gè)函數(shù)具體做了啥。
?
首先可以看到a2,a3這兩個(gè)參數(shù)來(lái)自于sub_43b349函數(shù),值分別為word_45B246和word_45B244
?
而word_45B246和word_45B244的相關(guān)引用函數(shù)如下所示,其中Headcheck引起了我們的注意
?
可以看到這兩個(gè)位置的數(shù)據(jù)是在metf頭檢驗(yàn)中進(jìn)行的設(shè)置,即函數(shù)sub_43B1D0。
可以看到sub_43B1D0中設(shè)置a2,a3的值是依賴于metf頭之后的一位的值,且在處理的過(guò)程中有ReadByte的操作,這就意味這實(shí)際上可以通過(guò)該函數(shù)來(lái)實(shí)現(xiàn)往metf頭之后插入混淆數(shù)據(jù)的操作。
?
但是實(shí)際上仔細(xì)看代碼就可以知道,上面a2,a3是取的棧上的地址,也就是說(shuō)這個(gè)值實(shí)際上在溢出之后是可控的。
?
再次調(diào)試可以看到a2,a3的地址分別為0012f420,0012f41c。
?
溢出之后可以看到此時(shí)a2,a3的值被修改。
?
如下所示,該函數(shù)的調(diào)用棧,需要注意的是2,3,4參數(shù),其中第四個(gè)參數(shù)為溢出數(shù)據(jù)的第一段內(nèi)容,2,3參數(shù)的低四字節(jié)(溢出時(shí)被修改為5800,06eb)需要注意,下文中會(huì)有相關(guān)解釋。
?
進(jìn)入函數(shù),可以看到首先通過(guò)sub_435B4A返回了一段內(nèi)存v5,之后通過(guò)傳入的參數(shù)對(duì)該段內(nèi)存進(jìn)行初始化,其中紅框中的三處賦值初始化是關(guān)鍵,第一二次賦值分別將二三參數(shù)的低四位分別去處并v5偏移40和42處(06rb5800),之后通過(guò)函數(shù)memory將a4的0x14長(zhǎng)度的數(shù)據(jù)拷貝到v5偏移50處,a4就是之前0798溢出時(shí)的第一次拷貝shellcode?
此時(shí)反編譯一下00281c3c這段內(nèi)存,可以看到之前第一次拷貝的06eb5800的對(duì)應(yīng)反編譯源碼為pop eax,jmp 00281c6e
?
而00281c6e正好就是之前v5+50處拷貝的溢出shellcode的第一段,而最終00281c3c這段內(nèi)存會(huì)作為參數(shù)返回。
?
00281c3c的作為返回值返回,并作為參數(shù)1傳入到之后的0798 dispatch函數(shù)中。
進(jìn)入dispatch后,之前溢出shellcode之后的35將再次觸發(fā)0798的漏洞,函數(shù)首先分別獲取參數(shù)1偏移0x28,和0x2a處的數(shù)據(jù),并保存到局部變量中,需要注意是獲取的是兩字節(jié),賦值后內(nèi)存中變成了00445800.?
0044實(shí)際上只之前sub_4428F0函數(shù)的返回地址。
有意思的是在漏洞函數(shù)中sub_438349中,該函數(shù)會(huì)設(shè)置對(duì)應(yīng)傳入的a2,a3地址的值,此時(shí)正好將00445800設(shè)置為00440000(該值在之后的利用中被使用).
如下所示之后35之后依次讀取的5個(gè)字節(jié)為35, 33,36,20,44(其中用于控制溢出長(zhǎng)度的字節(jié)為20,44)。
第一次拷貝,拷貝地址為0012f35c,長(zhǎng)度的控制參數(shù)為20.
?
第二次拷貝,拷貝地址為0012f376,長(zhǎng)度的控制參數(shù)為44.
?
拷貝前的堆棧數(shù)據(jù)。
?
拷貝后的棧數(shù)據(jù),此時(shí)返回地址已經(jīng)被修改為00430bfb,需要注意的此時(shí)覆蓋的只是返回地址的第四位,即高四位并沒(méi)有被修改,返回地址后四位即為傳入的第一個(gè)參數(shù)00281c3c,同樣需要注意的還有00281c3c之后的00440000,現(xiàn)在來(lái)整理以下第二次漏洞利用的流程
?
00281c3c作為參數(shù)一傳入0798漏洞函數(shù),之后分別獲取00281c3c偏移40,42處的內(nèi)容),并賦值給v5,v6,其中v5就是0044000(其來(lái)源上文中已經(jīng)說(shuō)明),之后將00281c3c,v5,v6分別作為2,3,4參數(shù)傳入到dispatch函數(shù)中。
?
之后進(jìn)入漏洞函數(shù)2,3,4參數(shù)又分別作為1,2,3參數(shù)來(lái)調(diào)用case 4處的漏洞函數(shù)。
?
此時(shí)函數(shù)返回,由于之前的漏洞將函數(shù)的返回地址已經(jīng)修改為00430bfb,而該地址對(duì)應(yīng)的反匯編代碼為ret,執(zhí)行ret,將導(dǎo)致程序的執(zhí)行流程直接進(jìn)入到00430bfb之后的00281c3c中。
?
00281c3c向下執(zhí)行,最終導(dǎo)致執(zhí)行之后00281c3c中已經(jīng)構(gòu)造好的shellcode
?
這里可以看到在jmp前,有一條pop eax的操作,此時(shí)pop,即將之前棧上00281c3c之后的00440000賦值給eax,該值作為之后shellcode中尋址的高位地址,最終從此處進(jìn)入到攻擊者控制的流程中。
?
由此可以看到該樣本中0798和正常0798的區(qū)別之處
?
總結(jié)
如下所示即可看到11882/0802/0798這三個(gè)漏洞的混淆點(diǎn)了,對(duì)于這三個(gè)漏洞,除了綠色1c,*8(11882,0802),*1/*4-*5(0798)不能變,其他位置都是可變的,其中紫色指有要求的變(第一處不能大于0x20000,第二處只能為01(當(dāng)為01時(shí),metf頭由五位變成1位,即之前的后四位去掉),02,03,102,103),當(dāng)metf為五位時(shí),之后的一位,即第六位實(shí)際上是可以導(dǎo)致之后有附加數(shù)據(jù)的,及下圖中的藍(lán)色部分,因此metf頭之后和tag頭之間也是可以插入混淆數(shù)據(jù)的。除此之外eqnolefilehdr,mtef head其余位置應(yīng)該都是可以隨便搞的。
之后mtef byte stread中可以插入任意多的tag,只要保證最終進(jìn)入08,05tag即可,因此在紫色01和綠色08之間也是可以加入混淆數(shù)據(jù)的(通過(guò)0798中的處理或標(biāo)準(zhǔn)流程中11882處理(>9,01,04會(huì)進(jìn)入0798),0798中還依賴dispatch來(lái)處理,case0/case1/case5流程中是可以再次進(jìn)入到0798,如上文的第2,4個(gè)樣本。
?
?轉(zhuǎn)載請(qǐng)注明出處
轉(zhuǎn)載于:https://www.cnblogs.com/goabout2/p/10201155.html
總結(jié)
以上是生活随笔為你收集整理的Equation漏洞混淆利用分析总结(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IO-00. Hello World!
- 下一篇: 逻辑斯蒂(logistic)回归深入理解