4.6.2 构造的特殊性

“哦,那是不是引发异常后,有what→where的操作呢?”宇强凭感觉说道。

“是的!异常后有what→where的操作,而且what是FFFE后的第12个字节,而where是FFFE后的第16个字节。如图4-55。”

“那我们把where覆盖成默认异常处理地址,what覆盖成ShellCode地址就可以了?”

“好啊!大家试试?”

“把what填为ShellCode的地址,where填为系统默认异常处理地址,后面跟上ShellCode的代码。生成伪造图片后,我们在资源管理器中浏览试试。”

教室里一片安静……

“这是怎么回事呢?”古风疑惑的看着老师。

“呵呵,这是没有引发默认异常处理啊!”老师回答说。

“哦!那我们换个利用方式吧,” 古风说道,“把where覆盖成SEH处理地址,what覆盖成ShellCode地址,再试试!”

“铛!”这下弹出了异常对话框。

“这次引发了默认异常处理,却没进入到SEH处理中。”老师说道。

“天啊!这这么办啊?”古风彻底迷糊了。

“呵呵!堆溢出漏洞的利用就是需要具体漏洞具体分析。对于这个漏洞,我们有特殊的利用方法。”

“什么特殊方法呢?”大家都急切的想知道。

“在异常处理后,系统会返回到GdiPlus.dll中继续执行,这是GdiPlus.dll特有的行为,不是每个堆溢出漏洞都会有的。”

“老师直接说结果吧!”古风按耐不住了。

“好的,覆盖方法是把where赋成0x7830B1DC,而what赋成EF 1F。”

老师继续解释道:“0x7830B1DC是XP SP1的GdiPlus.dll中的一个函数地址,在异常处理后会被调用。所以当异常处理执行what→where时,就会将这个函数改写;异常处理后,会返回GdiPlus.dll中调用我们覆盖的函数。经过多次处理后,程序就会到达我们what这条指令了。”

021D6250 EB 1F JMP SHORT 021D6271

“哦!我们再在后面赋上ShellCode就可完成攻击了!”大家说道。

“不错,就是这样的!”