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

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

主站蜘蛛池模板: 固安县| 昭苏县| 临武县| 封开县| 白城市| 屯昌县| 邯郸市| 郯城县| 太和县| 沾化县| 信丰县| 博野县| 邯郸市| 大名县| 万全县| 共和县| 大悟县| 清水河县| 阿合奇县| 上犹县| 北川| 长治市| 鄂托克旗| 弥勒县| 武清区| 建始县| 旅游| 南和县| 稷山县| 竹山县| 金塔县| 通渭县| 五家渠市| 建水县| 宕昌县| 马关县| 伊吾县| 内黄县| 杨浦区| 许昌县| 桂阳县|