前言

這篇文章整理了筆者在練習 CTF 題目時常用的工具,有些工具在後續也會頻繁使用。另外,如果你有興趣一起跟著文章進行練習,可以使用文中提供的 Docker 環境,裡面已經包含了後續教學中會使用到的工具,此 repo 包含後面的題目及環境

環境

Dockerfile

FMRRRRRRRRRRRRRRRRURRRRRRRRRRRRRRU#EECRAUUUUUUUUUUUUUUUUSUUUUUUUUUUUUUUSXNMOINNNNNNNNNNNNNNNNENNNNNNNNNNNNNNErPTDMNRRuORTayaaaaaaapggmesegcgcreeeeeeeeenSY[uApepppppppieekcecridipmcccccccccrEP"bItstttttttpmmdhdhotthhhhhhhhhotO/uN--------3iooo~~-ooooooooooh2IunEg|gggggggiir-tc/c/rte2NstReeeeeeeeinn'i'lplPf"""""""""TrututttttttnssP%owowsssdpiaees/:Ynsttve'snnnn~ooeymnnne[s2Jumiiiiiiitaaarsuedeguuuftpgddr"b2Kpinnnnnnnallrm/dbd.rrrihoe""v/i.dnssssssslll/inohghbgcccnorliun0aitttttttlrtutt/deeeenthcs/4tmaaaaaaasouElAt&t.b"eerseilllllllpennmlLp&pgi~~~haa/szlllllllwce/poLssdn///onp~~bhenc_stk=::bipPPog./id-------togsy_(/itwwwkei..n"yyyyyyyomahPsAs/nnnn-~lngg/,opddaeLgegidggr/hiddttogglcrl-gscLititbddu.etbbi"ipcciuustesu)tutgbbnga_iin-neccbrbotwrhph~///"dpanniDin-clycooeNu.u/gpab"nii""sgm6-alr/Obsbdwnigtt,]isdu-gdpsdnP.h.bngnephbldiessuAccigeil"r-tbtvtlSoondl~th-osmigoylSmmibh/~e-uealzwneoW//t.e./a"trkidsgeskDps.pag.p]evebphe'/:wcpypdg(2ektf'Anwy"/bd)ryggiLdu"gib"ia+-l/Lbadnipss+dee'gpbinuum-eb/t/tititdmvyecpx~ntionutt/w/~i~lalecpnP.t/svsts/a/dw.g..-imismebngdpgpmlks.tggdbyditiehdcdbi"bngcby///~binigrpsscs/.ninedtsoupgitinpuohmdwittemndmont~tgpe_oed/-a-cnrb~.twpeo-sg/gokynnaPdotgfuwblrhiitnissonghgnynedinn3btecrtpoctypamtptuhexornd3i-fpfiuptiplysthfoinl3e-virtualenv

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

objdump

checksec

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

checksec

one_gadget

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

one_gadget

nc

  • 遠端連線工具
  • 題目幾乎都是使用 nc 進行連線

seccomp-tools

  • 用來檢查程式的 seccomp 規則
  • 可以幫助了解應該撰寫什麼樣的 shellcode,或避免使用哪些函數

seccomp-tools

ROPgadget、ropper

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

ROPgadget

ropper

gdb

  • Command line 形式的除錯工具
  • 有多種插件可以讓 gdb 更加好用

gdb Plugins

  • peda
  • pwndbg
    • 專為 pwn 開發的插件
    • 提供許多方便打 pwn 時使用的指令
  • gef
  • pwngdb
    • 由大神 angelboy 撰寫
    • 提供多種方便 pwn 利用的指令

筆者提供的 Docker 環境即包含 pwndbg 和 pwngdb。

Pwntools

  • 匯入套件
    • from pwn import *
  • 連線到遠端
    • remote('IP address', port)
  • 執行本地端程式
    • process('./chal')
  • 傳送資料
    • r.send(payload):傳送 payload
    • r.sendline(payload):傳送 payload 並換行
    • r.sendafter(string, payload):在收到指定 string 後傳送 payload
    • r.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"]