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

2021-06-10 08:03:49 字數 2295 閱讀 3439

一.原理分析

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

要了解緩衝區溢位攻擊,就得先了解程式函式呼叫的棧記憶體分布:

如上圖所示:堆疊幀的頂部為函式的實參,下面是函式的返回位址以及前乙個堆疊幀的指標,最下面是分配給函式的區域性變數使用的空間。乙個堆疊幀通常都有兩個指標,其中乙個稱為堆疊幀指標,另乙個稱為棧頂指標。前者所指向的位置是固定的,而後者所指向的位置在函式的執行過程中可變。因此,在函式中訪問實參和區域性變數時都是以堆疊幀指標為基址,再加上乙個偏移。對照圖可知,實參的偏移為正,區域性變數的偏移為負。

那麼當函式的區域性變數有乙個為字串時,函式呼叫的棧會怎麼分布呢? 1

2

3

4

void

fun(

const

char

*input)

如上**所示的函式呼叫棧為:

如圖所示,作業系統在給buf分配棧空間時,看到buf的長度為8,即申請8個位元組長的位址空間,然後按照倒序將buf的內容填充入棧位址中。而緩衝區溢位攻擊正是利用這一機制,如果將長度大於8的乙個字串賦值給buf,那麼作業系統就會倒序一直填充棧位址,導致覆蓋掉了」previous frame pointer」和」return adress」,而攻擊者如果讓覆蓋」return adress」的內容為乙個有意義的位址,即攻擊者想要讓作業系統執行的攻擊**,那麼當函式返回時就會去執行攻擊**達到了攻擊者的目的。

圖中灰色的區域會根據不同的機器硬體,不同的作業系統而有長度的變化。

二.例項演示

以下面**為例: 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include ;

void

fun(

const

char

*input)

void

haha()

intmain

(int

argc

,char

*argv

) 如上,當**第18行的fun()函式呼叫結束後,應該換回19行的return 0;執行,但如果我們傳入fun()的ss引數在給buf賦值時,ss的長度大於buf的長度,覆蓋了棧中buf上面return adress區域,而此區域正好是fun的返回位址,如果我們知道函式haha()的入口位址,那麼可以把此入口位址填入return adress處,這樣當fun執行完後,就會「很神奇」的去執行haha()函式,如果haha()函式是一段惡意**,那麼就實現了所謂的緩衝區溢位攻擊。

我們在windows下用codeblocks演示整個實驗的過程:

1.得到haha()函式的位址,通過第16行列印我們可以得到,如下圖所示,haha的位址以16進製制的形式顯示為00401358。

2.我們得獲得fun函式執行完成後的返回位址,也就是return 0;語句的位址。進入除錯模式,通過檢視編譯後的組合語言,可以看到ret語句(最後一行)的返回位址為004013c7。

3.檢視fun()函式buf存放位址與其返回位址之間的距離,由圖中有深藍背景的區域我們可以看到為fun的返回位址。這個位址與buf的開始位址即下圖所示位址的開始(由其中內容可看到為我們賦值的「41 42 43..」,即ab…)距離為20,所以我們只需要將buf變成長度為25,從21-24位元組為haha的位址即可。

4.又由於作業系統在分配記憶體是用了大端對齊的方式,所以每個位元組應該倒敘填入即為「58 13 40 00」,程式19行可見。我們用已經寫好的溢位字串除錯程式,可見如下圖,返回位址已經變成了haha()的位址。

5.然後執行程式可以看到如下結果,執行了haha()中的**輸出了「ok!success」。實驗成功

二.如何防止此類攻擊

c語言編譯器充分信任程式設計人員,認為在進行strcpy()這些字串操作時,引數長度的檢查應該由程式設計人員完成。而如果程式設計人員忽略了這一點,程式就有了漏洞,攻擊者就有機可趁,所以寫c語言時一定要注意了。

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

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

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

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

緩衝區溢位攻擊試驗(bufbomb c)

本文的 來自 於 computer systems a programmer s perspective 深入理解計算機系統 一書中的bufbomb.c作業題。實驗環境xp vc6.0。另 linux2.6 gcc4.x下目前碰到棧保護等措施,暫時還沒研究出結果。問題描述如下 分析下面程式,可以得知...