供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“execsomethi
g”,其中somthi
g就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。三、缓冲区溢出攻击的实验分析2000年1月,Cerberus安全小组发布了微软的IIS45存在的一个缓冲区溢出漏洞。攻击该漏洞,可以使Web服务器崩溃,甚至获取超级权限执行任意的代码。目前,微软的IIS45是一种主流的Web服务器程序;因而,该缓冲区溢出漏洞对于网站的安全构成了极大的威胁;它的描述如下:浏览器向IIS提出一个HTTP请求,在域名(或IP地址)后,加上一个文件名,该文件名以“htr”做后缀。于是IIS认为客户端正在请求一个“htr”文件,“htr”扩展文件被映像成ISAPI(I
ter
etServiceAPI)应用程序,IIS会复位向所有针对“htr”资源的请求到ISMDLL程序,ISMDLL打开这个文件并执行之。浏览器提交的请求中包含的文件名存储在局部变量缓冲区中,若它很长,超过600个字符时,会导致局部变量缓冲区溢出,覆盖返回地址空间,使IIS崩溃。更进一步,在如图1所示的2K缓冲区中植入一段精心设计的代码,可以使之以系统超级权限运行。四、缓冲区溢出攻击的防范方法缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的I
ter
et用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。
f目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。在四1中介绍了通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。在四2中介绍了强制写正确的代码的方法。在四3中介绍了利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消r