CTF バイナリ解析のお勉強メモ ①
CTFなどのバイナリ解析時に、ひとまずやってみることまとめ
インストール関連は下記にまとめる
alt256.hatenablog.com
1. fileの種類をざっくりと掴む
# file <filename> # string <filename> | grep "{"
file
で大枠のファイル拡張子が判明するので、最初に叩いて方針を立てる
実行ファイルの場合はビルド環境もある程度分かる
`x86-64` : Linux 64bit 実行ファイル `80386` : Linux 32bit 実行ファイル `ARM` : ARM 実行ファイル
string
でバイナリ内部の文字列が判明するので、ダメ元でCTFの接頭辞も確認しておく
2. binaryファイルの情報を集める(Tool使用)
# strace <filename> # ltrace <filename> # objdump -d -M intel <filename> # checksec <filename>
ltrace
はmemcmpなどで単純な値比較をしていると値を確認できる(初級問題はこれだけで解けることもある)
strace
はシステムコールの追跡を実施するので、プロセスIDなどの確認可能
objdump
は色々な用途があるが、一旦はread_flag
関数みたいな、イカニモな関数がないかだけ探る
checksec
はpwntools
のセキュリティ表層解析機能で実行ファイルのメモリプロテクト情報を確認できる
Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x400000) RWX: Has RWX segments
3. 普通に動かしてみる
注:CTF以外の場合は、マルウェア感染対策は必須
方針:とにかくセグる方法を探すこと ① とりあえず、普通に実行 ② 長い文字列を入力 ③ %p を入力(フォーマットストリングバグ) ④ 異常値入力(正の整数なら、マイナスや超大きい数など)
4. gdbで動かしてみる
# file <filename> # objdump -d <filename> # gdb -q <filename> # gdb -q -p <PID>
上の2つはすでに叩いているが、GDB用に再度確認する。
1. file
で得られるno stripped
(デバックシンボルあり)になっているか?
2. objdump
で得られる関数や命令(Breakpoint用)
gdb
には、新たにプロセスを起動する場合と、起動中のプロセスにアタッチする場合があるので、適切な方を選ぶといい。
また、素のGDBだと使用感がイマイチなので、gdb-peda
で拡張しておくのが良い