沖區溢位攻擊原理

2021-08-30 03:48:46 字數 3842 閱讀 6894

緩衝區溢位是一種在各種作業系統、應用軟體中廣泛存在普遍且危險的漏洞,利用緩衝區溢位攻擊可以導致程式執行失敗、系統崩潰等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。第乙個緩衝區溢位攻擊--morris蠕蟲,發生在十年前,它曾造成了全世界6000多台網路伺服器癱瘓。

一、 緩衝區溢位的原理:

當正常的使用者操作程式的時候,所進行的操作一般不會超出程式的執行範圍;而黑客卻利用緩衝長度界限向程式中輸入超出其常規長度的內容,造成緩衝區的溢位從而破壞程式的堆疊,使程式執行出現特殊的問題轉而執行其它指令,以達到攻擊的目的。造成緩衝區溢位的原因是程式中沒有仔細檢查使用者輸入的引數,屬於程式開發過程考慮不周到的結果。

當然,隨便往緩衝區中填東西造成它溢位一般只會出現「分段錯誤」(segmentation fault),而不能達到攻擊的目的。最常見的手段是通過製造緩衝區溢位使程式執行乙個使用者shell,再通過shell執行其它命令。如果該程式屬於root且有suid許可權的話,攻擊者就獲得了乙個有root許可權的shell,可以對系統進行任意操作了。

緩衝區溢位攻擊之所以成為一種常見安全攻擊手段其原因在於緩衝區溢位漏洞普遍並且易於實現。而且緩衝區溢位成為遠端攻擊的主要手段其原因在於緩衝區溢位漏洞給予了攻擊者他所想要的一切:植入並且執行攻擊**。被植入的攻擊**以一定的許可權執行有緩衝區溢位漏洞的程式,從而得到被攻擊主機的控制權。

在2023年lincoln實驗室用來評估入侵檢測的的5種遠端攻擊中,有2種是緩衝區溢位。而在2023年cert的13份建議中,有9份是是與緩衝區溢位有關的,在2023年,至少有半數的建議是和緩衝區溢位有關的。在bugtraq的調查中,有2/3的被調查者認為緩衝區溢位漏洞是乙個很嚴重的安全問題。

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

二、緩衝區溢位的漏洞和攻擊:

緩衝區溢位攻擊的目的在於擾亂具有某些特權執行的程式的功能,這樣可以使得攻擊者取得程式的控制權,如果該程式具有足夠的許可權,那麼整個主機就被控制了。它的具體實現過程是這樣的:首先攻擊者對root程式進行試探性攻擊,然後執行類似「exec(sh)」的執行**來獲得具有root許可權的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:

1、在程式的位址空間裡安排適當的**;

2、通過適當的初始化暫存器和記憶體,讓程式跳轉到入侵者安排的位址空間執行。

根據這兩個目標來對緩衝區溢位攻擊進行分類,緩衝區溢位攻擊分為**安排和控制程式執行流程兩種方法:

(1)植入法:

攻擊者向被攻擊的程式輸入乙個字串,程式會把這個字串放到緩衝區裡。這個字串包含的資料是可以在這個被攻擊的硬體平台上執行的指令序列。在這裡,攻擊者用被攻擊程式的緩衝區來存放攻擊**。緩衝區可以設在任何地方:堆疊(stack,自動變數)、堆(heap,動態分配的記憶體區)和靜態資料區。

(2)利用已經存在的**:

有時攻擊者想要的**已經在被攻擊的程式中了,攻擊者所要做的只是對**傳遞一些引數。例如攻擊**要求執行exec (「/bin/sh」),而在libc庫中的**執行exec (arg),其中arg使乙個指向乙個字串的指標引數,那麼攻擊者只要把傳入的引數指標改向指向/bin/sh。

2、控制程式轉移到攻擊**的方法:

所有的這些方法都是在尋求改變程式的執行流程,使之跳轉到攻擊**。最基本的就是溢位乙個沒有邊界檢查或者其它弱點的緩衝區,這樣就擾亂了程式的正常的執行順序。通過溢位乙個緩衝區,攻擊者可以用暴力的方法改寫相鄰的程式空間而直接跳過了系統的檢查。

分類的基準是攻擊者所尋求的緩衝區溢位的程式空間型別。原則上是可以任意的空間。實際上,許多的緩衝區溢位是用暴力的方法來尋求改變程式指標的。這類程式的不同之處就是程式空間的突破和記憶體空間的定位不同。主要有以下三種: 1、活動紀錄(activation records):

每當乙個函式呼叫發生時,呼叫者會在堆疊中留下乙個活動紀錄,它包含了函式結束時返回的位址。攻擊者通過溢位堆疊中的自動變數,使返回位址指向攻擊**。通過改變程式的返回位址,當函式呼叫結束時,程式就跳轉到攻擊者設定的位址,而不是原先的位址。這類的緩衝區溢位被稱為堆疊溢位攻擊(stack smashing attack),是目前最常用的緩衝區溢位攻擊方式。

3、函式指標(function pointers):

函式指標可以用來定位任何位址空間。例如:「void (* foo)()」宣告了乙個返回值為void的函式指標變數foo。所以攻擊者只需在任何空間內的函式指標附近找到乙個能夠溢位的緩衝區,然後溢位這個緩衝區來改變函式指標。在某一時刻,當程式通過函式指標呼叫函式時,程式的流程就按攻擊者的意圖實現了。它的乙個攻擊範例就是在linux系統下的superprobe程式。

4、長跳轉緩衝區(longjmp buffers):

在c語言中包含了乙個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定「setjmp(buffer)」,用「longjmp(buffer)」來恢復檢驗點。然而,如果攻擊者能夠進入緩衝區的空間,那麼「longjmp(buffer)」實際上是跳轉到攻擊者的**。象函式指標一樣,longjmp緩衝區能夠指向任何地方,所以攻擊者所要做的就是找到乙個可供溢位的緩衝區。乙個典型的例子就是perl 5.003的緩衝區溢位漏洞;攻擊者首先進入用來恢復緩衝區溢位的的longjmp緩衝區,然後誘導進入恢復模式,這樣就使perl的直譯器跳轉到攻擊**上了。

2、**植入和流程控制技術的綜合分析:

最簡單和常見的緩衝區溢位攻擊型別就是在乙個字串裡綜合了**植入和活動紀錄技術。攻擊者定位乙個可供溢位的自動變數,然後向程式傳遞乙個很大的字串,在引發緩衝區溢位,改變活動紀錄的同時植入了**。這個是由levy指出的攻擊的模板。因為c在習慣上只為使用者和引數開闢很小的緩衝區,因此這種漏洞攻擊的例項十分常見。

**植入和緩衝區溢位不一定要在在一次動作內完成。攻擊者可以在乙個緩衝區內放置**,這是不能溢位的緩衝區。然後,攻擊者通過溢位另外乙個緩衝區來轉移程式的指標。這種方法一般用來解決可供溢位的緩衝區不夠大(不能放下全部的**)的情況。

如果攻擊者試圖使用已經常駐的**而不是從外部植入**,他們通常必須把**作為引數呼叫。舉例來說,在libc(幾乎所有的c程式都要它來連線)中的部分**段會執行「exec(something)」,其中somthing就是引數。攻擊者然後使用緩衝區溢位改變程式的引數,然後利用另乙個緩衝區溢位使程式指標指向libc中的特定的**段。

三、 緩衝區溢位攻擊的實驗分析:

2023年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崩潰。更進一步在2k緩衝區中植入一段精心設計的**,可以使之以系統超級許可權執行。

四、緩衝區溢位攻擊的防範方法:

緩衝區溢位攻擊佔了遠端網路攻擊的絕大多數,這種攻擊可以使得乙個匿名的internet使用者有機會獲得一台主機的部分或全部的控制權。如果能有效地消除緩衝區溢位的漏洞,則很大一部分的安全威脅可以得到緩解。

目前有三種基本的方法保護緩衝區免受緩衝區溢位的攻擊和影響:

1、通過作業系統使得緩衝區不可執行,從而阻止攻擊者植入攻擊**;

2、強制寫正確的**的方法;

3、利用編譯器的邊界檢查來實現緩衝區的保護,使得緩衝區溢位不可能出現,從而完全消除了緩衝區溢位的威脅。

緩衝區溢位攻擊 入門例子原理分析

在通過了基本的測試程式後,開始分析其原理。本問的內容還是主要參考 先回顧下一些基礎 匯程式設計序快速入門 32位 程式記憶體空間分配 函式幀結構 現代高階語言c c 程式裡每個函式對應乙個函式幀結構 在棧中 在呼叫乙個函式前,會在棧中儲存一些資料,在跳轉到新的函式時,新的函式首先建立自己的幀結構,接...

「緩衝區溢位攻擊」原理分析及例項演示

一.原理分析 緩衝區溢位是一種非常普遍 非常危險的漏洞,在各種作業系統 應用軟體中廣泛存在。利用緩衝區溢位攻擊,可以導致程式執行失敗 系統宕機 重新啟動等後果。更為嚴重的是,可以利用它執行非授權指令,甚至可以取得系統特權,進而進行各種非法操作。要了解緩衝區溢位攻擊,就得先了解程式函式呼叫的棧記憶體分...

緩衝區溢位攻擊原理 方法及防範(一)

由於c c 語言本身沒有陣列越界檢查機制,當向緩衝區裡寫入的資料超過了為其分配的大小時,就會發生緩衝區溢位。攻擊者可以利用緩衝區溢位來竄改程序執行時棧,從而改變程式的正常流向。在分析緩衝區溢位攻擊的原理之前,我們先來 複習一下程序在記憶體中的結構。程序在記憶體中的組織形式 text段主要包含程式 一...