4.5 堆溢出的其他利用方式

“堆溢出利用的本质,就是使其产生what→where的操作,而让系统走向我们想要的流程。所以把what和where覆盖成什么值是利用能否成功的关键。”老师说道。“刚才我们使用的是默认异常处理地址,方法是把where覆盖成默认异常处理的地址,把what覆盖成ShellCode地址或能达到ShellCode的语句地址。”

“嗯,Windows2000下的what就是 call [esi+0x4c] 指令的地址?”同学们说道。

“对,对于Windows2000,还可以是 call [ebp+0x74] 指令的地址,而在XP系统下,则是 call[edi+0x78] 指令的地址。”

“这种覆盖方法,看起来还是不错嘛!”大家看起来都很满意。

“这种方法的优点是比较准确;但缺点是需要确切知道对方的系统和SP补丁号——默认异常的处理地址在各个版本和SP下都是不同的。”

“是啊!”这句话提醒了大家,“好像还提到过把where覆盖成SEH的方法吧!”

“是的,那是把where覆盖成当前异常处理程序地址,what覆盖成能达到ShellCode的语句地址。”

“前面也说过,这种方法的优点与对方的系统和补丁无关,会比较准确通用;但缺点是需要对方线程地址是固定的。”

“哦,那有别的更好的覆盖方法吗?”大家对已有的利用方式还不满意。

“基于对Windows系统的深层认识,还有另外一些方法;但总的说来,这些也是类似的。”老师回答道。