首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CSAPP Attack Lab 緩衝區溢出完整攻略:從 Smoke 到 Nitroglycerin

     編輯:關於C語言

CSAPP Attack Lab 緩衝區溢出完整攻略:從 Smoke 到 Nitroglycerin

經典 CSAPP Buffer Overflow Lab 實戰筆記,通過注入 Shellcode/ROP 鏈覆蓋返回位址,逐級突破 ASLR、Stack Canary、NX 等防護。

環境準備

# 關閉 ASLR (實驗程式似經特殊處理可不關)
sysctl -w kernel.randomize_va_space=0
# 編譯選項開啟可執行棧
gcc -z execstack -fno-stack-protector ...

Level 0:Smoke - 修改返回位址

  • getbuf 棧框:buf 在 ebp-0x28,返回位址在 ebp+4,距離 44 Bytes。
  • Payload:44 字節填充 + smoke 函數位址 (0x08048c18)。
  • ./hex2raw < level0-smoke-hex.txt | ./bufbomb -u user

Level 1:Fizz - 帶參數呼叫

  • fizz(int cookie) 需要參數等於 cookie。
  • 棧佈局:填充 44B + fizz 位址 + 4B 偽返回位址 + 4B cookie 值。

Level 2:Bang - 注入 Shellcode 修改全域變數

  • 需修改 global_value 為 cookie 後跳轉 bang。
  • Shellcode (x86 AT&T):
    push $0x08048c9d   # bang 位址入棧
    mov $0x3955ae84, %eax  # cookie
    mov %eax, 0x804d100    # global_value = cookie
    ret                    # 跳轉 bang
  • 將 Shellcode 機器碼放入 buf 開頭,返回位址指向 buf。

Level 3:Dynamite - 恢復棧框返回 caller

  • 要求 getbuf 返回 cookie 給 test,不可破壞 test 棧框。
  • Shellcode 需:保存 ebp、設定返回值 eax=cookie、返回 test 後續指令 (0x08048dbe)。

Level 4:Nitroglycerin - ASLR 模擬 + NOP Sled

  • -n 參數啟用 getbufn,ebp 隨機 (模擬環境變數)。
  • buf 位址隨機 5 次,最大 0x556836c8。
  • 技巧:NOP Sled (0x90) 填充 buf 前部,Shellcode 置後,返回位址指向 NOP 區最高位址。
  • 計算:buf 到返回位址距離 0x20c,Shellcode 15B,填充 0x20c-15 個 NOP。
  • ./hex2raw -n < level4-hex.txt | ./bufbomb -u user -n (需連續 5 次成功)。

核心知識點總結

資源連結

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技術說明
棧溢出原理局部緩衝區無邊界檢查,覆蓋 saved ebp + 返回位址
Shellcode 注入將機器碼放入緩衝區,劫持控制流跳轉執行
NOP Sled滑板指令增加著陸區容忍度,應對地址隨機化
棧框恢復Level 3/4 需手動恢復 ebp/esp 確保 caller 正常返回
防護機制ASLR(位址隨機)、Canary(棧守護)、NX/DEP(不可執行棧)、PIE(代碼隨機)