IDAの便利プラグイン3選!!!

これはセキュリティツール系 Advent Calendar 2018 の25日目の記事です。

この記事では便利なIDAのプラグインを3つ紹介したいと思います。

findCrypt

findCryptは暗号に使われる定数をgrepすることで、どんな暗号が使われているか判別するIDAプラグインです。

github.com

使い方

IDAにバイナリを読み込ませた状態で、メニューバーのFile->Script file...からfindcrypt.pyを実行することで使えます。 実行すると以下のようにOutput windowにスキャンの結果が出力されます。以下の例ではRijndaelで用いられている定数が見つかっていますね。

f:id:TAKEmaru:20181224221904p:plain
Output windowに出力されたfindCryptによるスキャンの結果

また、見つけた定数に名前をつけてくれるので、ディスアセンブル結果が表示されているIDA View-A上からも定数を確認しやすいです。

f:id:TAKEmaru:20181224222028p:plain
findCryptによって発見されたRijndaelの定数

シュッと用いられている暗号がわかって便利ですね。定数を使わないようにカスタムされた暗号が用いられている場合はこのプラグインでは見つけられないので、自力でがんばる必要があります。

LazyIDA

LazyIDAはMake your IDA Lazy!を目指しているプラグインです。 いくつか機能がありますが、データをC/C++の配列やPythonのlistに変換してくれる機能が便利です。

github.com

使い方

IDAのpluginsディレクトリ以下にLazyIDA.pyを配置すると使えるようになります。 IDAの画面上で左クリックすると、Convertというメニューが追加されていると思います。ここから好きなフォーマットを選択し変換することができます。

ここでは、先ほどfindCryptで見つけたRijndaelの定数をLazyIDAでPythonのlistに変換してみます。

f:id:TAKEmaru:20181224221205p:plain
LazyIDAでデータを変換する様子

変換した結果はOutput windowに出力され、これをコピペしてPythonスクリプトから扱うことができます。

f:id:TAKEmaru:20181224221321p:plain
Output windowに出力されたLazyIDAで変換したデータ

これはエンコードされたデータをデコードするときや、暗号化を解くときのスクリプトを書くときに便利です。

KeyPatch

IDAにはx86/x64を対象にしたアセンブラが組み込まれていますが、他のアーキテクチャを対象としたものはありません。 Keypatchは軽量なmulti-platform, multi-architecture assembler frameworkである Keystone – The Ultimate Assemblerを使って、IDA上で様々なアーキテクチャへのアセンブルを実現し、x86/x64以外のバイナリへパッチを当てやすくするプラグインです。

github.com

このプラグインはHex-Raysが行っているPlug-In Contest 2016で3位になっています。

www.hex-rays.com

使い方

Keystoneをインストールし、 IDAのpluginsディレクトリ以下にkeypatch.pyを配置すると使えます。 macOS上のIDAPythonは/usr/bin/pythonを使っているため、普段macOSのデフォルトではないPython(pyenvでインストールしたPythonなど)を使っている場合は、 IDAPythonからpipでインストールしたライブラリを使えません。 その場合はpipでインストールしたライブラリをIDAのディレクトリの中にコピーする必要があります。 わたしはpyenvでインストールしたPythonを使っているので以下のようなコマンドになりました。パスは適宜変更してください。

$ sudo cp -r ~/.pyenv/versions/2.7.15/lib/python2.7/site-packages/keystone /Applications/IDA\ Pro\ 7.2/ida.app/Contents/MacOS/python/

インストールに成功していると、IDAの画面上で左クリックして出るメニューにKeypatchが追加されています。ここからPatcherを選択することでKeyPatchのWindowが出現します。

f:id:TAKEmaru:20181225143658p:plain
KeypatchのWindowを出す様子

ここではMOV R0, R3というARMのアセンブリMOV R0, 1に変更しています。

f:id:TAKEmaru:20181225022711p:plain
Keypatchでパッチを当てる様子

以下はパッチを当てたあとの様子です。コメントにパッチを当てる前のアセンブリが残されていて親切ですね。

f:id:TAKEmaru:20181225021610p:plain
パッチを当てたあと

このプラグインを使わずに、現状のIDAでx86/x64以外のバイナリに対しパッチを当てるには機械語のパッチを当てることになります。 このプラグインのおかげでARMなどのバイナリにパッチを当てる作業は楽になりました。