はじめに
先月 IDA のメジャーバージョンが 8.0 にアップデートしました。
hex-rays.com
バージョンアップによって、IDA Pro には makepatというpluginが標準搭載されるようになりました。makepat は F.L.I.R.T. (Fast Library Identification and Recognition Technology) *1 というシグネチャマッチング機能に適用できるパターンファイルを自動生成してくれます。
F.L.I.R.T. は既存のライブラリ識別および自動的な命名を行ってくれるためIDA Proユーザにとってはなくてはならない存在ですが、最新のライブラリや本体が実質シェルコードと化しているマルウェアには IDA が提供している F.L.I.R.T. だけでは対応しきれません。そのため、そのような検体を扱う場合は「F.L.I.R.T.を自作して適用する」という手法が選択肢として上がってきます。本稿ではF.L.I.R.T.の作成と適用方法について簡単にまとめます。
なお、F.L.I.R.T. を自作して適用する手法については既に MANDIANT さんがブログに公開しているため目新しい内容ではありません。
しかし、今回のバージョンからは3rd party製のツールに頼らずhex-raysさんの提供するutilitiesだけで完結するようになり、作成方法もかなり楽になりました。今までIDAPythonよくわからなくて敬遠していた方がいらっしゃればこの機会に触っていただければと思います。
(もっといい方法があるかもしれません。ご了承ください。)
makepat の使用とsignatureの適用(IDA Pro 8.0)
流れとしては、以下の3ステップとなります。ステップ、と呼ぶほど段階が分かれているかは怪しいですが......
1. makepat plugin で F.L.I.R.T. のパターンファイル(.pat)を作成
2. .pat ファイルからシグネチャファイル (.sig) の作成
3. .sig ファイルをIDA Proから読み込ませて適用
下準備
事前に用意するものは二つです。
- sigmake
- 解析済みのidbファイル(IDA Proで解析して保存したファイルです。)
実験用に解析済みの検体の亜種となるidbもあるとベストだと思います。
Release noteにも書いてありますが、makepat で作成した pattern から signature を作成するには公式から提供されている sigmakeというツールが必要となります。これはhex-raysのDownload centerから落としてきてください。Flair 8.0の中に入っています。
https://hex-rays.com/download-center/
.pat ファイルの作成
それでは、F.L.I.R.T. のパターンファイルを作成します。といっても、解析済みのidbファイルを IDA Pro から開いて上部メニューから Edit -> Plugins -> "Create PAT from the database" をポチポチするだけです。保存先を聞かれますので、好きな場所に好きな名前で保存しましょう。
これで、あなたが解析したidbに存在するfunctionの一覧からパターンファイルが作成されました。このidbにstripされる前のLibraryが静的リンクされていた場合、それらの名称を元にしたパターンファイルを作成してくれるため、stripされた後のマルウェアに適用すればLibrary部分の関数だけ綺麗に命名がされることになります。
筆者は例として、124個の関数が存在するシェルコードタイプの検体に対して、37個分関数に命名をしてみました。結果として、makepat plugin によって37個のパターンが作られたことが実行結果から確認できました。
.pat => .sig ファイルの作成
.pat => .sig の変換はsigmakeを実行するだけです。先ほど作成した.patファイルを第一引数、アウトプットの.sigファイルを第二引数として以下のように実行すればシグネチャに変換されます。
$ sigmake.exe my_custom_signature.pat my_custom_signature.sig
.sig ファイルの適用
最後に、自作の.sigファイルを読み込ませます。IDA ProのインストールフォルダにはsigというF.L.I.R.T. シグネチャを配置しているフォルダ*2 があり、そこにはアーキテクチャごとにフォルダが切り分けられてシグネチャが格納されています。今回は pc というフォルダに作成した.sigファイルを配置し、同じフォルダに存在する autoload.cfg に設定を追加して読み込ませてみます。
筆者は my_custom_signature という名称で.sigファイルを配置し、autoload.cfg に設定を書き込みました。(下記画像参照)
これだけで、自作のシグネチャファイルを任意のidbに対して適応可能になりました。
亜種に自作シグネチャを適用してみる
最後に自作シグネチャを試しに使ってみます。今回は先ほどパターンを抽出した検体の亜種となるマルウェアのidbを用意して実験してみることにしました。シグネチャの適応はIDA ProでShift + F5を押し、signatureのviewで右クリックして"Apply new signatures"をクリックするとできます。以下のような画面が出てくるので、自分で作成した名称のシグネチャを選択してOKを押すだけです。
シグネチャ適応前 <=> 適応後の画像が以下となります。シェルコードのため左の反映前はほとんどシグネチャが認識されていない状態ですが、自作シグネチャを当てると 32 / 37 が適用されてきちんと名前が付きました。
マルウェアに特化したシグネチャを作成することにあまり意味はありませんが、亜種の解析補助や攻撃者の分析(同一ライブラリの使用の特定)に使えるかもしれません。シグネチャを作る敷居は大幅に下がったので、とりあえず作っておいて充実させておくという選択肢もありなのではないかなと思います。
.sig ファイルを Ghidra にも適用する
筆者は先日まで 「.sig ファイル(F.L.I.R.T.)はIDA Proユーザの特権!」だと思っていたのですが、ここで作った.sigファイルはGhidraにも適用可能だということをプロから聞き目から鱗でした。(プロは以下のGhidra本を執筆、翻訳されているガチプロです。)
www.amazon.co.jp
IDA ではなくGhidra派の方も一定数いらっしゃると思うので、Ghidraでも同様にシグネチャを適用してみます。適用にはApplySigというGhidra Scriptを使用します。
これをGhidraのScript Managerから実行させるだけです。
実行すると適用する.sigファイルを求められるので、先ほど作成した.sigファイルを選択すればOKです。
自作シグネチャを選択して実行すると、シグネチャが読み込まれて36 / 37のシグネチャが適用されたことがわかります。左下のFunctionsにもシグネチャ適応後の命名が載っているのでうまくいっていますね。
.sig ファイルは少し古いものでよければFLIRTDBに蓄積されているので、Ghidra ユーザの方も使用してみると解析が楽になるのではないかと思います。Ghidra 至上主義の方もこの機会に試してみてください。
github.com
おわりに
makepat plugin を使った簡単な自作シグネチャの作成について書き残しました。また、筆者は普段IDA Proしか使っていないのですがGhidraでもF.L.I.R.T.の適用をやってみました。
筆者がマルウェア解析の勉強を始めた頃だと周りは「IDA Pro一強」という感じでIDAユーザしか見ませんでしたが、最近は前項でも紹介したGhidra本やGhidraを使用した研修*3が増えた影響か、Ghidraをメインで使用するユーザもちらほら見始めました。
先日とうとう「IDAはわかりませんけどGhidra使ったことあります!」という人にもお会いして、(「IDA Pro以外勝たん」という心境が変わらないのだが、もしかして自分、老害になろうとしている?) という気持ちになり、IDA Pro だけでなくGhidraにも触れながら書いてみました。
本内容が参考になる人なんて日本に数人レベルだとは思いますが、マルウェア解析している人の参考になれば幸いです。
*1:参考情報: https://github.com/Maktm/FLIRTDB
*2:一般的には "C:\Program Files\IDA Pro 8.0\sig" に配置されていると思います
*3:マルウェア解析の研修としては有名な FOR610 というSANSが提供するトレーニングがあるのですが、そちらの静的解析でもGhidraを使うようになったようですwww.sans.org