今日目標(3 項)
理解堆疊溢位原理(stack frame、return address 覆寫、buffer overflow)。
熟悉防護機制與名詞:ASLR、NX/DEP、Canary、PIE,並學習如何在受控環境下關閉或調整測試。
實作一個簡單的 overflow PoC:建立脆弱 C 程式、用 gdb 找 offset、用 Python(pwntools) 製作 exploit 並驗證 flag/shell。
必備工具
gcc, gdb, pwntools(Python)、pwndbg/gef(gdb 插件)、objdump、readelf、netcat(若需 remote)。
測試環境:隔離 VM 或本機 docker container(關閉對外網路或用 loopback)。
建議步驟(一步步照做)
寫一個簡單脆弱程式 vuln.c(例如 gets(buf) 或 strcpy 無邊界檢查)。
編譯(方便測試):
# 方便測試:關閉 stack protector、PIE,關閉編譯器優化
gcc -fno-stack-protector -z execstack -no-pie -g vuln.c -o vuln
用 gdb / pwndbg 觀察:執行並填入長字串,找到 overflow 導致 crash 的 return address 偏移(可用 cyclic/pattern)。
python3 -c "from pwn import cyclic; print(cyclic(200))" # 產生測試模式
在 gdb 裡用 run ,info registers,cyclic -l 找 offset。
確認保護機制(查看 binary):
checksec --file=./vuln
readelf -h vuln
若啟用 ASLR/Canary/NX,先在受控環境關閉或調整測試策略(例如臨時關閉 ASLR:echo 0 | sudo tee /proc/sys/kernel/randomize_va_space)。
撰寫 exploit(pwntools):用找到的 offset 製作 payload(填充 + 新 return 指向 system("/bin/sh") 或跳到 shellcode)。
from pwn import *
p = process('./vuln')
payload = b'A'*offset + p64(ret_addr)
p.sendline(payload)
p.interactive()
驗證與紀錄:取得 shell 或 flag,截圖 gdb crash 與 exploit 成功畫面,保存 exploit script、gdb log、binary hash。
還原環境:恢復 ASLR(echo 2 | sudo tee /proc/sys/kernel/randomize_va_space),刪除/關閉測試容器。
今天完成 Day15:實作基礎 Buffer Overflow。從撰寫脆弱 C 範例、用 gdb 找偏移並確認 crash,到用 pwntools 撰寫 exploit 並驗證取得 shell/flag。我更理解 return overwrite、堆疊布局與 ASLR/NX/Canary 對 exploit 的影響,也學會在受控環境中關閉保護做測試並在結束後還原。下一步會練習 ROP 與繞過保護技巧。