官术网_书友最值得收藏!

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  };

主站蜘蛛池模板: 桐乡市| 沂南县| 景德镇市| 丹江口市| 理塘县| 固原市| 盐池县| 灵山县| 清新县| 麟游县| 大足县| 汤阴县| 九台市| 乌兰察布市| 塘沽区| 沧州市| 杭锦后旗| 佛学| 定襄县| 南雄市| 遂昌县| 阳东县| 潜山县| 垫江县| 屏山县| 宜昌市| 阿城市| 启东市| 西丰县| 夏河县| 裕民县| 精河县| 宝鸡市| 渭源县| 高邑县| 盘山县| 滨州市| 广丰县| 威远县| 郁南县| 垫江县|