最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【mugen】猴子也能看懂的mugen兇惡原理(3)——StateDef溢出

2023-03-31 12:05 作者:珂字輩  | 我要投稿

5.???????? StateDef溢出

?

通過搜索得知,其為[Statedef -3]中-3這部分的溢出,那么直接編寫溢出代碼,放在kfm.cns第一個Statedef之上。

od不會智能跳轉(zhuǎn)到溢出報錯處,x64dbg可以。

查看47ED05對應(yīng)反編譯代碼,位于sub_47EBF0()——memset()

memset()也會溢出嗎?理論上并不會,用od斷點(diǎn)47ED05,查看匯編對應(yīng)的含義,就明白發(fā)生了什么。

rep stos dword ptr es:[edi]

將edi開始的內(nèi)存覆蓋為eax(為0),4字節(jié)一次循環(huán)ecx次,這也正是memset()開辟內(nèi)存核心匯編。而esi和edi都為41414141,很明顯是因?yàn)榍懊?7ECF2的匯編導(dǎo)致的。也就是說在47ED05之前,已經(jīng)因?yàn)闂R绯龈采w掉了棧中一部分正常的地址,導(dǎo)致memset()報錯。

那么具體是哪兒出現(xiàn)的棧溢出呢?稍微熟悉棧溢出的同學(xué),往上翻一翻sub_47EBF0()的代碼,就會發(fā)現(xiàn)正確答案。

非常熟悉的strcpy(),v33只有64個字節(jié),a3是個int,也就是原本為[Statedef -3]的-3,如果我們填充64個A,就會導(dǎo)致溢出。

動態(tài)調(diào)試后發(fā)現(xiàn)這個動作是在47EC37完成的,再寫一個[Statedef AAAA]進(jìn)去,兩次斷點(diǎn)來對比一下到底能覆蓋哪些東西。

可以看到覆蓋了多個返回地址,實(shí)際測試下來其中有用的是D3FEE74,偏移量為Statedef+56,那么填充數(shù)據(jù)就是"Statedef "+"A"*55+"BBBB",注意Statedef后門帶個空格。

修改一下后逐步單步后發(fā)現(xiàn)嘗試跳轉(zhuǎn)到BBBB。

棧溢出最簡單的利用方式是棧內(nèi)執(zhí)行,這需要無NX保護(hù)和jmp esp,winmugen剛好滿足條件。其自帶的ALLEG40.DLL在0x1005FB9D地址寫著call esp。

checksec.exe Winmugen.exe

!mona jmp -r esp -cpb "\x00"

那么利用python來替換字符串寫入shellcode,當(dāng)然慣例先用NOP嘗試。

在1005FB9D下斷點(diǎn),但并沒有達(dá)到理想中的效果進(jìn)入棧中執(zhí)行,動態(tài)調(diào)試后可以發(fā)現(xiàn)還是因?yàn)?7ED05也就是memset報錯。

經(jīng)過簡單測試,可以發(fā)現(xiàn)47ED05被破壞的棧在ret地址后5-8位。

根據(jù)47ED05上的匯編,本質(zhì)上是清空一段內(nèi)存地址,那么我們需要使用一個可寫的地址替換掉AAAA,讓其不再報錯。學(xué)習(xí)%n和%f的時候我們用過兩個不重要的地址0x4b4048和0x4B4000,但由于它實(shí)際上是0x00開頭的有壞字符所以不行。同理整個winmugen.exe都不行,還好ALLEG40.DLL都是0x10開頭的地址,那我們在data斷上找一個空白的地址就行。我這里隨便選的0x1009BDAD。

成功斷到1005FB9D,棧布局也和我們溢出的一樣。

那么在127EEE78斷點(diǎn),F(xiàn)8后成功在棧上執(zhí)行NOP。

這樣就能執(zhí)行shellcode了嗎?還不行,因?yàn)槲覀冊黾恿艘粋€1009BDAD的原因,棧上會把這個地址當(dāng)作匯編來使用,同樣會報錯導(dǎo)致無法執(zhí)行后續(xù)的shellcode。這個時候可以利用jmp short跳過這段不可控的地址。

可以看到剛好跳到NOP上,現(xiàn)在可以執(zhí)行shellcode了嗎?還是不行,因?yàn)橐绯鲇虚L度限制,msfvenom最短也要220個字節(jié),而我們只能在棧上控制164字節(jié)左右。

這里可以想辦法縮短shellcode,但還是推薦另外一種不限shellcode長度的辦法,參考Reboot人物。它的Reboot.st是這樣的。

使用它之前可以修改shutdown的字節(jié),以免真的導(dǎo)致系統(tǒng)重啟,斷點(diǎn)47EC1C(sub_47EBF0較前的地址)動態(tài)調(diào)試。前面有很多無意義的Statedef,快速F9到溢出,也就是Statedef 5900后面一個。

F8幾下之后就會發(fā)現(xiàn)棧溢出,返回地址被覆蓋為5D403246,和Reboot.st可以對應(yīng)上。但剩下的并沒有覆蓋。

再F8到47EC4E就會發(fā)現(xiàn)5D變成了00,為什么呢?因?yàn)閈x5D是],完成了對[Statedef的閉合。

繼續(xù)F8,可以看到Need at least one state controller提示,這是對state的檢測,代碼如下。

可以看到離我們之前繞過的memset()非常近,而且這個代碼中存在return。因?yàn)槲覀冊谝绯鯯tatedef下面寫了一個加氣的state,所以走不進(jìn)這個if中,所以才需要繞memset(),如果沒有state,就可以提前return了。

代碼走到retn,棧中可以看到,即將跳轉(zhuǎn)到作者精心布置的一個地址403246

而這個地址的代碼非常簡單,add esp,0x10然后retn,也就是說再次跳轉(zhuǎn)到棧+16的指針,也就是99E244A。

這個地址里存儲了溢出Statedef空格后面所有的字節(jié),所以一開始就用jmp short跳到下面的NOP。此時shellcode長度的限制就完全沒有了。我們先修改kfm.cns.bak代碼。

然后寫好python腳本。

msfvenom -p windows/exec cmd="calc" exitfunc=thread -b "\x00\x1A\x3B" -f python

效果如下。


【mugen】猴子也能看懂的mugen兇惡原理(3)——StateDef溢出的評論 (共 條)

分享到微博請遵守國家法律
金沙县| 林州市| 贵州省| 秦安县| 安泽县| 岑溪市| 汶川县| 田阳县| 教育| 湘潭市| 兴宁市| 安陆市| 石首市| 江源县| 九台市| 清新县| 蒙城县| 巩义市| 方山县| 沅陵县| 赣榆县| 雅江县| 杭州市| 米林县| 清水河县| 信丰县| 和硕县| 墨脱县| 泗水县| 沿河| 濉溪县| 宜州市| 黑山县| 准格尔旗| 福泉市| 泊头市| 称多县| 高阳县| 阳山县| 呼和浩特市| 石首市|