[英]Why buffer overflow doesn't affect to this code?
我有以下代碼:
int main(int argc, char *argv[])
{
char ch[10];
printf("String 10 max. :: "); gets( ch );
printf("String: %s\n", ch);
return 0;
}
當我使用"12345678"
作為ch
運行它時,它運行良好。 奇怪的是,當我運行"123456789012345678901234567890"
! 第二個printf
所有字符串(30個字符)打印到屏幕上。
為什么會這樣? 為什么我的代碼沒有崩潰?
謝謝你的時間,
阿茲台克
緩沖區溢出是未定義的行為。 它可能會崩潰,但是沒有人保證。 在大多數編譯器中,堆棧會變小,因此您可能會覆蓋main
的返回地址,但對printf
的調用不會覆蓋您的字符串。
如果您試圖從尚未映射的頁面進行讀取/寫入,則緩沖區溢出只會導致“崩潰”(即分段錯誤)。 在這種情況下,內存管理單元會捕獲該錯誤。
如果您尚未到達頁面末尾(例如您的示例),則從操作系統/處理器的角度看,該點的內存仍然有效-您只是在覆蓋可能由另一個變量使用的內存。
您沒有看到任何效果,因為您沒有更多的局部變量,將代碼更改為此,您將
int main(int argc, char *argv[])
{
char ch[10];
int i=42;
printf("String 10 max. :: "); gets( ch );
printf("String: %s\n", ch);
printf("i: %d\n", i);
return 0;
}
通過使用不應該使用的內存,您正在輸入未定義行為的領域。 它今天不會在您的計算機上崩潰。 但是行為可能會更改,而不會發出警告。
值得的是,當我在cygwin shell上運行相同的代碼時,
Segmentation fault (core dumped)
緩沖區溢出的影響完全取決於您覆蓋的內容,覆蓋的內容以及隨后如何使用覆蓋的數據。
緩沖區溢出利用的方法包括使用溢出來修改函數的返回地址。 但是從main()
返回到OS可能與從函數返回不完全相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.