簡體   English   中英

gcc選項-fstack-check是如何工作的?

[英]How does the gcc option -fstack-check exactly work?

當我添加選項-fstack-check和-fstack-protector時,我的程序崩潰了。 在后跟蹤中調用__stack_chk_fail。

那我怎么知道問題在哪里呢? 什么-fstack-check真的檢查? 關於gcc的信息似乎太大了,無法找到答案。

檢查裝配程序后。 我認為-fstack-check,會將代碼寫入0寫入堆棧指針的偏移量,因此為了測試程序是否訪問了違規地址,程序如果發生了則崩潰了。 例如mov $ 0x0,-0x928(%esp)

“`-fstack-protector'發出額外的代碼來檢查緩沖區溢出,例如堆棧粉碎攻擊。這是通過向具有易受攻擊對象的函數添加一個保護變量來完成的。這包括調用alloca的函數,以及緩沖區大於8的函數輸入功能時初始化保護,然后在功能退出時檢查保護。如果保護檢查失敗,則打印錯誤信息,程序退出“

控制優化的GCC選項

GCC擴展,用於保護應用程序免受堆棧粉碎攻擊

粉碎堆棧的樂趣和利潤

我希望這會給一些線索..

-fstack-check :如果兩個特征宏STACK_CHECK_BUILTINSTACK_CHECK_STATIC_BUILTIN保留在默認值0,則它只是在堆棧增長時每4kb(頁面)插入一個NULL字節。 默認情況下只有一個,但是當堆棧可以增長多個頁面時,這是最危險的情況,每4KB。 linux> 2.6在堆棧和堆之間只有一個小的頁面間隙,這可能導致自2005年以來已知的堆棧間隙攻擊。請參閱C中通過GCC -fstack-check選項進行匯總時引發的異常 它至少從2.95.3開始在gcc中啟用,從3.6開始。

__stack_chk_fail是插入的-fstack-protector代碼,用於驗證插入的堆棧canary值,該值可能被簡單的堆棧溢出覆蓋,例如通過遞歸。

暫無
暫無

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

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