ぎーくになりたい

情弱エンジニアがゆるーくぎーくになろうとする技術ブログ

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関数みたいな、イカニモな関数がないかだけ探る
checksecpwntoolsのセキュリティ表層解析機能で実行ファイルのメモリプロテクト情報を確認できる

    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で拡張しておくのが良い