【mugen】猴子也能看懂的mugen兇惡原理(2)——%f

4.???????? %f利用
通過上篇文章發(fā)現(xiàn)%n有個很大的缺點是只能任意地址寫,不能任意地址讀,因為DisplayToClipBoard和AppendToClipBoard本意是將debug信息復(fù)制到剪切板里的。因為現(xiàn)代電腦系統(tǒng)都有著ALSR保護,一些地址都是隨機的,沒有讀我們就無法直接去寫那些地址。
在pwn題中有個經(jīng)典的利用方法就是劫持got表,mugen中應(yīng)該劫持哪個got呢?%f給了我們答案。
參考Duang-Hell人物的12P.cns中的%f代碼,一共分為三步。
1,%n技術(shù)在4B48E8地址寫入4B4000
2,%n技術(shù)在4B4000地址寫匯編
3,%f技術(shù)執(zhí)行代碼
毫無疑問,這一看就是got表劫持的漏洞利用方式,先看4B48E8上放了什么。

496651是什么呢?__cfltcvt()

%f是如何調(diào)用__cfltcvt()的呢?加入%f代碼,用之前同樣的跳到retn動態(tài)調(diào)試后,可以發(fā)現(xiàn)熟悉的調(diào)用鏈。
sub_46E800()
vsprintf()
_output()
off_4B48E8()
__cfltcvt()
那么%f本質(zhì)上就是先用%n劫持了__cfltcvt()的got表,改寫到4B4000,然后在4B4000地址上寫入惡意匯編,最后%f觸發(fā)之。
當(dāng)然,mugen中一定還存在很多其他got表劫持的辦法,但%f可以更穩(wěn)定的觸發(fā),發(fā)現(xiàn)者可以說是非常厲害了。
我們先執(zhí)行最簡單的匯編,0x90也就是NOP。
我們在4713A9(call _vsprintf)下斷點然后F9,可以清晰的看到依次利用%n改寫內(nèi)存。如下圖,4B48E8改寫完成,開始改寫4B4000。

當(dāng)4B48E8和4B4000都改寫完成后,最后一次vsprintf執(zhí)行%f。

此時斷點4B4000,F(xiàn)9后發(fā)現(xiàn)NOP被成功執(zhí)行。

那么就可以利用匯編做任何想做的事,在mugen中通常指擊殺對方人物,這需要對mugen地址的研究,我這里就簡單一點用一個彈計算器的shellcode,并且寫好生成cns代碼的python3腳本
msfvenom -p windows/exec cmd="calc.exe" exitfunc=thread -b "\x00" -f python
結(jié)果如下。
