溢位型漏洞分析

2022-06-05 13:36:07 字數 3987 閱讀 9015

目錄1.2 c語言中記憶體的劃分

2 溢位漏洞

待續。。。

1.1.1 緩衝區溢位漏洞

1.1.2 漏洞產生背景

1.2.1 記憶體劃分

記憶體劃分示意圖

(1)**區(text segment)

(2)全域性初始化資料區/靜態資料區(data segment)

(3)未初始化資料區 (block started by symbol,bss)

(4)堆區

(5)棧區

1.2.2 進行記憶體劃分的意義

(1)意義

c語言記憶體分配參考

記憶體管理基礎+常用記憶體管理函式使用

2.1.1 棧溢位漏洞

2.1.2 棧幀 stack frame

(1)棧幀包括

(2)重要的暫存器

esp:棧頂暫存器,指向棧頂

(3)操作棧的常用指令

pop:彈棧

(4)函式呼叫過程

在發生呼叫時,程式還會將被呼叫函式(callee)的指令位址存到eip暫存器內,這樣程式就可以依次執行被呼叫函式的指令了

首先將callee函式的引數逆序壓入棧,(如果被呼叫函式calle不需要引數,則沒有這一步驟

將被呼叫的函式callee壓入棧後,將呼叫函式caller進行呼叫之後的下一條指令位址作為返回位址壓入棧內(即壓入calle結束後需要執行的指令,以便告訴cpu這個函式呼叫完成之後該幹什麼,本例即返回到main函式的return處),這樣呼叫函式(caller)eip(指令)資訊得以儲存

將當前ebp暫存器中的值(也就是呼叫函式的基位址)壓入棧內,並ebp暫存器的值更新為當前棧頂的位址(即caller的esp位址)

esp的值減去乙個位元組數目值,實現esp向低位元組移動

之後將被呼叫函式callee的區域性變數等資料壓入棧內

開始執行eip的指向的記憶體位址中的指令

當被呼叫函式callee完成之後,需要丟棄被呼叫函式callee的狀態,並將棧頂恢復為呼叫函式caller的狀態

首先被呼叫函式的區域性變數會從棧內直接彈出,棧頂會指向被呼叫函式callee的基位址

然後將基位址記憶體儲存的呼叫函式caller的基位址從棧內彈出,並儲存到ebp暫存器內

再將返回位址從棧內彈出,並存到eip暫存器內。這樣呼叫函式callereip(指令)資訊得以恢復。

至此caller的函式狀態就全部恢復了,之後就是繼續執行呼叫函式的指令

函式呼叫過程參考

2.1.3 利用棧溢位漏洞

(1)利用棧溢位覆蓋函式的區域性變數資料值

當我們的fun函式執行到gets(str)時,檢視變數的位址以及記憶體的值

變數的記憶體位置

attack 0x006e1840 void (...)

fun 0x006e18b0 void (...)

str 0x00cffacc "燙燙燙... char[0x00000006]

password 0x00cffadc "abcde" char[0x00000006]

記憶體檢視

0x00cffacc [cc cc cc cc cc cc]cc cc ????????

0x00cffad4 cc cc cc cc cc cc cc cc ????????

0x00cffadc [41 42 43 44 45 00]cc cc abcde.??

0x00cffae4 cc cc cc cc bc fb cf 00 ???????.

由於puts函式不會限制輸入資料的長度,所以我們可以通過輸入特定字元在覆蓋掉password

輸入完畢後,執行到if語句時,再次檢視記憶體

記憶體檢視

0x00cffacc [41 41 41 41 41 00]41 41 aaaaa.aa

0x00cffad4 41 41 41 41 41 41 41 41 aaaaaaaa

0x00cffadc [41 41 41 41 41 00]cc cc aaaaa.??

0x00cffae4 cc cc cc cc bc fb cf 00 ???????.

結果結束後,此時eip內容為main函式之後的指令位址,繼續執行main函式,程式完成

注:實際上可能因編譯器不同,環境不同,其str與password記憶體位置差距也不同,需要自行判斷

(2)利用棧溢位漏洞覆蓋引數值

輸入16個字元+dcba,結果:

(3)利用棧溢位漏洞修改返回位址,實現函式的跳轉

**如下

#include #include #include void attack() 

void fun()

fscanf(fp, "%s", str);

str[5] = '\0';

if (strcmp(str, password) == 0)

printf("ok!\n");

else

printf("no!\n");

}int main()

繼續執行程式,記憶體資訊如下:

0x00f7f6c8  41 41 41 41 41 00 41 41   aaaaa.aa

0x00f7f6d0 [41 41 41 41]41 41 41 41 aaaaaaaa

0x00f7f6d8 [41 41 41 41|80 18 a2 00] aaaa€.?.

程式結果:

由於本環境下c語言程式中採用大端儲存,即資料的低位元組在記憶體中的位元組位址更高,所以最後將幾個資料位元組順序倒置

本例子執行完python後直接退出,如果不直接退出的話會發生如(2)一樣的結果,原因也相同

經典的棧溢位漏洞分析

c原始碼如下 include includeint main int argc,char ar 系統是ubuntu20.04,使用gdb peda除錯。bss段 bss segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symb...

檔案上傳漏洞 棧溢位漏洞

棧溢位是緩衝區溢位的一種,分配的記憶體空間是有限的,如果輸入超長的字串必然會導致溢位。緩衝區溢位中最危險的是堆疊溢位,因為入侵者可以利用堆疊溢位,在函式返回時改變返回程式的位址,讓其跳轉到任意位址,帶來的危害一種是程式崩潰導致拒絕服務,另外一種就是跳轉並且執行一段惡意 比如得到系統許可權。先看一段 ...

ms04011溢位漏洞

首先是漏洞工具ms04 011 然後裡面有dsscan,getos,ms04011三個程式,第乙個探測目標ip段是否有存在漏洞主機 第二個獲取目標ip主機的作業系統 第三個進行漏洞溢位 首先由於本機ip為172.16.1.44,所以將掃瞄範圍設定為172.16.1.1 254,然後新增之後,我們點選...