作者:风泽
出处:[CGI] [EST]
因为本人也只是粗浅的懂一点缓冲区溢出的知识,考虑了好久决定写出来,如果有错误和不足的地方请指出,希望这篇拙文能给你点帮助。如果你已经学过的话,就不必在看了,这些只是一些基础。
缓冲区:缓冲区就是程序运行时计算机内存中的一个连续的块,他保存了各种类型的数据。在分配同一数据类型的相邻块时,这块区域被称为缓冲区(他们是程序运行时分配的)。我们经常谈的缓冲区溢出就是在向这块内存区域写入超过他所能放入数据的量,而发生溢出的情况。
现在很多人使用c和c++写程序,因为c语言的功能实在是太强大了,但是由于他没做执行数组边界检查和类型安全检查,所以使得他属于非安全型语言。所以很多溢出都和c语言有关。所以想成为高手,c语言就是敲门砖。
例子:一个c程序,它让你输入数据,并为你分配了M个字节,如果你输入了多于M字节的数据的话程序就很可能造成缓冲区溢出
char input[]="123456";
char output[5];
strcpy(output,input);
以上程序就会发生溢出了,因为input[]超过了output[]的容量。
如果将 strcpy(output,input);改成 strcpy(output,input, sizeof(output));的话就不会溢出了。
所以我们要进可能的避免应用c中危险的函数,如:
strpy()
strcat()
sprintf()
scanf()
vsprintf()
vscanf()
streadd()
…
还有好几个,我就不在写出来了。
基础知识:
一个程序运行时,他在内存中的映像可一分为:代码段,数据段,堆栈段。缓冲区的溢出就是利用堆栈段溢出的。
堆栈就是内存中一个连续的块,堆栈指针指向堆栈的栈顶,堆栈的底部是一个固定地址,堆栈特点是后进先出,就象你从达能饼干袋子里面拿饼干一样。他支持PUSH和POP 操作。
PUSH是将数据放到栈的顶端。
POP是将栈顶的数据取出来。
在c语言中,程序函数调用和函数中的临时变量都用到堆栈,参数的传递和返回值也用到了堆栈,所以c程序很容易发生溢出。大家都知道栈的资源是有限的,每次调用一个函数,他的空间都会比上次小,所以过多的定义局部变量和数组很容易引发栈的空间短缺,导致程序出错,这个不是缓冲区的溢出,应该只能说是个条件,至于堆更是不太好好把握的,特别是指针,只要稍微一点不注意释放堆空间,就会发生想不到的错误。
至于怎样溢出,在什么地方溢出能够获得最高权限,不是我们能达到的,所以想要进一步学习的朋友最好买点针对缓冲区溢出的书看看。