經典的棧溢位漏洞分析

2021-10-09 20:10:26 字數 2033 閱讀 1176

c原始碼如下:

#include#includeint main(int argc,char* ar**)
系統是ubuntu20.04, 使用gdb-peda除錯。

​​bss段:(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。

資料段:資料段(data segment)通常是指用來存放程式中 已初始化 的 全域性變數 的一塊記憶體區域。資料段屬於靜態記憶體分配。 

**段:**段(code segment/text segment)通常是指用來存放 程式執行** 的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於 唯讀 , 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些 唯讀的常數變數 ,例如字串常量等。程式段為程式**在記憶體中的對映.乙個程式可以在記憶體中多有個副本.

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc/free等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張)/釋放的記憶體從堆中被剔除(堆被縮減)

棧(stack):棧又稱堆疊, 存放程式的 區域性變數 (但不包括static宣告的變數, static 意味著 在資料段中 存放變數)。除此以外,在函式被呼叫時,棧用來傳遞引數和返回值。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。儲動態記憶體分配,需要程式設計師手工分配,手工釋放。

比如現在棧底位址(rbp)是0xffdf88,棧頂位址(rsp)是0xffdf68,當需要入棧時,比如入棧8個位址單元,則rsp=rsp-8(注意,是減8,即存入新內容的位址是小於之前棧頂位址的,棧是從高位址往低位址發展的),然後將內容從rsp所在的位址往高位址寫入(即,從0xffdf60往0xffdf68寫入,棧的內容寫入時從低位址往高位址寫入)。

另外,c程式是通過__libc_start_main函式來呼叫main函式的。

使用r `python3 -c 'print("a"*268 + "b"*8)'` 開始執行

如圖1,進入main函式的時候,呼叫main函式的__libc_start_main函式的返回位址已經寫入stask(0x7ffff7ded0b3)。接下來,將把棧底指標(rbp)也存入stask,並把棧底指標(rbp)指向棧頂指標(rsp),然後根據編譯時計算需要的棧空間,將rsp減於需要的棧空間(這裡是0x110)。如圖2,rbp變成了0x7fffffffdf60,rsp變成0x7fffffffde50。

edi儲存著main函式的第乙個,rsi+0x8儲存著乙個位址,這個位址指向的就是main函式的第二個引數,也就是我們生成的268個『a』和8個『b』。如圖三

接著,程式開闢一段空間(lea    rax,[rbp-0x100]),也就是buf,連同main的第二個引數所在的位址一起給到暫存器,作為strcpy的引數。

可以想象,strcpy函式會在rbp-0x100的位置往高位址空間寫入我們的輸入引數。看看執行後的stack

如圖4,原本0x7fffffffde48位置儲存的是返回位址,如今被我們覆蓋了。這就導致了stack溢位。

檔案上傳漏洞 棧溢位漏洞

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

溢位型漏洞分析

目錄1.2 c語言中記憶體的劃分 2 溢位漏洞 待續。1.1.1 緩衝區溢位漏洞 1.1.2 漏洞產生背景 1.2.1 記憶體劃分 記憶體劃分示意圖 1 區 text segment 2 全域性初始化資料區 靜態資料區 data segment 3 未初始化資料區 block started by ...

棧溢位分析

棧是從高位址向低位址方向增漲,堆的方向相反。在c語言程式中,引數的壓棧順序是反向的。比如func a,b,c 在引數入棧的時候,是 先壓c,再壓b,最後a。在取引數的時候,由於棧的先入後 出,先取棧頂的a,再取b,最後取c。c語言是不作棧溢位檢查,如下 可以正常編譯執行。如果函式區域性變數發生棧溢位...