我玩弄緩衝區溢出,但我在Mac OS上運行以下簡單的C程序時發現我所困惑的。期待它沒有得到一個分段錯誤
#include <stdio.h>
int main(void) {
char buf[2];
scanf("%s", buf);
printf("%s\n", buf);
}
通過BUF的長度設置爲2個字節,我希望輸入字符串「CCC」時,導致段錯誤,但這並沒有發生。只有輸入長度爲24個字符的字符串時,纔會產生分段錯誤。
發生了什麼事?這與字符編碼有關嗎?
謝謝。
我明白了。我認爲便士已經下降。一個惡意的攻擊者會試圖溢出堆棧的其餘部分,並因此覆蓋寄存器?但是,他們如何預測剩餘的籌碼?操作系統每次都會分配固定數量的內存嗎? –
查看裝配輸出和試錯法是確定「剩餘堆疊」的最佳選擇。這是可能的,但不能保證,在_same environment_中執行_same binary_時,這將保持不變。緩衝區溢出不會覆蓋寄存器。他們覆蓋堆棧或堆。 – Mat
@Martin典型的想法是溢出堆棧中的緩衝區,以便覆蓋堆棧上的一些數據,指示CPU從函數返回後將返回的位置。有關更多詳細信息,請嘗試使用Google搜索「粉碎堆棧」。 –