せっかくreversingちょっとだけ解けるようになったので自分用メモとして書いておきます。
reversingって?
渡された実行形式ファイルやバイナリファイルを解析してflagを入手するctfの問題のジャンルのこと。
覚えておきたいコマンドやツール
- stringsコマンド
- objdumpコマンド
- gdb
- IDA(デコンパイラ)
- dnSpy
このうち上3つはELFファイル(linuxの実行形式ファイル)で主に使う。下2つはPE(windowsの実行形式ファイル)で主に使う。
stringsコマンド
言わずと知れた有名なコマンド。ファイルから文字列を取り出すことができる。これとgrepを組み合わせることでファイルから特定の文字列を検索することができる。
ex)strings a.out | grep -A 3 ctf{
//a.outから取り出した文字列のうち,ctf{を含む行とその後3行を表示する。
objdumpコマンド
ファイルの情報を表示するコマンド。reversingでは主に-dオプションをつけて使う。
アセンブラがそのままだとAT&T記法で出力されるのでintel記法がいい人は-M intelをつけよう。
ex)objdump -d a.out -M intel
//a.outのアセンブラが出力される。
gdb
プログラムを実際に動作させて解析するツール。
ex)gdb a.out //gdbを起動
set disassembly-flavor intel //(見づらい人は)アセンブラをAT&T記法からintel記法に変更する(デフォルトはAT&T記法)
b main //main関数のエントリーポイントにブレークポイントを貼る
r //プログラムをrun(実行)する。このあとmainのブレークポイントで一旦止まる。
b *0x8000602 //8000602番地にブレークポイントを貼る。*つけ忘れると変なとこに貼るので注意。
c //ブレークポイントまで処理を進める。
j *0x800060f //0x800060f番地の命令までjumpする。
i r //全てのレジスタの値を出力する。
x/s $rax //rax番地に格納された文字列を出力する。
x/5s *0x200000 //0x200000~0x200005番地に格納された文字列を出力する(?)
大体このくらい使えたらある程度のことはできるはず。
IDA
僕はあんまり使ったことないけどデコンパイラとしてよく名前の上がる有名なやつ。
詳しくはこちらを参照。
dnSpy
PEアプリケーションがデコンパイルできる。32bitか64bitかをあわせないとデコンパイルできないので注意。vscodeみたいなUIなので割とわかりやすいと思う。
おわり
アセンブリが読みづらくて最初は混乱することも多いreversingだけど,低レイヤがわかるだけで重宝されるので,お手軽にハッカーみたいなことがしたい方はぜひチャレンジしてみてください。