C語言中,函數(shù)在調(diào)用一個(gè)數(shù)組時(shí),如果局部數(shù)組寫入產(chǎn)生了越界,則會(huì)導(dǎo)致函數(shù)的返回地址被覆蓋掉,從而破壞調(diào)用函數(shù)的棧幀。
而數(shù)組越界寫入就是破壞堆棧的原因有以下兩點(diǎn):
1、入口參數(shù)是在棧底(內(nèi)存高位)附近(函數(shù)的返回地址也在附近)
2、數(shù)組的存放是從內(nèi)存低位向高位存放。所以,如果數(shù)組大小是4字節(jié),如果越界寫入,就會(huì)向上破壞相鄰高位內(nèi)存中保存的數(shù)據(jù),可能是前面的局部變量,當(dāng)越界寫入內(nèi)容足夠多,就會(huì)破壞棧底保存的函數(shù)的返回地址,直接導(dǎo)致函數(shù)返回時(shí)發(fā)生崩潰。
例如:
#include<stdio.h>
#include<windows.h>#include<string.h>#PRagma warning(disable:4996)/*************************************局部數(shù)組越界會(huì)導(dǎo)致函數(shù)的返回地址被覆蓋掉,因?yàn)榫植繑?shù)組的存儲(chǔ)空間在函數(shù)的返回地址下面*****************/int main(){char buf[5];strcpy(buf, "hello Word welcome to shanxi xian everybody");/*被復(fù)制粘的字符串長(zhǎng)度超過數(shù)組長(zhǎng)度,則會(huì)覆蓋main函數(shù)的返回地址*/printf("%s", buf);//exit(0);程序正常退出,main函數(shù)直接返回,無需地址;system("pause");return 0;//不return就不會(huì)使用覆蓋地址}新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注