當前位置:首頁 » 硬碟大全 » 緩存區溢出與數據類型溢出的差別
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

緩存區溢出與數據類型溢出的差別

發布時間: 2022-05-30 19:43:11

c語言中各個型的數據的溢出是什麼樣的

  1. 溢出:數據類型超過了計算機字長的界限而出現的數據溢出;

  2. 溢出可能原因:
    當應用程序讀取用戶數據,復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時 (假設定義數組int Array[10], 而在調用時使用Array[11] 或存放的數據超過int類型容量等), 內存緩沖區就可能會溢出.

  3. 溢出因素分析:
    由於C/C++語言所固有的缺陷,既不檢查數組邊界,又不檢查類型可靠性,且用C/C++語言開發的程序由於目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,只要合理編碼,C/C++應用程序在執行效率上必然優於其它高級語言。然而,C/C++語言導致內存溢出問題的可能性也要大許多。

  4. 對於堆棧溢出,程序會直接終止,返回錯誤。

    對於數組類型的邊界越界溢出,有時會產生中斷錯誤,有時仍然可以繼續運行,但是結果不正確。

    對於基本類型的最大值溢出,會產生不確定的結果,程序仍然能夠正常運行,但是結果不正確。


⑵ 緩沖區溢出 是什麼意思原理性講解下

緩沖區溢出
開放分類: 計算機原理

緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統當機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。緩沖區溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩沖區溢出攻擊--Morris蠕蟲,發生在十年前,它曾造成了全世界6000多台網路伺服器癱瘓。
1.概念
緩沖區溢出是指當計算機向緩沖區內填充數據位數時超過了緩沖區本身的容量溢出的數據覆蓋在合法數據上,理想的情況是 程序檢查數據長度並不允許輸入超過緩沖區長度的字元,但是絕大多數程序都會假設數據長度總是與所分配的儲存空間想匹配,這就為緩沖區溢出埋下隱患.操作系統所使用的緩沖區 又被稱為"堆棧". 在各個操作進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩沖區溢出 。
2.危害
在當前網路與分布式系統安全中,被廣泛利用的50%以上都是緩沖區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然後為所欲為。
3.緩沖區攻擊
一. 緩沖區溢出的原理
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()將直接吧str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
當然,隨便往緩沖區中填東西造成它溢出一般只會出現「分段錯誤」(Segmentation fault),而不能達到攻擊的目的。最常見的手段是通過製造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序屬於root且有suid許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。
緩沖區溢出攻擊之所以成為一種常見安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。而且,緩沖區溢出成為遠程攻擊的主要手段其原因在於緩沖區溢出漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
在1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩沖區溢出。而在1998年CERT的13份建議中,有9份是是與緩沖區溢出有關的,在1999年,至少有半數的建議是和緩沖區溢出有關的。在Bugtraq的調查中,有2/3的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。
緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。

二、緩沖區溢出的漏洞和攻擊
緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似「exec(sh)」的執行代碼來獲得root許可權的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:
1. 在程序的地址空間里安排適當的代碼。
2. 通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。
根據這兩個目標來對緩沖區溢出攻擊進行分類。在二.1節,將描述攻擊代碼是如何放入被攻擊程序的地址空間的。在二.2節,將介紹攻擊者如何使一個程序的緩沖區溢出,並且執行轉移到攻擊代碼(這個就是「溢出」的由來)。在二.3節,將綜合前兩節所討論的代碼安排和控製程序執行流程的技術。
二.1 在程序的地址空間里安排適當的代碼的方法
有兩種在被攻擊程序地址空間里安排攻擊代碼的方法:
1、植入法:
攻擊者向被攻擊的程序輸入一個字元串,程序會把這個字元串放到緩沖區里。這個字元串包含的資料是可以在這個被攻擊的硬體平台上運行的指令序列。在這里,攻擊者用被攻擊程序的緩沖區來存放攻擊代碼。緩沖區可以設在任何地方:堆棧(stack,自動變數)、堆(heap,動態分配的內存區)和靜態資料區。
2、利用已經存在的代碼:
有時,攻擊者想要的代碼已經在被攻擊的程序中了,攻擊者所要做的只是對代碼傳遞一些參數。比如,攻擊代碼要求執行「exec (「/bin/sh」)」,而在libc庫中的代碼執行「exec (arg)」,其中arg使一個指向一個字元串的指針參數,那麼攻擊者只要把傳入的參數指針改向指向」/bin/sh」。
二.2 控製程序轉移到攻擊代碼的方法
所有的這些方法都是在尋求改變程序的執行流程,使之跳轉到攻擊代碼。最基本的就是溢出一個沒有邊界檢查或者其它弱點的緩沖區,這樣就擾亂了程序的正常的執行順序。通過溢出一個緩沖區,攻擊者可以用暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。
分類的基準是攻擊者所尋求的緩沖區溢出的程序空間類型。原則上是可以任意的空間。實際上,許多的緩沖區溢出是用暴力的方法來尋求改變程序指針的。這類程序的不同之處就是程序空間的突破和內存空間的定位不同。主要有以下三種: 1、活動紀錄(Activation Records):
每當一個函數調用發生時,調用者會在堆棧中留下一個活動紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出堆棧中的自動變數,使返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為堆棧溢出攻擊(Stack Smashing Attack),是目前最常用的緩沖區溢出攻擊方式。
2、函數指針(Function Pointers):
函數指針可以用來定位任何地址空間。例如:「void (* foo)()」聲明了一個返回值為void的函數指針變數foo。所以攻擊者只需在任何空間內的函數指針附近找到一個能夠溢出的緩沖區,然後溢出這個緩沖區來改變函數指針。在某一時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了。它的一個攻擊範例就是在Linux系統下的superprobe程序。
3、長跳轉緩沖區(Longjmp buffers):
在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定「setjmp(buffer)」,用「longjmp(buffer)」來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那麼「longjmp(buffer)」實際上是跳轉到攻擊者的代碼。象函數指針一樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢出的緩沖區。一個典型的例子就是Perl 5.003的緩沖區溢出漏洞;攻擊者首先進入用來恢復緩沖區溢出的的longjmp緩沖區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了。
二.3代碼植入和流程式控制制技術的綜合分析
最簡單和常見的緩沖區溢出攻擊類型就是在一個字元串里綜合了代碼植入和活動紀錄技術。攻擊者定位一個可供溢出的自動變數,然後向程序傳遞一個很大的字元串,在引發緩沖區溢出,改變活動紀錄的同時植入了代碼。這個是由Levy指出的攻擊的模板。因為C在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例十分常見。
代碼植入和緩沖區溢出不一定要在在一次動作內完成。攻擊者可以在一個緩沖區內放置代碼,這是不能溢出的緩沖區。然後,攻擊者通過溢出另外一個緩沖區來轉移程序的指針。這種方法一般用來解決可供溢出的緩沖區不夠大(不能放下全部的代碼)的情況。
如果攻擊者試圖使用已經常駐的代碼而不是從外部植入代碼,他們通常必須把代碼作為參數調用。舉例來說,在libc(幾乎所有的C程序都要它來連接)中的部分代碼段會執行「exec(something)」,其中somthing就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,然後利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。
三、 緩沖區溢出攻擊的實驗分析
2000年1月,Cerberus 安全小組發布了微軟的IIS 4/5存在的一個緩沖區溢出漏洞。攻擊該漏洞,可以使Web伺服器崩潰,甚至獲取超級許可權執行任意的代碼。目前,微軟的IIS 4/5 是一種主流的Web伺服器程序;因而,該緩沖區溢出漏洞對於網站的安全構成了極大的威脅;它的描述如下:
瀏覽器向IIS提出一個HTTP請求,在域名(或IP地址)後,加上一個文件名,該文件名以「.htr」做後綴。於是IIS認為客戶端正在請求一個「.htr」文件,「.htr」擴展文件被映像成ISAPI(Internet Service API)應用程序,IIS會復位向所有針對「.htr」資源的請求到 ISM.DLL程序 ,ISM.DLL 打開這個文件並執行之。
瀏覽器提交的請求中包含的文件名存儲在局部變數緩沖區中,若它很長,超過600個字元時,會導致局部變數緩沖區溢出,覆蓋返回地址空間,使IIS崩潰。更進一步,在如圖1所示的2K緩沖區中植入一段精心設計的代碼,可以使之以系統超級許可權運行。
四、緩沖區溢出攻擊的防範方法
緩沖區溢出攻擊佔了遠程網路攻擊的絕大多數,這種攻擊可以使得一個匿名的Internet用戶有機會獲得一台主機的部分或全部的控制權。如果能有效地消除緩沖區溢出的漏洞,則很大一部分的安全威脅可以得到緩解。
目前有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。在四.1中介紹了通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼。在四.2中介紹了強制寫正確的代碼的方法。在四.3中介紹了利用編譯器的邊界檢查來實現緩沖區的保護。這個方法使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅,但是相對而言代價比較大。在四.4中介紹一種間接的方法,這個方法在程序指針失效前進行完整性檢查。雖然這種方法不能使得所有的緩沖區溢出失效,但它能阻止絕大多數的緩沖區溢出攻擊。然後在四.5,分析這種保護方法的兼容性和性能優勢。

四.1 非執行的緩沖區
通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。在早期的Unix系統設計中,只允許程序代碼在代碼段中執行。但是近來的Unix和MS Windows系統由於要實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,這也是緩沖區溢出的根源。為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。
但是可以設定堆棧數據段不可執行,這樣就可以保證程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:
(1)信號傳遞:
Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼來實現向進程發送Unix信號。非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的。
(2)GCC的在線重用:
研究發現gcc在堆棧區里放置了可執行的代碼作為在線重用之用。然而,關閉這個功能並不產生任何問題,只有部分功能似乎不能使用。
非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其它形式的攻擊則沒有效果。通過引用一個駐留的程序的指針,就可以跳過這種保護措施。其它的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。
四.2 編寫正確的代碼
編寫正確的代碼是一件非常有意義的工作,特別象編寫C語言那種風格自由而容易出錯的程序,這種風格是由於追求性能而忽視正確性的傳統引起的。盡管花了很長的時間使得人們知道了如何編寫安全的程序,具有安全漏洞的程序依舊出現。因此人們開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序。
最簡單的方法就是用grep來搜索源代碼中容易產生漏洞的庫的調用,比如對strcpy和sprintf的調用,這兩個函數都沒有檢查輸入參數的長度。事實上,各個版本C的標准庫均有這樣的問題存在。
此外,人們還開發了一些高級的查錯工具,如fault injection等。這些工具的目的在於通過人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞。還有一些靜態分析工具用於偵測緩沖區溢出的存在。
雖然這些工具幫助程序員開發更安全的程序,但是由於C語言的特點,這些工具不可能找出所有的緩沖區溢出漏洞。所以,偵錯技術只能用來減少緩沖區溢出的可能,並不能完全地消除它的存在。

⑶ 什麼叫做緩沖區溢出

緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統宕機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。

緩沖區溢出的原理
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,造成程序崩潰或使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序: void function(char *str) { char buffer[16]; strcpy(buffer,str); } 上面的strcpy()將直接把str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。 當然,隨便往緩沖區中填東西造成它溢出一般只會出現「分段錯誤」(Segmentation fault),而不能達到攻擊的目的。最常見的手段是通過製造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序屬於root且有suid許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。 緩沖區溢出攻擊之所以成為一種常見安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。而且,緩沖區溢出成為遠程攻擊的主要手段其原因在於緩沖區溢出漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。 在1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩沖區溢出。而在1998年CERT的13份建議中,有9份是是與緩沖區溢出有關的,在1999年,至少有半數的建議是和緩沖區溢出有關的。在Bugtraq的調查中,有2/3的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。 緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。

⑷ 計算機中的「溢出」到底是什麼意思

溢出是黑客開發的控制別人電腦的程序。

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

當你用 C/C++ 書寫代碼時,應該處處留意如何處理來自用戶的數據。如果一個函數的數據來源不可靠,又用到內存緩沖區,那麼它就必須要做到知道內存緩沖區的總長度和檢驗內存緩沖區。

(4)緩存區溢出與數據類型溢出的差別擴展閱讀

緩沖區溢出

緩沖區是用戶為程序運行時在計算機中申請的一段連續的內存,它保存了給定類型的數據。緩沖區溢出指的是一種常見且危害很大的系統攻擊手段,通過向程序的緩沖區寫入超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其他的指令,以達到攻擊的目的。

數據溢出

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

客觀原因

在 C 和 C++ 語言本身中,這個問題是不容易解決的。該問題基於 C 語言的根本設計決定(特別是 C 語言中指針和數組的處理方式)。由於 C++ 是最兼容的 C 語言超集,它也具有相同的問題。

現實狀況

在幾乎所有計算機語言中,不管是新的語言還是舊的語言,使緩沖區溢出的任何嘗試通常都會被該語言本身自動檢測並阻止(比如通過引發一個異常或根據需要給緩沖區添加更多空間)。但是有兩種語言不是這樣:C 和 C++ 語言。

⑸ 怎麼是溢出,溢出的定義是怎麼!

什麼是溢出?
溢出全名是「緩沖區溢出」緩沖區是內存中存放數據的地方。在程序試圖將數據放到機器內存中的某一個位置的時候,因為沒有足夠的空間就會發生緩沖區溢出。而人為的溢出則是有一定企圖的,攻擊者寫一個超過緩沖區長度的字元串,然後植入到緩沖區,而再向一個有限空間的緩沖區中植入超長的字元串可能會出現兩個結果,一是過長的字元串覆蓋了相鄰的存儲單元,引起程序運行失敗,嚴重的可導致系統崩潰;另有一個結果就是利用這種漏洞可以執行任意指令,甚至可以取得系統root特級許可權。大多造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入參數而造成的。
緩沖區是程序運行的時候機器內存中的一個連續塊,它保存了給定類型的數據,隨著動態分配變數會出現問題。大多時為了不佔用太多的內存,一個有動態分配變數的程序在程序運行時才決定給它們分配多少內存。這樣想下去的話,如果說要給程序在動態分配緩沖區放入超長的數據,它就會溢出了。一個緩沖區溢出程序使用這個溢出的數據將匯編語言代碼放到機器的內存里,通常是產生root許可權的地方,這就不是什麼好現象了。僅僅就單個的緩沖區溢出惹眼,它並不是最大的問題根本所在。但如果溢出送到能夠以root許可權運行命令的區域,一旦運行這些命令,那可就等於把機器拱手相讓了。

⑹ 程序中的內存溢出和緩存溢出有什麼區別啊

一、內存溢出
內存溢出已經是軟體開發歷史上存在了近40年的「老大難」問題,象在「紅色代碼」病毒事件中表現的那樣,它已經成為黑客攻擊企業網路的「罪魁禍首」。 如在一個域中輸入的數據超過了它的要求就會引發數據溢出問題,多餘的數據就可以作為指令在計算機上運行。據有關安全小組稱,操作系統中超過50%的安全漏洞都是由內存溢出引起的,其中大多數與微軟的技術有關。

為了便於理解,我們不妨打個比方。緩沖區溢出好比是將十磅的糖放進一個只能裝五磅的容器里。一旦該容器放滿了,餘下的部分就溢出在櫃台和地板上,弄得一團糟。由於計算機程序的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩沖區——五磅的容器——做適當的檢查,看它們是否夠大,能否完全裝入新的內容——十磅的糖,結果可能造成緩沖區溢出的產生。如果打算被放進新地方的數據不適合,溢得到處都是,該數據也會製造很多麻煩。但是,如果緩沖區僅僅溢出,這只是一個問題。到此時為止,它還沒有破壞性。當糖溢出時,櫃台被蓋住。可以把糖擦掉或用吸塵器吸走,還櫃台本來面貌。與之相對的是,當緩沖區溢出時,過剩的信息覆蓋的是計算機內存中以前的內容。除非這些被覆蓋的內容被保存或能夠恢復,否則就會永遠丟失。

在丟失的信息里有能夠被程序調用的子程序的列表信息,直到緩沖區溢出發生。另外,給那些子程序的信息——參數——也丟失了。這意味著程序不能得到足夠的信息從子程序返回,以完成它的任務。就像一個人步行穿過沙漠。如果他依賴於他的足跡走回頭路,當沙暴來襲抹去了這些痕跡時,他將迷失在沙漠中。這個問題比程序僅僅迷失方向嚴重多了。入侵者用精心編寫的入侵代碼(一種惡意程序)使緩沖區溢出,然後告訴程序依據預設的方法處理緩沖區,並且執行。此時的程序已經完全被入侵者操縱了。

入侵者經常改編現有的應用程序運行不同的程序。例如,一個入侵者能啟動一個新的程序,發送秘密文件(支票本記錄,口令文件,或財產清單)給入侵者的電子郵件。這就好像不僅僅是沙暴吹了腳印,而且後來者也會踩出新的腳印,將我們的迷路者領向不同的地方,他自己一無所知的地方。

緩沖區溢出的處理

你屋子裡的門和窗戶越少,入侵者進入的方式就越少……

由於緩沖區溢出是一個編程問題,所以只能通過修復被破壞的程序的代碼而解決問題。如果你沒有源代碼,從上面「堆棧溢出攻擊」的原理可以看出,要防止此類攻擊,我們可以:

1、開放程序時仔細檢查溢出情況,不允許數據溢出緩沖區。由於編程和編程語言的原因,這非常困難,而且不適合大量已經在使用的程序;

2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;

3、經常檢查你的操作系統和應用程序提供商的站點,一旦發現他們提供的補丁程序,就馬上下載並且應用在系統上,這是最好的方法。但是系統管理員總要比攻擊者慢一步,如果這個有問題的軟體是可選的,甚至是臨時的,把它從你的系統中刪除。舉另外一個例子,你屋子裡的門和窗戶越少,入侵者進入的方式就越少。

二、緩存溢出
緩存溢出(Buffer overflow),是指在存在緩存溢出安全漏洞的計算機中,攻擊者可以用超出常規長度的字元數來填滿一個域,通常是內存區地址。在某些情況下,這些過量的字元能夠作為「可執行」代碼來運行。從而使得攻擊者可以不受安全措施的約束來控制被攻擊的計算機。

緩存溢出(或譯為緩沖溢出)為黑客最為常用的攻擊手段之一,蠕蟲病毒對操作系統高危漏洞的溢出高速與大規模傳播均是利用此技術。

緩存溢出攻擊從理論上來講可以用於攻擊任何有缺陷不完美的程序,包括對殺毒軟體、防火牆等安全產品的攻擊以及對銀行程序的攻擊。

參考:http://ke..com/view/79183.htm
http://ke..com/view/973698.htm

⑺ 「數據溢出」是什麼意思

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

溢出原因
數據類型超過了計算機字長的界限就會出現數據溢出的情況。導致內存溢出問題的原因有很多,比如:
(1) 使用非類型安全(non-type-safe)的語言如 C/C++ 等。
(2) 以不可靠的方式存取或者復制內存緩沖區。
(3)編譯器設置的內存緩沖區太靠近關鍵數據結構。

因素分析
1.內存溢出問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查數組邊界,又不檢查類型可靠性(type-safety)。眾所周知,用 C/C++ 語言開發的程序由於目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,這種特性大大提升了 C/C++ 語言代碼的性能。只要合理編碼,C/C++應用程序在執行效率上必然優於其它高級語言。然而,C/C++ 語言導致內存溢出問題的可能性也要大許多。其他語言也存在內存溢出問題,但它往往不是程序員的失誤,而是應用程序的運行時環境出錯所致。
2. 當應用程序讀取用戶(也可能是惡意攻擊者)數據,試圖復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時(換言之,假設代碼申請了 N 位元組大小的內存緩沖區,隨後又向其中復制超過 N 位元組的數據)。內存緩沖區就可能會溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那麼多出來的 4 盎司水怎麼辦?當然會滿到玻璃杯外面了!
3. 最重要的是,C/C++編譯器開辟的內存緩沖區常常鄰近重要的數據結構。假設某個函數的堆棧緊接在在內存緩沖區後面時,其中保存的函數返回地址就會與內存緩沖區相鄰。此時,惡意攻擊者就可以向內存緩沖區復制大量數據,從而使得內存緩沖區溢出並覆蓋原先保存於堆棧中的函數返回地址。這樣,函數的返回地址就被攻擊者換成了他指定的數值;一旦函數調用完畢,就會繼續執行「函數返回地址」處的代碼。非但如此,C++ 的某些其它數據結構,比如 v-table 、例外事件處理程序、函數指針等,也可能受到類似的攻擊。

⑻ 緩沖區溢出: 可執行文件 緩沖區溢出: 可寫 緩沖區溢出: 堆棧 是什麼意思

緩沖區溢出是指當計算機程序向緩沖區內填充的數據位數超過了緩沖區本身的容量。溢出的數據覆蓋在合法數據上。理想情況是,程序檢查數據長度並且不允許輸入超過緩沖區長度的字元串。但是絕大多數程序都會假設數據長度總是與所分配的存儲空間相匹配,這就為緩沖區溢出埋下隱患。操作系統所使用的緩沖區又被稱為堆棧,在各個操作進程之間,指令被臨時存儲在堆棧當中,堆棧也會出現緩沖區溢出。

當一個超長的數據進入到緩沖區時,超出部分就會被寫入其他緩沖區,其他緩沖區存放的可能是數據、下一條指令的指針,或者是其他程序的輸出內容,這些內容都被覆蓋或者破壞掉。可見一小部分數據或者一套指令的溢出就可能導致一個程序或者操作系統崩潰。

⑼ 什麼叫緩沖區溢出

緩沖區溢出
緩沖區是內存中存放數據的地方。在程序試圖將數據放到計算機內存中的某一位置,但沒有足夠空間時會發生緩沖區溢出。

緩沖區是程序運行時計算機內存中的一個連續的塊,它保存了給定類型的數據。問題隨著動態分配變數而出現。為了不用太多的內存,一個有動態分配變數的程序在程序運行時才決定給他們分配多少內存。如果程序在動態分配緩沖區放入太多的數據會有什麼現象?它溢出了,漏到了別的地方。一個緩沖區溢出應用程序使用這個溢出的數據將匯編語言代碼放到計算機的內存中,通常是產生root許可權的地方。單單的緩沖區溢出,並不會產生安全問題。只有將溢出送到能夠以root許可權運行命令的區域才行。這樣,一個緩沖區利用程序將能運行的指令放在了有root許可權的內存中,從而一旦運行這些指令,就是以root許可權控制了計算機。總結一下上面的描述。緩沖區溢出指的是一種系統攻擊的手段,通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。據統計,通過緩沖區溢出進行的攻擊占所有系統攻擊總數的80%以上。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:

example0.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];

strcpy(buffer,str);
}
-----------------------------------------------------------

上面的strcpy()將直接把str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循環內的getc(),fgetc(),getchar()等。在C語言中,靜態變數是分配在數據段中的,動態變數是分配在堆棧段的。緩沖區溢出是利用堆棧段的溢出的。一個程序在內存中通常分為程序段,數據端和堆棧三部分。程序段里放著程序的機器碼和只讀數據,這個段通常是只讀,對它的寫操作是非法的。數據段放的是程序中的靜態數據。動態數據則通過堆棧來存放。在內存中,它們的位置如下:

/――――――――\ 內存低端
|程序段|
|―――――――――|
|數據段|
|―――――――――|
|堆棧|
\―――――――――/內存高端

堆棧是內存中的一個連續的塊。一個叫堆棧指針的寄存器(SP)指向堆棧的棧頂。堆棧的底部是一個固定地址。堆棧有一個特點就是,後進先出。也就是說,後放入的數據第一個取出。它支持兩個操作,PUSH和POP。PUSH是將數據放到棧的頂端,POP是將棧頂的數據取出。在高級語言中,程序函數調用和函數中的臨時變數都用到堆棧。參數的傳遞和返回值是也用到了堆棧。通常對局部變數的引用是通過給出它們對SP的偏移量來實現的。另外還有一個基址指針(FP,在Intel晶元中是BP),許多編譯器實際上是用它來引用本地變數和參數的。通常,參數的相對FP的偏移是正的,局部變數是負的。當程序中發生函數調用時,計算機做如下操作:首先把參數壓入堆棧;然後保存指令寄存器(IP)中的內容,做為返回地址(RET);第三個放入堆棧的是基址寄存器(FP);然後把當前的棧指針(SP)拷貝到FP,做為新的基地址;最後為本地變數留出一定空間,把SP減去適當的數值。

下面舉個例子:
example1.c:
------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}

void main() {
function(1,2,3);
}
-----------------------------------------------------------

為了理解程序是怎樣調用函數function()的,使用-S選項,在Linux下,用gcc進行編譯,產生匯編代碼輸出:

$ gcc -S -o example1.s example1.c

看看輸出文件中調用函數的那部分:

pushl $3
pushl $2
pushl $1
call function

這就將3個參數壓到堆棧里了,並調用function()。指令call會將指令指針IP壓入堆棧。在返回時,RET要用到這個保存的IP。在函數中,第一要做的事是進行一些必要的處理。每個函數都必須有這些過程:

pushl %ebp
movl %esp,%ebp
subl $20,%esp

這幾條指令將EBP,基址指針放入堆棧。然後將當前SP拷貝到EBP。然後,為本地變數分配空間,並將它們的大小從SP里減掉。由於內存分配是以字為單位的,因此,這里的buffer1用了8位元組(2個字,一個字4位元組)。Buffer2用了12位元組(3個字)。所以這里將ESP減了20。這樣,現在,堆棧看起來應該是這樣的。

低端內存高端內存
buffer2 buffer1 sfp ret a b c
< ------ [ ][ ][ ][ ][ ][ ][ ]
棧頂棧底

緩沖區溢出就是在一個緩沖區里寫入過多的數據。那怎樣利用呢,看
一下下面程序:

example2.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];

strcpy(buffer,str);
}

void main() {
char large_string[256];
int i;

for( i = 0; i < 255; i++)
large_string[i] = 'A';

function(large_string);
}
------------------------------------------------------------

這個程序是一個經典的緩沖區溢出編碼錯誤。函數將一個字元串不經過邊界檢查,拷貝到另一內存區域。當調用函數function()時,堆棧如下:

低內存端buffer sfp ret *str高內存端
< ------ [ ][ ][ ][ ]
棧頂棧底

很明顯,程序執行的結果是"Segmentation fault (core mped)"或類似的出錯信息。因為從buffer開始的256個位元組都將被*str的內容'A'覆蓋,包括sfp, ret,甚至*str。'A'的十六進值為0x41,所以函數的返回地址變成了0x41414141, 這超出了程序的地址空間,所以出現段錯誤。可見,緩沖區溢出允許我們改變一個函數的返回地址。通過這種方式,可以改變程序的執行順序。

⑽ 溢出的溢出分類

緩沖區是用戶為程序運行時在計算機中申請的一段連續的內存,它保存了給定類型的數據。緩沖區溢出指的是一種常見且危害很大的系統攻擊手段,通過向程序的緩沖區寫入超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其他的指令,以達到攻擊的目的。更為嚴重的是,緩沖區溢出攻擊佔了遠程網路攻擊的絕大多數,這種攻擊可以使得一個匿名的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%的安全漏洞都是由內存溢出引起的,其中大多數與微軟的技術有關。
微軟的軟體是針對台式機開發的,內存溢出不會帶來嚴重的問題。但現有台式機一般都連上了互聯網,內存溢出就為黑客的入侵提供了便利條件。 數據類型超過了計算機字長的界限就會出現數據溢出的情況。導致內存溢出問題的原因有很多,比如:
(1) 使用非類型安全(non-type-safe)的語言如 C/C++ 等。
(2) 以不可靠的方式存取或者復制內存緩沖區。
(3)編譯器設置的內存緩沖區太靠近關鍵數據結構。 1.內存溢出問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查數組邊界,又不檢查類型可靠性(type-safety)。眾所周知,用 C/C++ 語言開發的程序由於目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,這種特性大大提升了 C/C++ 語言代碼的性能。只要合理編碼,C/C++應用程序在執行效率上必然優於其它高級語言。然而,C/C++ 語言導致內存溢出問題的可能性也要大許多。其他語言也存在內存溢出問題,但它往往不是程序員的失誤,而是應用程序的運行時環境出錯所致。
2. 當應用程序讀取用戶(也可能是惡意攻擊者)數據,試圖復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時(換言之,假設代碼申請了 N 位元組大小的內存緩沖區,隨後又向其中復制超過 N 位元組的數據)。內存緩沖區就可能會溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那麼多出來的 4 盎司水怎麼辦?當然會滿到玻璃杯外面了!
3. 最重要的是,C/C++編譯器開辟的內存緩沖區常常鄰近重要的數據結構。假設某個函數的堆棧緊接在在內存緩沖區後面時,其中保存的函數返回地址就會與內存緩沖區相鄰。此時,惡意攻擊者就可以向內存緩沖區復制大量數據,從而使得內存緩沖區溢出並覆蓋原先保存於堆棧中的函數返回地址。這樣,函數的返回地址就被攻擊者換成了他指定的數值;一旦函數調用完畢,就會繼續執行「函數返回地址」處的代碼。非但如此,C++ 的某些其它數據結構,比如 v-table 、例外事件處理程序、函數指針等,也可能受到類似的攻擊。
具體的例子
請思考:以下代碼有何不妥之處?
void CopyData(char *szData) {
char cDest[32];
strcpy(cDest,szData);
// 處理 cDest
...
}
奇怪,這段代碼好像沒什麼不對勁啊!確實,只有調用上述 CopyData() 才會出問題。例如:這樣使用 CopyData() 是安全的:
char *szNames[] = {Michael,Cheryl,Blake};
CopyData(szName[1]);
為什麼呢?因為數組中的姓名(Michael、Cheryl、Blake)都是字元串常量,而且長度都不超過 32 個字元,用它們做 strcpy() 的參數總是安全的。再假設 CopyData 的唯一參數 szData 來自 socket套接字或者文件等不可靠的數據源。由於 strcpy 並不在乎數據來源,只要沒遇上空字元,它就會一個字元一個字元地復制 szData 的內容。此時,復制到 cDest 的字元串就可能超過 32 字元,進而導致內存緩沖區 cDest 的溢出;溢出的字元就會取代內存緩沖區後面的數據。不幸的是,CopyData 函數的返回地址也在其中!於是,當 CopyData函數調用完畢以後,程序就會轉入攻擊者給出的「返回地址」,從而落入攻擊者的圈套!授人以柄,慘!
前面提到的其它數據結構也可能受到類似的攻擊。假設有人利用內存溢出漏洞覆蓋了下列 C++ 類中的 v-table :
void CopyData(char *szData) {
CFoo foo;
char cDest[32];
strcpy(cDest,szData);
foo.Init();
}
與其它 C++ 類一樣,這里的 CFoo 類也對應一個所謂的 v-table,即用於保存一個類的全部方法地址的列表。若攻擊者利用內存溢出漏洞偷換了 v-table 的內容,則 CFoo 類中的所有方法,包括上述 Init() 方法,都會指向攻擊者給出的地址,而不是原先 v-table 中的方法地址。順便說一句,即使你在某個 C++ 類的源代碼中沒有調用任何方法,也不能認為這個類是安全的,因為它在運行時至少需要調用一個內部方法——析構器(destructor)!當然,如果真有一個類沒有調用任何方法,那麼它的存在意義也就值得懷疑了。