久久―日本道色综合久久,亚洲欧美精品在线,狼狼色丁香久久婷婷综合五月,香蕉人人超,日本网站黄,国产在线观看不卡免费高清,无遮挡的毛片免费

2023信創(chuàng)獨角獸企業(yè)100強
全世界各行各業(yè)聯(lián)合起來,internet一定要實現(xiàn)!

對于緩沖區(qū)溢出的保護(hù)方法

2004-02-16 eNet&Ciweek

  四、程序指針完整性檢查 Top

  

  程序指針完整性檢查和邊界檢查有略微的不同。與防止程序指針被改變不同,程序指針完整性檢查在程序指針被引用之前檢測到它的改變。因此,即便一個攻擊者成功地改變程序的指針,由于系統(tǒng)事先檢測到了指針的改變,因此這個指針將不會被使用。與數(shù)組邊界檢查相比,這種方法不能解決所有的緩沖區(qū)溢出問題;采用其他的緩沖區(qū)溢出方法就可以避免這種檢測。但是這種方法在性能上有很大的優(yōu)勢,而且兼容性也很好。

  

  l、手寫的堆棧監(jiān)測

  

  Snarskii為FreeBSD開發(fā)丁一套定制的能通過監(jiān)測cpu堆棧來確定緩沖區(qū)溢出的libc。這個應(yīng)用完全用手工匯編寫的,而且只保護(hù)libc中的當(dāng)前有效紀(jì)錄函數(shù).這個應(yīng)用達(dá)到了設(shè)計要求,對于基于libc庫函數(shù)的攻擊具有很好的防衛(wèi),但是不能防衛(wèi)其它方式的攻擊.

  

  2、堆棧保護(hù)

  

  堆棧保護(hù)是一種提供程序指針完整性檢查的編譯器技術(shù).通過檢查函數(shù)活動紀(jì)錄中的返回地址來實現(xiàn)。堆棧保護(hù)作為gcc的一個小的補丁,在每個函數(shù)中,加入了函數(shù)建立和銷毀的代碼。加入的函數(shù)建立代碼實際上在堆棧中函數(shù)返回地址后面加了一些附加的字節(jié)。而在函數(shù)返回時,首先檢查這個附加的字節(jié)是否被改動過,如果發(fā)生過緩沖區(qū)溢出的攻擊,那么這種攻擊很容易在函數(shù)返回前被檢測到。但是,如果攻擊者預(yù)見到這些附加字節(jié)的存在,并且能在溢出過程中同樣地制造他們.那么它就能成功地跳過堆棧保護(hù)的檢測。通常.我們有如下兩種方案對付這種欺騙:

  

  1.終止符號

  

  利用在C語言中的終止符號如o(null,CR,LF,—1(Eof)等這些符號不能在常用的字符串函數(shù)中使用,因為這些函數(shù)一旦遇到這些終止符號,就結(jié)束函數(shù)過程了。

  

  2.隨機符號

  

  利用一個在函數(shù)調(diào)用時產(chǎn)生的一個32位的隨機數(shù)來實現(xiàn)保密,使得攻擊者不可能猜測到附加字節(jié)的內(nèi)容.而且,每次調(diào)用附加字節(jié)的內(nèi)容都在改變,也無法預(yù)測。通過檢查堆棧的完整性的堆棧保護(hù)法是從Synthetix方法演變來的。Synthetix方法通過使用準(zhǔn)不變量來確保特定變量的正確性。這些特定的變量的改變是程序?qū)崿F(xiàn)能預(yù)知的,而且只能在滿足一定的條件才能可以改變。這種變量我們稱為準(zhǔn)不變量。Synthetix開發(fā)了一些工具用來保護(hù)這些變量。攻擊者通過緩沖區(qū)溢出而產(chǎn)生的改變可以被系統(tǒng)當(dāng)做非法的動作。在某些極端的情況下,這些準(zhǔn)不變量有可能被非法改變,這時需要堆棧保護(hù)來提供更完善的保護(hù)了。實驗的數(shù)據(jù)表明,堆棧保護(hù)對于各種系統(tǒng)的緩沖區(qū)溢出攻擊都有很好的保護(hù)作用.并能保持較好的兼容性和系統(tǒng)性能。分析表明,堆棧保護(hù)能有效抵御現(xiàn)在的和將來的基于堆棧的攻擊。堆棧保護(hù)版本的Red Hat Linux 5.1已經(jīng)在各種系統(tǒng)上運行了多年,包括個人的筆記本電腦和工作組文件服務(wù)器。

  

  3、指針保護(hù)

  

  在堆棧保護(hù)設(shè)計的時候,沖擊堆棧構(gòu)成了緩沖區(qū)溢出攻擊的常見的一種形式。有人推測存在一種模板來構(gòu)成這些攻擊(在1996年的時候)。從此,很多簡單的漏洞被發(fā)現(xiàn),實施和補丁后,很多攻擊者開始用更一般的方法實施緩沖區(qū)溢出攻擊。指針保護(hù)是堆錢保護(hù)針對這種情況的一個推廣。通過在所有的代碼指針之后放置附加字節(jié)來檢驗指針在被調(diào)用之前的合法性,如果檢驗失敗,會發(fā)出報警信號和退出程序的執(zhí)行,就如同在堆棧保護(hù)中的行為一樣。這種方案有兩點需要注意:

  

  (1)附加字節(jié)的定位

  附加字節(jié)的空間是在被保護(hù)的變量被分配的時候分配的,同時在被保護(hù)字節(jié)初始化過程中被初始化。這樣就帶來了問題:為了保持兼容性,我們不想改變被保護(hù)變量的大小,因此我們不能簡單地在變量的結(jié)構(gòu)定義中加入附加字。還有,對各種類型也有不同附加字節(jié)數(shù)目。

  

  (2)查附加字節(jié)

  每次程序指針被引用的時候都要檢查附加字節(jié)的完整性。這個也存在問題因為“從存取器讀”在編譯器中沒有語義,編譯器更關(guān)心指針的使用,而各種優(yōu)化算法傾向于從存儲器中讀人變量.還有隨著變量類型的不同,讀入的方法也各自不同。到目前為止,只有很少—部分使用非指針變量的攻擊能逃脫指針保護(hù)的檢測。但是,可以通過在編譯器上強制對某一變量加入附加字節(jié)來實現(xiàn)檢測,這時需要程序員自己手工加入相應(yīng)的保護(hù)了。

  

相關(guān)頻道: eNews

您對本文或本站有任何意見,請在下方提交,謝謝!

投稿信箱:tougao@enet16.com