由於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下目前碰到棧保護等措施,暫時還沒研究出結果。問題描述如下 分析下面程式,可以得知...