C语言中,函数在调用一个数组时,如果局部数组写入产生了越界,则会导致函数的返回地址被覆盖掉,从而破坏调用函数的栈帧。
而数组越界写入就是破坏堆栈的原因有以下两点:
1、入口参数是在栈底(内存高位)附近(函数的返回地址也在附近)
2、数组的存放是从内存低位向高位存放。所以,如果数组大小是4字节,如果越界写入,就会向上破坏相邻高位内存中保存的数据,可能是前面的局部变量,当越界写入内容足够多,就会破坏栈底保存的函数的返回地址,直接导致函数返回时发生崩溃。
例如:
#include<stdio.h>
#include<windows.h>#include<string.h>#PRagma warning(disable:4996)/*************************************局部数组越界会导致函数的返回地址被覆盖掉,因为局部数组的存储空间在函数的返回地址下面*****************/int main(){char buf[5];strcpy(buf, "hello Word welcome to shanxi xian everybody");/*被复制粘的字符串长度超过数组长度,则会覆盖main函数的返回地址*/printf("%s", buf);//exit(0);程序正常退出,main函数直接返回,无需地址;system("pause");return 0;//不return就不会使用覆盖地址}新闻热点
疑难解答