解决缓冲区溢出方法
缓冲区溢出的目的在于扰乱具有某些特权运行程序的功能,这样就可以让攻击者取得程序的控制权,从而进行缓冲区溢出攻击行为。假如该程序具有足够的权限,那么整个主机甚至服务器就被控制了。
在被攻击程序地址空问里安排攻击代码的方法 1.植人法 攻击者向被攻击的程序输人一个字符串,程序会把这个字符串放到缓冲区里。这个字符串所包含的数据是可以在这个被攻击的硬件平台运行的指令流。在这里攻击者用被攻击程序的缓冲区来存放攻击代码,具体方式有以下两方面差别: .攻击者不必为达到此目的而溢出任何缓冲区,;叮以找到足够的空间来放置攻击代码; .缓冲区可设在任何地方:堆栈(存放白动变量)、堆(动态分配区)和静态数据区初始化或未初始化的资料. 2.利用已经存在的代码 很多时候攻击者所要的代码已经存在于被攻击的程序中了,攻击者所要做的只是对代码传递一些参数,然后使程序跳转到想要执行的代码那里。比方说,攻击代码要求执行“ex-ec( "/bin/sh") ",而在libc库中的代码执行“exec( arg) ",其中arg是一个指向字符串的指针参数,那么攻击者只要把传人的参数指针改为指向“/bin/sh",然后跳转到libc库中相应的指令序列即可。
控制程序转移到攻击代码的方法
上面讲到的方法都是在试图改变程序的执行流程,使之跳转到攻击代码。其基本特点就是给没有边界检查或有其他弱点的程序送出一个超长的缓冲区,以达到扰乱程序正常执行顺序的目的。通过溢出一个缓冲区,攻击者可以用近乎暴力的方法(穷尽法)改写相邻的程序空问而直接跳过系统的检查。 这里的分类基准是攻击者所寻求的缓冲区溢出的程序空问类型。原则上可以是任意的空问。比如起初的 Moms Worm(穆尔斯蠕虫)就是使用了fingerd程序的缓冲区溢出,扰乱fingerd要执行的文件的名字。其实许多缓冲的区溢出是用暴力的方法来寻求改变程序指针的。这类程序不同的地方就是程序空间的突破和内存空间的定位不同。通常情况下,控制程序转移到攻击代码的方法有下面几种: 1.函数返回地址 在一个函数调用发生时,调用者会在堆栈中留下函数返回地址,它包含了函数结束时返回的地址。攻击者通过溢出这些自动变量,使这个返回地址指向攻击代码,这样当函数调用结束时,程序跳转到攻击者设定的地址,而不是原先的地址。这种缓冲区溢出被称为“stacksmashing attack" ,是目前常用的缓冲区溢出攻击方式。 2.函数指针 "void( * foo) ()”中声明了一个返回值为void函数指针的变量foo。函数指针定位任何地址空间,所以攻击者只要在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出来改变A数指针,当程序通过函数指针调用函数时,程序的流程就会发生改变而实现攻击者的目的。 3.长跳转缓冲区 在C语言中包含了一个简单的检验/恢复系统,称为“setjmp/longjmp" ,意思是在检验点设定“setjmp ( buffer) ",用“longjmp( buffer)”来恢复检验点。可是,假如攻击时能够进人缓冲区的空间,那么“longjmp( buffer)”实际_I:是跳转到攻击者的代码。像函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003,攻击者首先进人用来恢复缓冲区溢出的longjmp缓冲区,然后诱导进人恢复模式,这样就使Perl的解释器跳转到攻击代码L了。
综合代码植人和流程控制技术
最常见和最简单的缓冲区溢出攻击类型就是在一个字符串里综合了代码植人和启动记录。攻击者定位一个可供溢出的自动变Q,接着向程序传递一个很大的字符串,在引发缓冲区溢出改变启动记录的同时植人了代码(C语言程序员习惯上只为用户和参数开辟很小的缓冲区)。 代码植人和缓冲区溢出不一定要在一次动作内完成,攻击者可以在一个缓冲区内放置代码(这时并不能溢出缓冲区),接着攻击者通过溢出另一个缓冲区来转移程序的指针。这样的方法通常用来解决可供溢出的缓冲区不够大(不能放下全部的代码)。如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数。举例说明,在libc(几乎所有的C程序都用它来连接)中的一部分代码段会执行“exec( something) ",其中的something就是参数,攻击者使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出攻击,使程序指针指向lihc中的特定的代码段。
此三种方法最为常见,溢出攻击需要配合具体参数来操作。
版权声明:本站【趣百科】文章素材来源于网络或者用户投稿,未经许可不得用于商用,如转载保留本文链接:https://www.qubaik.com/life/22381.html