一.缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。

二.原理



通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到***的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:



voidfunction(char*str){



charbuffer[16];strcpy(buffer,str);



}



上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。



缓冲区溢出***的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得***者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。

为了达到这个目的,***者必须达到如下的两个目标:



⒈在程序的地址空间里安排适当的代码。



⒉通过适当的初始化寄存器和内存,让程序跳转到***者安排的地址空间执行。



根据这两个目标来对缓冲区溢出***进行分类。



三.防范方法



目前有四种基本的方法保护缓冲区免受缓冲区溢出的***和影响。



1 通过操作系统使得缓冲区不可执行,从而阻止***者植入***代码。



2强制写正确的代码的方法。



3利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。



4介绍一种间接的方法,这个方法在程序指针失效前进行完整性检查。虽然这种方法不能使得所有的缓冲区溢出失效,但它能阻止绝大多数的缓冲区溢出***。



转载于:https://blog.51cto.com/shktch/1309216