Reversing
たぶんReverse Engineering(リバースエンジニアリング)の略?t6o_o6t.icon
前提知識
wgetでファイルをダウンロードする
curlでもよい
tarコマンドでtarファイルを解凍する
問題によって圧縮されていない場合や、別の形式で圧縮されている場合がある
バイナリファイルだけを渡される場合が多い
まず表層解析し、次に動作を解析する
表層解析
Reversingの第一段階
Forensicsっぽさを感じるときがあるt6o_o6t.icon
文字列の存在確認
stringsコマンド
フラグや、それに近い文字列がバイナリに隠れていないかを見る
実行形式の特徴を特定することが必要
fileコマンド
ELFファイルの場合
ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, ...
ELFなら、readelfも試すことができる
WebAssemblyの場合
out.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)
objdumpコマンド
動作を解析する
実行方法が分かったら、動作の分析を始めることができる
動作の解析は2つの方法を繰り返す
動的解析
コードを動かして、動作の概要を理解する
何をするファイルなのかを理解したい
理解しやすいが、内部がどのような機構なのか想像するには限界がある
gdbなどのデバッガをうまく使って、なるべく多くの情報を取りたい
gdbでブレークポイントを設定する
gdbで変数をウォッチする
静的解析
アセンブリ言語を読んで、動作の詳細を追う
単純な命令の集まりのため、情報を得る効率は低い
人間が直接書くアセンブリに比べて、理解しにくい要素が多いと思うt6o_o6t.icon
たくさん読んで慣れる
逆アセンブルしたコードを読む場合、objdumpやgdbを使える
Ghidraなどを使うと、ある程度自動でデコンパイルも可
手動逆コンパイルのほうがアセンブリ言語への理解が高まると思うt6o_o6t.icon
アセンブリ言語
実行ファイルは、C言語などのソースコードをコンパイルしてリンクしたもの
CTFであってもこれは同じ
人間が機械語を手で打ち込むというのは遠い昔の話
わかったことは共有できる形で残す
変数名、関数名を変更する
Ghidraなどの静的解析ツールでは、DecompileしたC言語のソースの変数名はでたらめな文字列になっている
コンパイルの際に、ローカル変数の名前や細かいデータ型の情報は失われてしまう
変数名を書き換える機能を使って、変数の意味が分かったら随時更新する
擬似コードにする
アセンブリを読み動的解析も行えている場合、擬似コードを書けると良い
ここでの擬似コードは、架空の言語ではなく動作を擬似的に再現するコード
C言語で書けるのが良いかもしれないt6o_o6t.icon
逆コンパイラ
コメントを残す
チームで参加している場合は、書いた擬似コードなどを共有しておくと便利
Reversingは、LinuxなどのOS上で、C言語などから生成されたファイルがどのように実行されているのかについて、詳しく理解できていたほうが良さそうt6o_o6t.icon
cf. セキュリティを学ぶのに役立った本