はじめに
このエントリーは以下、セキュリティコンテストチャレンジブックのほぼ写経となります。
もし内容に何かありましたらコメントにてお知らせいただければと思います。
バイナリ解析(Reversing)とは
バイナリとは英語でbinaryと書きます。
bi-という接頭語は"2"を表していて、「2進数で表現された~」という意味になります。
binary codeであれば、2進数で表現されたコードということですね。そのままですが。
最近の本ではReversingと書かれていることが多いですが、ウノのリバース、
つまり逆にする、という意味から想像するのは難しいですよね。
とあるものを逆にするのですが、いったんここでは忘れてください。
ではCTFにおけるバイナリ解析というのはなんでしょうか。
プログラムの開発者ならわかるとは思いますが、
プログラムというのは普通高級言語と言われる、
人間の言葉に近いプログラミング言語を使って作成します。
そしてそれを機械が読めるようにする作業のことをコンパイルと言います。
(スクリプト言語のように逐一翻訳(インタプリタ)する言語もありますがここでは便宜的な説明に留めます)
こうすることでそのプログラムを機械が実行することができるようになります。
CTFではこれを逆に行います。
つまり先ほどのbinary code、いわゆる機械語を逆コンパイルして
アセンブラ(アセンブリ言語)にしてからアセンブラのコードを読んで
元のプログラムがどのような処理を行っているか解析したうえでフラグを奪取します。
逆にする、というReversingの意味はこの逆アセンブルのことを指しているわけですね。
いきなりアセンブラという言葉が出ましたが、これは機械語と高級言語の中間にあたる言語だと思ってください。
これを逆に行うことは難しいため、機械語と1:1で紐づいているアセンブラを読んでプログラムを解析するのです。
最終的にはアセンブラを読めるようになることがバイナリ解析の目標なのですが、
それ以前にフラグを奪取できる簡単な問題もあります。
以下では手順に沿ってバイナリ解析の方法を学んでいきたいと思います。
表層解析
まずは表層解析です。
機械語のプログラムは何らかのファイルとして出力され、マシン上で実行されます。
このファイルの概要をつかむことが表層解析となります。
具体的にはどんなOSで実行できるファイルなのか、どのような形式で保存されているファイルなのか、
どのような文字列が含まれたファイルなのか等を調査します。
Linuxでは以下のコマンドを利用して表層解析を行います。
- file
- strings
- leadelf
- grep
- unzip/tar/gunzip/xz
動的解析
表層解析が済んでどのようなファイルかがわかったら、今度は実際にファイルを実行して手がかりをつかんでいきます。
この実際にファイルを実行して動作を確認することを動的解析と言います。
ここではgdbというツールを利用してデバッグしながらどのようなプログラムなのかを解析します。
静的解析
動的解析では実際にプログラムを実行してバイナリコードを解析しましたが、
静的解析ではIDAというツールを使って視覚的にプログラムを解析します。
バイナリファイルを読み込ませると、アセンブラで書かれた命令群がブロックに分けられ、
命令順に上から表示されていたり、条件分岐やループ処理を矢印で表現して人間に読みやすく表示してくれます。
冒頭で逆アセンブルして~と言っていた内容がこの静的解析になりますね。
まとめ
今回はCTF初心者向けに(あと自分のアウトプット用に)
CTFにおけるバイナリ解析、Reversingについてまとめてみました。
少しでも参考になればうれしいです!
(次はハンズオン的なことがやりたいなぁ!!)
おわおわり!