扫一扫
关注微信公众号

什么是缓冲区溢出攻击?这种攻击有哪些类型?
2007-09-29   网络

在黑客的攻击活动中,利用缓冲区溢出安全漏洞发起的攻击占了远程网络攻击的绝大多数。这种漏洞的严重性,在于可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。缓冲区溢出攻击之所以成为一种常见的攻击手段,原因在于缓冲区溢出漏洞太普遍,对它的利用易于实现。缓冲区溢出漏洞给予了攻击者所希望的一切:植入攻击代码并且执行代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,进而取得被攻击系统的控制权。

缓冲区溢出攻击有多种形式,相应的防卫手段也随攻击方法的不同而不同。缓冲区溢出攻击的目的,在于扰乱具有某些特权运行的程序的功能,使得攻击者取得程序的控制权。如果该程序具有足够的特权,整个主机就能够被控制。例如对于UNIX系统,攻击者可以通过攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root的shell。为了达到利用缓冲区溢出漏洞进行攻击的目的,攻击者必须实现这样两个目标:在程序的地址空间里安排适当的代码;通过适当地初始化寄存器和存储器,让程序跳转到精心安排的地址空间执行。根据这两个目标,可以对缓冲区溢出攻击进行分类。

1.在程序的地址空间里安排适当代码的攻击方法

存在两种在被攻击程序地址空间里安排攻击代码的方法,植入法和利用已经存在代码的方法。植入法是攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的数据是可以在这个被攻击的硬件平台上运行的指令序列。在这里攻击者用被攻击程序的缓冲区来存放攻击代码。为了实现这个目标,攻击者可能在不必溢出任何缓冲区的情况下,就找到足够的空间来放置攻击代码,也可能存放在缓冲区可以设置的任何地方,如堆栈、动态分配的堆和静态数据区等。利用已经存在代码的方法,是指攻击者希望使用的代码已经存在于被攻击的程序中,攻击者所要做的只是对代码传递一些参数,然后使程序跳转到指定的目标。例如对于UNIX系统,攻击代码要求执行“exec("/bin/sh")”,而在libc库中的代码执行“exec(arg)”,其中arg是一个指向一个字符串的指针参数,攻击者只要把传入的参数指针改向指向"/bin/sh",然后就可以转到libc库中的相应指令序列。

2.控制程序转移到攻击代码的方法

控制程序转移到攻击代码的思路是寻求改变程序的执行流程,使之跳转到攻击代码。采用的基本手段是溢出一个没有边界检查或者其他弱点的缓冲区,从而扰乱程序的正常执行顺序。通过溢出一个缓冲区,攻击者可以用近乎暴力的方法改写相邻的程序空间,直接跳过系统的检查。按照攻击者所寻求的缓冲区溢出程序的空间类型,可以对这类攻击进行分类。许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的区别在于程序空间的突破和内存空间的定位不同。例如,当一个函数调用发生时,调用者会在堆栈中留下一个激活纪录(Activation Records),它包含了函数结束时返回的地址。攻击者可以通过溢出这些自动变量,使这个返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为“stack smashing attack”,是目前常用的缓冲区溢出攻击方式。利用函数指针(Function Pointers)是另一种方法,函数指针可以用来定位任何地址空间。攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。当程序通过函数指针调用函数时,程序的流程就能够按照攻击者意图改变。攻击者还可以利用长跳转缓冲区(Longjmp buffers)。在C语言中包含了一个简单的检验/恢复系统,称为 setjmp/longjmp,是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。如果攻击者能够进入缓冲区的空间,那么“longimp(buffer)”就可以作为跳转到攻击者的代码。攻击者就是要找到一个可供溢出的缓冲区。


热词搜索:

上一篇:什么是局域网监听?如何防范?
下一篇:如何防范缓冲区溢出攻击?

分享到: 收藏