目錄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
暫存器內。這樣呼叫函式caller
的eip(指令)
資訊得以恢復。
至此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,然後新增之後,我們點選...