3
我正在學習一個項目,基本上我們正在嘗試學習堆棧溢出。那我工作的一些示例代碼基本上是:(下調)gcc -fno-stack-protector選項
char test[10];
int i;
for (i=0;i < 10000;i++) {
test[i] = 'a';
}
當我編譯這個用gcc,一切工作都很好,很正常。海灣合作委員會自動保護堆棧,永遠不會讓它溢出。現在,如果我嘗試使用gcc -fno-stack-protector ....則完全相同的程序運行。我甚至在彙編文件(-S選項)上做了一個diff,它們是相同的。是什麼賦予了?我通過手冊頁搜索,並沒有提及-fno-stack選項......一切都在線指向-fno-stack-protector選項,但我一直無法重新創建任何內容......
非常感謝您的幫助。 :)
Hmmmmmmmm。我一直在研究它,似乎雖然足夠奇怪的堆棧保護不是默認啓用的,所以-fno-stack-protector選項沒有任何作用。我必須使用-fstack-protector選項來啓用堆棧保護,這使得我的應用程序在運行後會拋出segfault。因此,堆棧保護會導致應用程序拋出分段錯誤,而沒有堆棧保護可讓代碼隨意修改堆棧? – 2012-03-06 09:21:57
取決於系統(發行版),最好指望「沒有設置,除非設置它」。此外,一些優化。標誌設置它(-O3,不認爲O2做它)。 – AoeAoe 2012-03-06 09:28:17
@Glen你的程序運行是巧合,可能比segfault更糟糕。它很高興地在禁用堆棧保護的時候註銷了陣列的末尾,你只是不知道它(因爲沒有檢查你是否在界限內)。它可能已經用delete_hard_drive或launch_the_missiles覆蓋了printf的地址,而你只是不知道,因爲在這次運行中你沒有調用printf。大聲的撞車通常比靜靜地失敗更好。 – 2012-07-02 03:27:14