古詩詞大全網 - 字典詞典 - 什麽是溢出_溢出的原因分析

什麽是溢出_溢出的原因分析

 黑客可通過溢出變量,使這個返回地址指向攻擊代碼,得到妳電腦具有管理員資格的控制權。那麽妳對溢出解多少呢?以下是由我整理關於什麽是溢出的內容,希望大家喜歡!

什麽是溢出

 溢出是黑客利用 操作系統 的漏洞,專門開發了壹種程序,加相應的參數運行後,就可以得到妳電腦具有管理員資格的控制權,妳在妳自己電腦上能夠運行的東西他可以全部做到,等於妳的電腦就是他的了(別稱肉雞,也叫傀儡機)。

 溢出是程序設計者設計時的不足所帶來的錯誤。

溢出的分類

 緩沖區溢出

 緩沖區是用戶為程序運行時在計算機中申請的壹段連續的內存,它保存了給定類型的數據。緩沖區溢出指的是壹種常見且危害很大的系統攻擊手段,通過向程序的緩沖區寫入超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其他的指令,以達到攻擊的目的。更為嚴重的是,緩沖區溢出攻擊占了遠程網絡攻擊的絕大多數,這種攻擊可以使得壹個匿名的Internet用戶有機會獲得壹臺主機的部分或全部的控制權!由於這類攻擊使任何人都有可能取得主機的控制權,所以它代表了壹類極其嚴重的安全威脅。

 緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的權限,那麽整個主機就被控制了。壹般而言,攻擊者攻擊root程序,然後執行類似?exec(sh)?的執行代碼來獲得root的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:在程序的地址空間裏安排適當的代碼;通過適當地初始化寄存器和存儲器,讓程序跳轉到事先安排的地址空間執行。根據這兩個目標,可以將緩沖區溢出攻擊分為以下3類。

 緩沖區溢出分類

 控制程序轉移到攻擊代碼

 這種 方法 指在改變程序的執行流程,使之跳轉到攻擊代碼。最基本方法的就是溢出壹個沒有邊界檢查或者其他弱點的緩沖區,這樣就擾亂了程序的正常的執行順序。通過溢出壹個緩沖區,攻擊者可以用近乎暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。

 1.2.1激活紀錄(Activation Records)

 每當壹個函數調用發生時,調用者會在堆棧中留下壹個激活紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出這些自動變量,使這個返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為?stack smashing attack?,是目.前常用的緩沖區溢出攻擊方式。

 1.2.2函數指針(Function Pointers)

 C語言中,?void (* foo)()?聲明了壹個返回值為void函數指針的變量foo。函數指針可以用來定位任何地址空間,所以攻擊者只需在任何空間內的函數指針附近找到壹個能夠溢出的緩沖區,然後溢出這個緩沖區來改變函數指針。在某壹時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了!它的壹個攻擊範例就是在Linux系統下的super probe程序。

 1.2.3長跳轉緩沖區(Longjmp buffers)

 在C語言中包含了壹個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定?setjmp(buffer)?,用?longjmp(buffer)?來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那麽?longjmp(buffer)?實際上是跳轉到攻擊者的代碼。象函數指針壹樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到壹個可供溢出的緩沖區。壹個典型的例子就是Perl 5.003,攻擊者首先進入用來恢復緩沖區溢出的的longjmp緩沖區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了!

 最簡單和常見的緩沖區溢出攻擊類型就是在壹個字符串裏綜合了代碼殖入和激活紀錄。攻擊者定位壹個可供溢出的自動變量,然後向程序傳遞壹個很大的字符串,在引發緩沖區溢出改變激活紀錄的同時殖入了代碼。這個是由Levy指出的攻擊的模板。因為C語言在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例不在少數。

 代碼殖入和緩沖區溢出不壹定要在壹次動作內完成。攻擊者可以在壹個緩沖區內放置代碼,這是不能溢出緩沖區。然後,攻擊者通過溢出另外壹個緩沖區來轉移程序的指針。這種方法壹般用來解決可供溢出的緩沖區不夠大的情況。

 如果攻擊者試圖使用已經常駐的代碼而不是從外部殖入代碼,他們通常有必須把代碼作為參數化。舉例來說,在libc中的部分代碼段會執行?exec(something)?,其中something就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,利用另壹個緩沖區溢出使程序指針指向libc中的特定的代碼段。

 內存溢出

 內存溢出已經是軟件開發歷史上存在了近40年的?老大難?問題,象在?紅色代碼?病毒事件中表現的那樣,它已經成為黑客攻擊企業網絡的?罪魁禍首?。

 如在壹個域中輸入的數據超過了它的要求就會引發數據溢出問題,多余的數據就可以作為指令在計算機上運行。據有關安全小組稱,操作系統中超過50%的安全漏洞都是由內存溢出引起的,其中大多數與微軟的技術有關。

 微軟的軟件是針對 臺式機 開發的,內存溢出不會帶來嚴重的問題。但現有臺式機壹般都連上了互聯網,內存溢出就為黑客的入侵提供了便利條件。

 數據溢出

 在計算機中,當要表示的數據超出計算機所使用的數據的表示範圍時,則產生數據的溢出。

分析溢出原因

 現實狀況

 在幾乎所有計算機語言中,不管是新的語言還是舊的語言,使緩沖區溢出的任何嘗試通常都會被該語言本身自動檢測並阻止(比如通過引發壹個異常或根據需要給緩沖區添加更多空間)。但是有兩種語言不是這樣:C 和 C++ 語言。C 和 C++ 語言通常只是讓額外的數據亂寫到其余內存的任何位置,而這種情況可能被利用從而導致恐怖的結果。更糟糕的是,用 C 和 C++ 編寫正確的代碼來始終如壹地處理緩沖區溢出則更為困難;很容易就會意外地導致緩沖區溢出。除了 C 和 C++ 使用得 非常廣泛外,上述這些可能都是不相關的事實;例如,Red Hat Linux 7.1 中 86% 的代碼行都是用 C 或 C ++ 編寫的。因此,大量的代碼對這個問題都是脆弱的,因為實現語言無法保護代碼避免這個問題。

 客觀原因

 在 C 和 C++ 語言本身中,這個問題是不容易解決的。該問題基於 C 語言的根本設計決定(特別是 C 語言中指針和數組的處理方式)。由於 C++ 是最兼容的 C 語言超集,它也具有相同的問題。存在壹些能防止這個問題的 C/C++ 兼容版本,但是它們存在極其嚴重的性能問題。而且壹旦改變 C 語言來防止這個問題,它就不再是 C 語言了。許多語言(比如 Java 和 C#)在語法上類似 C,但它們實際上是不同的語言,將現有 C 或 C++ 程序改為使用那些語言是壹項艱巨的任務。

 普遍因素