簡體   English   中英

為什么緩沖區溢出不會影響此代碼?

[英]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.

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