IDAPythonを使って作業を楽に: パート6

By

Category: Malware, Unit 42

Tags: , ,

This post is also available in: English (英語)

概要

IDAPythonに関するブログ シリーズのパート5では、IDAPythonを使って悪意のあるサンプルから中に埋め込まれている実行形式ファイルを抽出しました。この第6回ではIDAを高度に自動化した利用法を話題にしたいと思います。具体的には、GUIを起動せずにIDAにファイルをロードし、IDAPythonスクリプトを自動的に実行して結果を抽出する方法について見ていきます。このテクニックを使うときわめて迅速にたくさんのサンプルを処理することができ、IDAの新しいインスタンスにおいて各ファイルを手動で開いてからIDAPythonスクリプトを実行することは必要ではなくなります。

GUIを起動せずにIDAをコマンドラインだけで実行できると聞いて驚かれる読者も多いことでしょう。そうするにはIDAの実行形式ファイルを「-A」スイッチ付きで起動しなければなりません。この特別なスイッチはIDAに対して自律モードで動作するよう伝えるもので、これによりウィンドウもダイアログ ボックスも一切ユーザーの前に現れなくなります。

以下のコマンドラインの例はこのテクニックがOS XとMicrosoft Windowsのどちらにおいても利用されることを示しています。これらのサンプルにおいて、「-c」スイッチにより、すでにIDBファイルが存在している場合であってもIDBファイルが新たに生成されます。さらに、実行時に起動されるIDAPythonスクリプトが「-S」スイッチによって指定されます。この記事の後半でこれらのスイッチを使います。

シナリオ

この例ではCmstarマルウェア ファミリを使います。これはUnit 42が以前考察したマルウェア ファミリです。Cmstarマルウェア ファミリをご存じない読者のために付け加えますと、これは特定のURLにて提供されているファイルをHTTPで転送して被害者のシステム上でこのファイルを実行するダウンローダーです。問題のURLは次のルーチンを使って難読化を解除することができます。

このことを知ったうえで私たちが次に行う仕事は、このデータがCmstarサンプル内のどこに存在しているか突き止めることです。いくつかのサンプルの関連付けをした結果、memcpyの呼び出しの使用により2つの暗号化された文字列が1個の変数に格納されていると私たちは分析しました。一方の文字列にはマルウェアの接続先となるドメインまたはIPアドレスが含まれており、他方の文字列にはURIが含まれています。

memcpy命令が発生する場合に下記と同じ一連の命令が実行されることも分かっています。

mov esi, [オフセット]
pop ecx
lea edi, [変数]
rep movsd

図1 Cmstar内のエンコードされた文字列を含む関数
図1 Cmstar内のエンコードされた文字列を含む関数

この情報があれば、IDAPythonを使用してこの一連の命令の特定を試みることができます。それを行うために、関数IDAが特定するたび順次処理し、ジャンプ関数としてマークされている関数または既知のライブラリに属する関数を無視して進みます。その後、一度に4つの命令を調べるためスライディング ウィンドウを使用して残りの関数を順次処理し、以前に特定されたマーカーを探し、一致するものがあるかどうか判別します。

上記の例では、一致が見つかった場合、単に、デバッグ文字列を出力しているだけです。このコードをIDA内でMD5ハッシュ「4BEFA0F5B3F981E498ACD676EB352D45」を使用してサンプルに対して実行し、次の出力を得ました。次でお分かりのとおり、私たちは両方の難読化された文字列のアドレスを特定することに成功しました。

図2 Cmstarサンプルに対するスクリプトの実行
図2 Cmstarサンプルに対するスクリプトの実行
この時点で、特定済みのオフセットを使用して、ポイント先の文字列を抽出できます。その後、これらの文字列は、以前に定義したdecode()関数を使用してデコードできます。

これをすべてまとめると、次のスクリプトが考えられます。

この段階で、非GUIモードでIDAを実行する自動化手法を使用できます。上記のスクリプトを使用します。これによって、ユーザーが介在する必要なく、このスクリプトを多数のサンプルに対して実行できます。私たちは、次のようにOSXマシンでスクリプトを実行します。

for x in ls; do /Applications/IDA\ Pro\ 6.9/idaq.app/Contents/MacOS/idaq -c -A -S/tmp/script.py $x; done

私たちは結果を保存するようにスクリプトに命令したため、数分後、/tmp/output.txt内に次のように出力されます。

図3 /tmp/output.txtの出力
図3 /tmp/output.txtの出力

結論

IDAPythonのパワーとIDAのコマンドライン スイッチの両方を活用することで、多数のCmstarサンプルのダウンロード場所の抽出を自動化することに成功しました。この手法は、より多くのサンプルに簡単に適用できるため、IDA内で各ファイルを手動で開く必要なく、IDAPythonアクションを実行できます。今までこのIDA機能に気付いていなかった読者の方々は、ぜひ、それを試してください。大量のファイルで作業する際に、時間を節約できるだけでなく、ものごとが遥かに容易になります。