本实验的演示程序如下。
程序编译好以后,用OllyDbg加载上生成的overflow.exe文件,进行调试。如图2-119所示,OllDbg的左上部分是反汇编编辑窗口,灰色选择部分就是main()函数的反汇编代码。右上部分是寄存器窗口;左下部分是数据区窗口,现在00406030地址开始存放的是字符串bigbuff[]的数据,即10个a(ASIIC码61),右下部分是堆栈窗口。
图2-119 OllyDbg反汇编信息
接下来介绍Windows平台下的溢出过程。
(1)把光标放到程序中的calloverflow位置,然后按【F4】键执行到地址0040100C(strcpy的那行),这时堆栈如图2-120所示。常用的快捷键介绍:【F4】,运行到选定的位置,作用就是直接运行到光标所在的位置处暂停;【F8】,单步步过,每按一次键,执行反汇编窗口中的一条指令,遇到CALL等子程序,不进入其代码;【F7】,单步步入,功能同【F8】类似,遇到CALL等子程序,进入后,首先会停留在子程序的第一条指令上。
堆栈内容说明如下。
堆栈底部是两个压栈的参数,00406030地址里的字符$会向地址0012FF7C中复制,在堆栈内,地址“0012FF84”处原先存放了main()函数的返回地址。
(2)按【F7】键执行完strcpy()操作,此时堆栈内容变化如图2-121所示。(www.daowen.com)
图2-120 OllyDbg反汇编信息
图2-121 OllyDbg反汇编信息
(3)执行完strcpy()函数,复制了字符串后返回地址被覆盖。smallbuff()数组理论上是分配了5个字节的空间。由于执行strcpy()函数前没有进行数组长度检查,把10个字节长的字符串复制到了8个字节的空间内。61是小写字母a的十六进制ASCII码,结果缓冲区内被字母a填满了,还溢出覆盖了紧跟着缓冲区的返回地址,现在的返回地址被覆盖为00006161,这样就造成了一次缓冲区溢出,如图2-122所示。
图2-122 执行完RETN后显示的信息
发生溢出后,进程可能的表现有3种:一是运行正常,这时,被覆盖的是无用数据,并且没有发生访问违例;二是运行出错,包括输出错误和非法操作等;第三种是受到攻击,程序开始执行有害代码,此时,哪些数据被覆盖和用什么数据来覆盖都是攻击者精心设计的。一般情况下,静态存储区和堆上的缓冲区溢出漏洞不太可能被攻击者利用,而桟上的漏洞则具有极大的危险性。
上述的缓冲区溢出例子中,只是出现了一般的拒绝服务的效果。但是,实际情况往往并不是这么简单。当黑客精心设计这一个EIP(Execute Interface Program,执行接口程序),使得程序发生溢出之后改变正常流程,转而去执行他们计好的一段代码(也即ShellCode),攻击者就能获取对系统的控制,利用ShellCode实现各种功能,例如,监听一个端口,添加一个用户,等等。这也正是缓冲区溢出攻击的基本原理。目前流行的缓冲区溢出病毒,如“冲击波”蠕虫病毒、“震荡波”蠕虫病毒等,就都是采用同样的缓冲区溢出攻击方法对用户的计算机进行攻击的。本地缓冲区溢出比较简单,远程缓冲区溢出要复杂一些,这里就不再叙述了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。