簡體   English   中英

堆棧與堆溢出檢測

[英]stack vs heap overflow detection

在像 linux 這樣的按需分頁系統中,我讀到的頁面可能約為 4k,它通過檢查堆棧或堆大小是否超過給每個頁面的數量來確保保護。 當我創建兩個變量時

char *s = (char *) malloc(100);   
char sa[100];

在 for 循環中,我可以寫s[i] = 'c'; 幾乎 4000 次才出現 memory 錯誤,而sa[i] = 'c'; 編輯:對於大於數組大小的任何內容,我都會遇到segmentation faultstack smashing錯誤。

我可以理解在第一種情況下存在頁面錯誤,它看到沒有更多的頁面被分配給堆,因此違反了 memory。 但是在第二種情況下,gcc 會在運行時檢查所有預分配的變量嗎?
編輯:我在下面發布整個代碼

int main(int argc,char* argv[]){
char *s = (char *) malloc(20);
char sa[400] = {0};
int i ,count;
printf(" enter the number of chars to write: ");
scanf("%d",&count);
for (i=0;i<count;i++){
printf("%d\n",i);
sa[i] = 'a';
//s[i] = 'a';
}
free(s);

}

在許多 32 位操作系統上,堆棧向下增長。 您只在數組中使用正索引,因此它取決於您的 function 調用的嵌套深度。 當您從數組中索引時,您將首先覆蓋金絲雀。 所以堆棧粉碎錯誤是第一位的。 接下來,您將開始覆蓋 function arguments 和返回地址。 如果沒有金絲雀,這將導致 function 返回跳到永不着陸,通常會產生段錯誤。 並非總是如此,它可能會意外地落在有效代碼上,即堆棧緩沖區溢出攻擊背后的邏輯。

隨着您繼續前進,您最終將越過堆棧頂部寫入未分配的頁面。 那么段錯誤。 在一個嵌套調用很少的小型測試程序中,快速發生的嵌套調用需要幾千字節。

也可以嘗試使用負偏移量。 這可以持續一段時間,否則不會導致任何事故,因為您正在寫入未分配的堆棧空間。 當您寫入超過分配的堆棧大小(通常為兆字節)時,就會出現段錯誤。 在 Windows 上,您將觸發堆棧保護頁面,生成一個為此站點命名的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM