前言
這篇文章整理了筆者在練習 CTF 題目時常用的工具,有些工具在後續也會頻繁使用。另外,如果你有興趣一起跟著文章進行練習,可以使用文中提供的 Docker 環境,裡面已經包含了後續教學中會使用到的工具,此 repo 包含後面的題目及環境
環境
Dockerfile
docker-compose.yml
version: '2'
services:
main:
build: .
restart: unless-stopped
privileged: true
ports:
- "22224:22"
environment:
- EDITOR=vim
volumes:
- ./share:/home
networks:
default:
networks:
default:
Useful Tools
objdump
- 用於查看檔案的各種資訊
- 常用功能是反組譯程式
- 使用
objdump -M intel -d chal,-M intel指定架構為 Intel,-d chal指定要反組譯的檔案為chal
- 使用

checksec
- 查看檔案開啟了哪些保護機制
- Pwntools 內建此功能,也可以手動安裝
checksec.sh

one_gadget
- 如果能控制好
rbp和 return address,就有機會使用 one_gadget 取得 shell - 用於 libc 的利用
- 後續內容會進一步介紹

nc
- 遠端連線工具
- 題目幾乎都是使用
nc進行連線
seccomp-tools
- 用來檢查程式的 seccomp 規則
- 可以幫助了解應該撰寫什麼樣的 shellcode,或避免使用哪些函數

ROPgadget、ropper
- 這兩個工具用來列出 binary 中可以使用的 ROP gadgets
- 也能幫助快速產出 ROP chain


gdb
- Command line 形式的除錯工具
- 有多種插件可以讓 gdb 更加好用
gdb Plugins
筆者提供的 Docker 環境即包含 pwndbg 和 pwngdb。
Pwntools
- 匯入套件
from pwn import *
- 連線到遠端
remote('IP address', port)
- 執行本地端程式
process('./chal')
- 傳送資料
r.send(payload):傳送 payloadr.sendline(payload):傳送 payload 並換行r.sendafter(string, payload):在收到指定 string 後傳送 payloadr.sendlineafter(string, payload):在收到指定 string 後傳送 payload 並換行
- 接收資料
r.recv(n):接收 n 個字元r.recvline():接收一行資料r.recvlines(n):接收 n 行資料r.recvuntil(string):接收到指定的 string 為止
- 取得互動控制
r.interactive()
- 將數字轉為特定架構格式
p32(0xdeadbeef)p64(0xdeadbeef)
- 將資料轉回數字
hex(u32(b'\xef\xbe\xad\xde'))hex(u64(b'\xef\xbe\xad\xde\x00\x00\x00\x00'))
- 從 local 端程式進行 debug
gdb.attach(r)- 可以指定視窗分割模式
context.terminal = ["tmux", "splitw", "-h"]