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

4. %f利用
通过上篇文章发现%n有个很大的缺点是只能任意地址写,不能任意地址读,因为DisplayToClipBoard和AppendToClipBoard本意是将debug信息复制到剪切板里的。因为现代电脑系统都有着ALSR保护,一些地址都是随机的,没有读我们就无法直接去写那些地址。
在pwn题中有个经典的利用方法就是劫持got表,mugen中应该劫持哪个got呢?%f给了我们答案。
参考Duang-Hell人物的12P.cns中的%f代码,一共分为三步。
1,%n技术在4B48E8地址写入4B4000
2,%n技术在4B4000地址写汇编
3,%f技术执行代码
毫无疑问,这一看就是got表劫持的漏洞利用方式,先看4B48E8上放了什么。

496651是什么呢?__cfltcvt()

%f是如何调用__cfltcvt()的呢?加入%f代码,用之前同样的跳到retn动态调试后,可以发现熟悉的调用链。
sub_46E800()
vsprintf()
_output()
off_4B48E8()
__cfltcvt()
那么%f本质上就是先用%n劫持了__cfltcvt()的got表,改写到4B4000,然后在4B4000地址上写入恶意汇编,最后%f触发之。
当然,mugen中一定还存在很多其他got表劫持的办法,但%f可以更稳定的触发,发现者可以说是非常厉害了。
我们先执行最简单的汇编,0x90也就是NOP。
我们在4713A9(call _vsprintf)下断点然后F9,可以清晰的看到依次利用%n改写内存。如下图,4B48E8改写完成,开始改写4B4000。

当4B48E8和4B4000都改写完成后,最后一次vsprintf执行%f。

此时断点4B4000,F9后发现NOP被成功执行。

那么就可以利用汇编做任何想做的事,在mugen中通常指击杀对方人物,这需要对mugen地址的研究,我这里就简单一点用一个弹计算器的shellcode,并且写好生成cns代码的python3脚本
msfvenom -p windows/exec cmd="calc.exe" exitfunc=thread -b "\x00" -f python
结果如下。
