1.7.4 通用的JMP ESP地址

“最后是第三个条件――JMP ESP地址。这个上次给大家讲了,并给出了中文Win2000各版本相应的地址,大家直接使用即可。但各个版本不统一,使用起来相当麻烦。这里,我再给大家一个大餐――中文版Win2000、XP、Win2003的JMP ESP通用跳转地址(lion给出的0x7ffa4512)。经我测试,绝对可用,童叟无欺!是编写溢出利用程序的必备良药!让我们一起感谢lion的无私共享精神吧!这才是真正的Hacker精神,大家一定要发扬啊!”

大家听后拼命的点头:“好也!”

“好吧,这下我们的三个条件都有了,我们来完成统一吧!”

“初步分析后,我们知道‘From:’字段作如下构造就可跳入我们的ShellCode。如果还有不清楚的同学,请再复习一下上节课的内容。如图1-28。”

“对!就这样喽!”

“但是,大家别忘啦!”老师突然一喝!“这样和最开始我们覆盖0x150个‘A’测试时是类似的,ShellCode会把程序要写的参量覆盖了,那程序在返回之前,会产生那个write型错误!”

“哇,是啊,这可怎么办啊?”那位PLMM紧张的说,瞬间她成为了整个教室的焦点,大家都屏住了呼吸,一是想仔细听听这清脆的声音,二是等待着老师的回答。

“在这种情况下,一般有三种解决方法”,老师耐心的解释道。“第一种,注意覆盖参量为可写的地址,即保证参量是可写的,不让它出现write错误,但这种方法很麻烦,需要知道不能写的参量的所有位置;第二种,覆盖异常,这种方法会在后面讲到;第三种,就是这里我们使用的,把ShellCode放在前面!根本不覆盖参量。”

“哦?把ShellCode放在前面是什么意思?”宇强见PLMM不太懂,也忙着问老师。

“就是说,我们把ShellCode放在RET前的缓冲区中,而在RET后面放入很短的一个指令,指令的内容就是往前跳,跳到前面的ShellCode中。”

“形象的说,就是这样的格式,根本不去覆盖不能改变的参量,如图1-29。”

“在这样的格式下,返回时程序就会先执行 JMP –0x80 这个指令,往前跳到一堆空指令中,然后顺着空指令往下执行,最后进入到ShellCode中,就可执行我们的ShellCode了。”

“哦!这样啊!太有创意了!”大家感叹道。

“这是很基本的方法,更多精彩还在后面呢!”老师回答说,“好,这里不罗嗦了,让我们按照这个格式,给漏洞以最后一击,写出最终的利用程序――Exploit!”

[ 参看光盘中的程序FoxMail5.c ]

“我们先把邮箱清空,编译FoxMail5.c并执行,再用FoxMail接收邮件。只要一接收,就会在本机上添加一个名为‘w’的管理员用户了,大家看图1-30。”

“也!太帅了!”

“大家也注意到了吧,通过我们的实际编写,发现只要用户用FoxMail一收邮件,就会马上触发。而不是像有些厂商传闻的那样只在用户回复该邮件时才被触发。所以国内外软件开发公司对待漏洞发现者的态度、漏洞本身的态度、对产品使用用户公布漏洞信息的态度……”老师逐渐沉默了。

“是啊,厂商还居然说是漏洞发现者的炒作,这简直太不负责任了!明明有问题,还不敢承认。”同学们一个个义愤填膺!

“算了,我们这里只讨论技术,其他方面就不多评论了。”老师又恢复了原来的生气,“这里再和大家一起总结下对FoxMail的利用过程吧!”

“第一步、精确定位返回点。我们用求余取整法可巧妙得到返回位置。”

“第二步、ShellCode编写。我们直接用别人写好的ShellCode。”

“第三步、JMP ESP的地址。我们使用Lion共享的中文通用地址――0x7ffa4512。”

“最后把它们合起来,由于返回点后面不远处不能覆盖,所以我们把组合位置作稍稍改变,把ShellCode放前面,RET后面放一个往前跳的指令,用这样的方式跳到我们的ShellCode中。”

“ShellCode的功能是添加用户。好了,这样就完成了我们首个缓冲区漏洞的利用编写了,是真实的漏洞哦!感觉怎么样啊?”

“太有成就感了!”同学们嚷道。

“呵呵,那就好,兴趣就是这样培养起来的,有了兴趣就会更有动力钻研下去,钻研也是真正的黑客精神的一部分。大家休息一下,然后我们再继续。”