關於對抗緩衝區溢出攻擊

緩衝區溢出說白了就是因爲內存中的非法訪問而導致的一些狀態的破壞。

這一點,C語言中的一些和數組有關的庫函數最容易導致這類情況。

緩衝區溢出攻擊,有很大一部分是通過數據的溢出,內存的非法訪問來執行一些攻擊代碼,因爲數據在棧中一旦溢出,那麼他就會覆蓋一些重要的狀態,從而被攻擊者操控。


那麼關於對抗緩衝區溢出的攻擊,有這樣的幾種方法


1、棧的隨機化

在植入緩衝區溢出攻擊的代碼的時候,還要植入指向這段代碼的指針,指針指向這段代碼的棧的位置。因爲執行這段代碼是考指針進行跳轉過去的。由於以前的操作系統程序的棧的位置相對來說比較固定,所以是很好找的。也就是說,每一次執行一個程序,他的程序棧的位置都是不固定的,這樣一來,第一個是很難植入攻擊代碼,第二個是即使你植入了,那麼你的指針要指向這段攻擊代碼的棧空間也很困難,因爲他是一直在變動的。


但是攻擊者仍然可以通過枚舉不同的地址進行攻擊。這裏有一個辦法就是在攻擊代碼之前加入空雪橇操作,即加入很長一段的nop操作來是程序計數器+1.

我對這種攻擊方式的理解是這樣的,攻擊的代碼已經嵌入到了一個程序的棧中,但是由於這個棧的位置在不斷的變化所以找不到這段攻擊代碼的準確位置。所以在攻擊代碼之前加入很長的一段Nop操作,使得程序計數器+1指向下一條指令。只要在執行nop操作的過程中能夠找到攻擊代碼相應的地址數據,就能夠跳轉到攻擊代碼進行執行。

要破解指定範圍內的棧的隨機化,就要進行不斷的嘗試,嘗試次數誠意nop的大小就能夠判斷出是否能夠破解。


2、棧破壞的檢測

由於我們不能夠真正的杜絕數組的越界書寫,我們找到一個新的辦法就是在超越局部緩衝區邊界的時候,在修改生效之前,先根據一個標誌值進行判定,如果越界修改那麼這個值肯定就會改變,那麼就拒絕這次訪問,這個值的音譯是金絲雀值,他的位置在局部緩衝區和局部棧狀態之間。也就是說,當局部緩衝區溢出想要影響到棧的狀態的時候,要先經過這個金絲雀的值纔行,這樣的話通過設立一個哨兵就 可以防止非法訪問的事實發生。並且這個值是隨機的,攻擊者是不能夠猜出它是什麼的。一般來說如果真的要使用這種辦法來防止棧的緩衝區溢出的時候,緩衝區向棧底的方向,相鄰的必須放置金絲雀值,不能放置任何其他的數值,因爲很可能會遭到破壞。


3、限制可執行代碼區域

很多系統對內存或者存儲器有着三種訪問形式的區別:可讀,可寫,可執行。這種方法就是要限定可執行的內存區域,從而讓攻擊代碼即使在內存也不能夠執行。

X86中,可讀和可執行合成爲一個標誌位來進行表示,這錯誤的,會給攻擊代碼留下機會。但是AMD就在內存保護中增加了NX位,也就看是不可執行位,把三個權限都分開了。通常來說,整個內存中應該都有可讀的權限,可執行的權限只有在保存編譯器產生代碼的存儲區域內纔會有。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章