バイナリファイルの差分を比較するツールが便利
Posted on
今回は、BinDiffというツールを使ってバイナリファイルの差分比較を行ってみました。
バイナリの比較が役に立つ場面として想定される2つを以下に記載します。
- セキュリティアップデート前後のバイナリを比較することで、Exploitを防ぐための改修部分から脆弱性を突くExploit作成に必要な情報が得られる。
- 解析済みのマルウェアとその亜種とを比較し、共通の機能(関数)を洗い出す。
準備
BinDiffが比較対象とするのはバイナリ解析ツールでおなじみのIDA proでバイナリから作成した.idbファイルです。 IDA proを持っていない人はFreeware版をここからダウンロードすることが出来ます。
BinDiffは以下のサイトからダウンロードできます。
https://www.zynamics.com/software.html
ダウンロードしたインストーラを実行するとことでデフォルトではC:\Program files\BinDiff
が作成されます。なおインストール時にはIDA proのインストールパスを指定する必要があります。 .jarファイルを実行することでGUIアプリケーションを起動することができます。
利用開始
今回の比較に用いたバイナリは、Open sourceのRATであるLilith検体2つです。
-
SHA2: 5e4a190f8f4fc8800cf348cdc0e1ddc674215b02d1ef9b9a9e12605a3e0315cf
- ソースコードからコンパイルしたバイナリ
上記バイナリからIDA proで.idbファイルを作成し、比較を行います。
同じソースコードからコンパイルしているはずなのに、なんと、Simirality(類似度)は0.06でした。
Mached function画面には同一と推測される関数が表示されます。
ためしにConfidenceが0.91の関数を選んでみると、関数内部のCall treeの構造が同一であることが確認できた。
ピンチアウトして拡大してみるとアセンブリの中身まで確認できます。
この関数はSimilarity=0.86, Confidence=0.91と高確度の一致ではありますが、Call treeの構造が似ているだけで中身が全く異なる関数であることが分かりました。つまり、Confidenceが高い関数が同士が類似機能を持つとは一概には言えないようです。
Similarityが高いのはCall treeが類似していることに起因していると思われます。 他の関数を確認してみると、Confidenceが高くSimilarityが低い関数同士は機能が類似している傾向があるようです。これら関数の場合は赤枠で示すようにどちらも書込みの機能を有しています。
まとめ
今回BinDiffを使用したことで以下の2点が分かりました。
- 同一ソースファイルからコンパイルしたバイナリでもアセンブラレベルで大きく構造が変わり得る
- Low SimilarityかつHigh Confidenceの関数は類似機能を持つ可能性が高い⇒解析済みのマルウェアとその亜種とを比較し、共通の機能(関数)を洗い出すためにも有効