堆栈的缓冲区溢出
我们在做项目的过程中遇到过一个问题:打开底层板卡,对板卡进行读写的时候,板卡的句柄莫名奇妙改变了,而我们没有显式改变过它。
其实这是一类问题,就是局部变量莫名其妙被修改。这是由于堆栈的缓冲区溢出造成的,主要现象是:1.某些局部变量莫名其妙被改 2.函数返回的时候崩溃
主要原因是:1. 数组越界 2.某些缓冲区拷贝函数如 sprintf ,strcpy,memcpy缓冲区溢出,在strcpy时是否注意‘\0'。
我们假设程序运行的栈是满递减的,那么程序在调用函数压栈过程如下:过程A调用过程B
A的栈帧在调用B之前,先将B的函数参数入栈,并将返回地址入栈,最后A的%ebp入栈,然后mov %esp,%ebp,进入B的栈帧。在B的栈中首先会申请所有的局部变量的栈空间,无论如何,数组中靠后的数一定比靠前的数的栈地址高,如A[8]会在高栈地址,A[0]在低端地址,因此A[8]之上还有其它局部变量,如果A数组溢出,会覆盖掉其它局部变量,甚至会覆盖掉过程B的返回地址导致程序崩溃。
以上是栈缓冲区溢出导致编程过程中的错误,还有一种情况是:某些全局变量被修改,或者程序调用不正常。这个我们用凌明老师给出的图来解释,如下,这个过程原因是堆栈溢出,即堆栈不够用,溢出的数据覆盖了相邻的全局后者静态数据区导致的。