- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 667字
- 2020-10-30 17:56:46
2.6.6 棧溢出保護器
在4.1版本中,GCC引入了棧溢出保護(SSP)的功能,它實現了來自StackGuard的探測儀[Etoh 2000]。SSP也被稱為ProPolice,它是GCC的一個擴展,用以保護用C編寫的應用程序免遭大多數常見形式的棧緩沖區溢出的漏洞利用,它以GCC的中間語言翻譯器的形式實現。SSP提供了緩沖區溢出檢測和變量重排序技術來防止對指針的破壞。特別是,SSP對局部變量重排序,將緩沖區放到指針后面,并且將函數參數中的指針復制到局部變量緩沖區之前的區域,從而防止了對指針的破壞(這些指針可被用于進一步破壞任意內存位置)。
SSP特性通過GCC的命令行參數啟用,-fstack-protector和-fno-stack-protector選項可以為帶有易受攻擊的對象(如數組)的函數打開或關閉棧溢出保護。-fstack-protector-all和-fno-stack-protector-all選項可以打開或關閉對每一個函數的保護,而不僅僅局限于對具有字符數組的函數的保護。最后,使用-fstack-protector時,-Wstack-protector option選項對沒有獲得棧保護的函數發出警告。
SSP的工作原理是引入一個探測儀變量,以檢測對棧上的參數、返回地址和前面的幀指針的改變。SSP用如下步驟將代碼片段插入到合適的位置:在應用程序初始化期間,產生一個隨機數作為哨位值,以防止未授權用戶的窺探。遺憾的是,這個動作很容易耗盡系統的熵。
SSP還提供了一種更安全的棧結構,如圖2.18所示。
圖2.18 棧溢出保護(SSP)棧結構
此結構建立了以下限制:
·位置(A)沒有數組或指針變量。
·位置(B)有數組或包含數組的結構。
·位置(C)沒有數組。
將哨位放到包含數組的數據區(B)后面可以阻止對參數、返回地址、前幀指針(previous frame pointer)或局部變量(不包括其他數組)進行覆蓋的緩沖區溢出攻擊。例如,編譯器不能重新排列struct成員,所以如下類型的棧對象仍未得到保護。
1 struct S { 2 char buffer[40]; 3 void (*f)(struct S*); 4 };
- Mastering NetBeans
- 在最好的年紀學Python:小學生趣味編程
- JavaScript Unlocked
- Ext JS Data-driven Application Design
- iOS應用逆向工程(第2版)
- IBM Cognos Business Intelligence 10.1 Dashboarding cookbook
- 軟件測試教程
- 智能手機APP UI設計與應用任務教程
- QGIS Python Programming Cookbook(Second Edition)
- OpenCV with Python By Example
- Java程序設計與項目案例教程
- Python Machine Learning Blueprints:Intuitive data projects you can relate to
- 精通Spring:Java Web開發與Spring Boot高級功能
- Java程序設計
- 樹莓派開發從零開始學:超好玩的智能小硬件制作書