5.7.1 利用Ollydbg定位溢出点

“首先,我们还是看看漏洞的公告和原因,如图5-18。”老师说道。

“漏洞公告上说Serv_U在处理MDTM命令时有溢出漏洞,MDTM是什么命令啊?”同学们问道。

“Serv_U是FTP的服务器,当然遵守FTP协议的规范,但也有自己的一些独特命令和功能。”

“任何FTP服务器都是这样的。而MDTM命令是关于文件时间的命令,它可查看文件的时间,如 MDTM /ww0830.txt ,也可修改文件的时间,如 quote mdtm 20020102112233+123 /ww0830.txt 。”

“当用MDTM命令修改文件的时间时,如果参数过长,就会引发标准的堆栈溢出!”

“我们先来引发一下这个漏洞,我们登陆Serv_U的服务器,先输入用户名和密码,注意,该漏洞没有权限的帐号都可以利用。这里是用匿名登陆的。”

“然后输入MDTM命令和超长参数,敲回车,如果对方有漏洞,服务器就会挂掉。如图5-19。”

“果然服务挂了啊!真想不到,看起来不起眼的参数小漏洞,都有可能造成系统被攻破啊!”台下说道。

“千里之堤,毁于蚁巢,就是这个道理。”老师接着说,“我们来利用它吧!首先是定位溢出点。”

“但这里没有弹出出错对话框啊!怎么用对话框的方法定位呢?”

小知识:Ollydbg

OllyDbg是一个32位汇编级的直观分析调试器。是个非常好的动态跟踪调试工具,和TRW、SOFTICE相比,没有工作在核心态,可边调试边进行其他应用程序工作,比如听歌、查资料。界面非常人性化,调试方便,可以随意加注释、复制、跟踪堆栈的变化。还有强大的右键功能,使用起来特别方便。

“对于这种漏洞,我们就要用调试利器Ollydbg了(光盘有收录)!”老师说道,“重新启动Serv_U,运行Ollydbg,并附加到Serv_U的进程。方法是在Ollydbg的‘File’菜单下选中‘Attach’,如图5-20。”

  

“然后在弹出的进程对话框中选中‘ServUDaemon’,并点中‘Attach’。这样,Ollydbg就加载了Serv_U进程,如图5-21。”

  

“加载后Serv_U会被暂停,我们按F9让Serv_U继续运行起来。”老师一步步的演示起来。

“好,我们再登陆,输入MDTM命令和超长的参数。Serv_U又挂掉了,但Ollydbg截获了出现的异常,在状态栏上显示了 Access violation when reading [34343435] ,如图5-22。”

  

“哦!是0x34343435地址不可读!”大家说道。

“对,0x34343435是我们输入的过长参数。它把Serv_U程序要用的变量覆盖了,当然会有异常了。”

“哦?引发了异常?莫非我们用覆盖溢出处理点的方法利用?”宇强问道。

“是啊!”老师说道,“更进一步,我们用Ollybug定位异常处理点吧!按Shift+F9进入异常处理,嗯?又报错了,[34343434]不能执行。如图5-23。”

  

“哦!0x34就是十进制的4,也是我们输入的参数,”同学们说道,“看来我们可以控制这里要执行的0x34343434哦!”

“对!其实这里的0x34343434就是异常处理入口点。”老师说道。

“哦?那ebx应该是指向它前方的数了?”大家想起前面讲过的覆盖异常处理点的方法,如图5-24。

  

“异常处理程序的入口是0x34343434,那么ebx应该是指向0x33333333?”宇强说了这句话后,大家仔细看了看Ollydbg的寄存器窗口。

“啊?ebx怎么是0啊?”大家都很吃惊,“这怎么定位啊?”

“在Windows 2000下作异常处理时,ebx的确是在异常处理程序入口的前方;”老师说道,“但在XP下,ebx会变为0,我们就要用另一种方法定位了。”