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

2022-05-09 08:09:10 字數 2491 閱讀 9909

由於c/c++語言本身沒有陣列越界檢查機制,當向緩衝區裡寫入的資料超過了為其分配的大小時,就會發生緩衝區溢位。

攻擊者可以利用緩衝區溢位來竄改程序執行時棧,從而改變程式的正常流向。在分析緩衝區溢位攻擊的原理之前,我們先來

複習一下程序在記憶體中的結構。

程序在記憶體中的組織形式

text段主要包含程式**(一系列可執行的指令),另外還有一些唯讀的資料。通常作業系統標記該段為唯讀段,

如果有程序試圖修改該段,會引發段錯誤。

data段包括已初始化和未初始化的全域性變數,靜態變數也放於此處。該段的大小是在編譯時期計算的。

緊接著data段的一塊記憶體是由堆和棧共享的區域。堆向下(高位址)增長,棧向上(低位址)增長。

堆中儲存動態分配的資料,呼叫malloc函式或者calloc函式或者使用new操作符會在堆上分配記憶體。

棧中儲存的是函式呼叫時傳遞的引數,區域性變數的值和一些記錄程序執行狀態的暫存器的值。

堆和棧所佔記憶體都是在執行期間分配的。如果程序的堆或棧的增長超出了為程序分配的記憶體大小,

那麼該程序會被阻塞,作業系統重新為其分派一塊更大的記憶體。

棧的作用

棧這種資料結構,我們再熟悉不過。它的特點是後進先出(lifo),在它之上有兩個著名的函式,push和pop。

函式是結構化程式設計最重要的技術。程式的執行過程可以看作是連續的函式呼叫。當乙個函式執行完畢時,程式要回到呼叫

指令的下一條指令(緊接call指令)處繼續執行,而棧的特點剛好適合這個條件。

在介紹函式呼叫的細節之前,我們先來看一下棧幀的概念。

棧幀是棧中的邏輯片段。每個函式呼叫時,都會push乙個棧幀,當函式返回時,pop。

棧幀裡面存放著函式的引數,函式區域性變數以及為了恢復前一棧幀所需要的資料。

都是向低位址增長,棧頂指標是指向棧頂的。 由於esp的值在程式執行過程中會頻繁的改變,用到它的偏移量來定位變數會

很麻煩。因此,編譯器使用另外乙個暫存器ebp來記錄區域性基位址。ebp的值對於當前函式來說是不變的。函式區域性變數和引數

都可以用到ebp的偏移量來定位。當進入乙個新函式執行時,首先把舊的ebp值壓棧,然後把當前esp值作為新的ebp值,接著

改變esp值來為函式區域性變數預留出空間。

函式呼叫

先看一段**:

1 void

func(inta,

int b)

2 5

intmain(void)

6 我們把它編譯成彙編**: $ gcc -s function_call.c

可以看到func(8, 10)被譯成:

1movl$10

,4(%

esp)

2movl$8

, (%

esp)

3call

_func

引數10和8依次壓棧,然後執行call指令。call指令會把指令指標暫存器eip的值壓棧,作為函式呼叫完成後的返回位址ret。

1_func:

2pushl

%ebp

3movl

%esp,%

ebp4

subl$16

,%esp_func函式先把舊的ebp值壓棧,然後把esp的值賦給ebp,作為新的ebp值,最後把esp減去16為區域性變數buffer留出空間。

注意雖然buffer只要5個位元組,但是由於棧是以16位元組邊界對齊的,所以實際上分配了16個位元組的空間。

func函式被呼叫時,棧的結構:

好,現在讓我們來看一下緩衝區溢位會發生什麼?

01#include

02void

func(char

*pstr)

0307

intmain(void)

08上面**存在典型的緩衝區溢位問題。編譯,執行,發生了什麼?

嗯,彈出乙個我們很熟悉的記憶體訪問錯誤訊息框

在上面的**中,我們向buffer寫入乙個長字串,由於strcpy函式沒有越界檢查,它會一直工作,直到遇見null字元。

首先舊的ebp值會被覆蓋,接著函式返回位址ret也被改寫!甚至連str自身的部分值也被重寫了!

'a'的ascii碼是0x41,ret的值此時變為0x41414141,這已經不屬於該程序的定址範圍內了。

當func函式返回,ret的值送到eip暫存器,再取指令時便會發生記憶體訪問錯誤了。

我們發現通過緩衝區溢位的確可以修改函式的返回位址,從而改變程式的正常執行流向。

理論上,我們可以利用這一點來執行任意**。(未完,待續......)

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

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

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

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

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

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