ドラゴンの力でControl Flowからバイナリ解析を手助けする

はじめに

こんにちは。morimolymolyです。 今日はControl Flow Graphを用いてバイナリ解析を手助けする手法をご紹介いたします。

背景

GoogleCTFのRev問題についてとある人物から連絡を受けました。

「似たような処理がある関数が多数ある場合どのようにして解析していますか?」

基本、私はCFGを見ます。 ですが、CFGを一瞥して似ているなーだけで終わらせるのもあれなのでGhidraスクリプトを書いてみました。

問題は以下のようなかんじでした。

defineで関数定義

関数の登録

この似たような関数がまとめられると解析が楽になりそうですね。

GhidraスクリプトでCFGを生成する

スクリプトの前に実際に関数のCFGを生成してみましょう。 今回は2つの関数について生成してみます。

add

sub

このようにしてみるとほぼ同一のコードであることがわかりますね(addとsubだしね)

BasicBlockの数とEdgeの数とで比較してしきい値をもうけて比較検討して関数を自動命名させてやれば解析はぐんと楽になるでしょう。

さて、GhidraスクリプトでCFGを得るにはどうしたら良いのでしょうか。

ghidra.re

このAPIを使えば良さそうですが、なんとドキュメントもexampleもなくぶん投げてしまいました!

そのためかんたんのためにBBの数とEdgeの数を計算して求めることにしました。 いかがコードになります。

gist.github.com

みたままBBを探して次があればそれも見に行くというコードです。 自動命名までは実装していませんが、それは読者の課題にしておきます(setNameメソッドでかんたんに命名できます)

おわりに

いかがだったでしょうか。 CFGは強力な武器になり得ることが皆様もおわかりかと思いますが、Ghidraではスクリプトの力を用いて更に強力にすることができます。

以上でおわります。