2024/01/27 ELF読解演習
本勉強会の進め方
C言語で記述したプログラムを、コンパイルし逆アセンブルした結果を観察してみましょう。
各項目は、説明と演習、演習の解答例で構成されています。
腕に自信のある方は、ぜひ自力で演習を解いてみてください。
難しいと感じた方は、演習の解答例を見ながら取り組んでみてください。
演習は、一問解くごとに解答例を確認することをおすすめします。
「+α」の情報は、今後の学習を想定した応用的な内容です。
より深く理解したい方は、詳しく調べてみてください。
◆ まずはHello Worldから
Warm up: コンパイル、実行
リターンコードとして0を返す以外に何もしないプログラムを実行してみます。 code:main.c
int main(void) {
return 0;
}
演習:
1. 上記のソースコードを、warmup/main.cとして保存しましょう。
2. warmupディレクトリに移動しましょう。
3. gccを用いてmain.outというファイル名にコンパイルしてみましょう。 4. main.outファイルを実行してみましょう。
HINT:
下記コマンドで、main.outの実行権限を設定してみてください。
$ chmod u+x main.out
演習の解答例:
1.
省略
2.
$ cd warmup
3.
$ gcc main.c -o main.out
NOTE: -o オプションで、出力先のファイル名を指定できます。
次に、正しくファイルが生成されたことを確認します。
$ ls
lsで得られるファイルのリストにmain.outがあれば大丈夫そうですね。 +α:
grepコマンドでファイルリストを名前検索してみましょう。 ls | grep "main.out"
NOTE:
|はパイプといい、左側のコマンドの実行結果を右側に渡す役割をします。 2.
$ ./main.out
何も出力されずにプログラムが終了すれば成功です。
/icons/hr.icon
この項目はリンク先のページに記述しています。
/icons/hr.icon
ここからは、デバッガ gdb を用いて機械語命令を読み解いていきましょう。
機械語で記述された処理内容を理解するには、C言語がどのようにアセンブリに変換されるかを意識することが重要です。
/icons/hr.icon
まとめ
今回は、ELFファイルが生成されるまでの過程と、機械語(アセンブリ)の読解に関して学習しました。
次の学習のために
バイナリ解析の道具には様々なものがあります。
機械語は普通の人間には読めない、と書きました。
しかし、アセンブリが登場する前、機械語は人間が記述していました。
プロセッサの仕様を把握することでことで、現在でも人間がアセンブルを実行することが理論上可能であるはずです。
ELF形式について
CTFのReversing・Binary Exploitationや、マルウェア解析は、今回学習した内容と深い関わりがあります。
リバースエンジニアリングの基礎となるのは、今回学習した内容です。