サポート情報 | フォーカスシステムズ サイバーフォレンジックセンター

メールでのお問い合わせ
お問い合わせはこちら
東京証券取引所 プライバシーマーク ISMS JUSE

サポート情報

ホーム > サポート情報一覧 > マルウェアの内部を解析する

マルウェアの内部を解析する

目次へ

 ここまでの調査で分かったことを整理してみましょう。

 

 ● 抽出したランサムウェアは、単純な静的解析では大きな異常は見当たらない。 
 ●  実際に動作させてみると、ファイルの暗号化が行われ、これがランサムウェアであることは間違いない。
 ●  ランサムウェア実行時に外部サーバとネットワーク通信を行う。通信先候補は複数あり、判明している。
 ●  Explorerを経てsvchost.exeを起動して実行されている。
 ●  ランサムウェアの自動起動が設定される。暗号化が終了すると、削除される。

 

 大雑把に列挙すると以上の内容で、これだけでも十分かもしれません。しかし、「標的型攻撃」で使われるようなマルウェアは、色々な方法で検知を「すり抜けて」いるからこそ攻撃が成功しているのです。もちろん、ドロッパが巧妙なケースもありますが、サンドボックスやアンチウィルスのスキャンに引っかからないのは、内部の仕組みの細工によるものが考えられます。このような場合、「どのような挙動か」を把握しないと、対策の立てようがないと思います。序盤の「マルウェアの表層解析」でも、大きな不審点は見つかりませんでした。では、一見なんの変哲もないように見えるこのプログラムが、どのようにして「悪行」を行っているのでしょうか?その手口を追いかけてみたいと思います。

 先ほど、メモリを取得させるためにランサムウェアを実行させたPCを元に戻すため、再び「Shadow 3」で「Zero Shadow」を行い、元に戻します。そして、ランサムウェアの検体を再度配置し、IDA Proを起動して読み込みを実施します。

 ここから先は、かなり「泥臭い」作業が続くことになります。適所に「ブレークポイント」を設定し、実際に実行させるのですが、予想外のルートに入ってブレークできずに実行されてしまった、ということもよく発生します。そのため、「問題があったらすぐに戻せる環境」で検証できることが、作業を効率的に進めるために重要になってきます。また、『適所に「ブレークポイント」を設定し』とは言いますが、その「適所」を探るのも大変で、ここは慣れと経験が必要になってきます。序盤は、ステップ実行でレジスタやメモリの情報を把握しながら続け、分かった所は以後やりなおす時に飛ばす、といった進め方になると思います。今回の記事では、序盤のステップの詳細まで記述すると、あまりにも長くなるので、操作の説明部分以外の詳細は、ダイジェストで記述し、細かいステップの解説や調査の経緯は省略します。

 まず、プログラムの開始ポイント、つまり開始時に最初にeipが設定される個所を把握する必要があります。これは、厳密にはMZヘッダからPEヘッダの参照先を見つけ、PEヘッダ内の開始アドレス(AddressOfEntryPoint)を確認する必要があります。今回の検体では「0x0000A5F0」です。ただし、今回のようなexe形式のプログラムの場合、Exportテーブルからでもこのアドレスは分かります。exe形式の実行プログラムは、dllのような「他のプログラムに対し、機能を提供する。」ように作られていないため、Exportでパブリックになっているのが、プログラムの開始点だけだったりすることが多いためです(【図26】参照)。なお、PEヘッダの値と0x00400000値が違うのは、PEのエントリポイントの指定がRVA(Relative Virtual Address)のため、メモリロードの位置からのオフセット値であるためです。

CryptoWall_IDA_Export

【図26】CryptoWall亜種検体のエントリポイント

 

 では、手始めに開始点にブレークポイントを設定してみます。0x0040A5F0にカーソルを合わせて、「Debugger」→「Breakpoints」→「Add breakpoint」で設定します。解除する場合は、「Delete breakpoint」を使用します。しかし、いちいちメニューから選択するのは面倒です。ファンクションキーの「F2」キーで同様の操作ができますので、そちらを活用すると良いでしょう。ブレークポイントが設定されると、その行が赤く表示されます(【図27】参照)。

CryptoWall_IDA_SetBreakPoint

【図27】IDA Proでのブレークポイントの設定

 

 では、デバッグを開始して、このブレークポイントまで処理を進めてみましょう。デバッグの開始は、「Debugger」→「Start process」で開始できます。これも、ファンクションキーの「F9」キーのショートカットが便利です。なお、デバッグ開始後は、「Continue process」や「F9」キーは「次のブレークポイントまで処理を続行」という挙動になります。デバッグを開始すると、画面が切り替わり、0x0040A5F0で停止します(【図28】参照)。停止位置が紫色で表示されます。

CryptoWall_IDA_StopBreakPoint

【図28】IDA Proでデバッグを開始してブレークポイントで停止

 

 この先のプログラムの実行方法は大きく3種類を使い分けることになります(なお、この3種類は、一般的な開発用のデバッガの使用方法と同じなので、分かっている方はキーだけ確認して読み飛ばしていただいて問題ありません)。

 一つは前述したとおり、「次のブレークポイントまで実行」する方法です。この方法は、コードの解析である程度概要が分かっているか、調査が進んでいる状況で、予めブレークポイントを複数設定しておける場合に利用することになります。しかし、ブレークポイントの設定が漏れた状態で実行すると、マルウェアが完全に実行されてしまうことになるので、注意が必要です。

 残りの2つの方法は「Step into」(F7)と「Step over」(F8)です。この2つは、通常のコードを実行する場合は1ステップずつ実行し、動作に差がありません。差がでるのは、callを実行するとき、「Step into」ではその指定アドレス内の処理に飛ぶのに対し、「Step over」ではcall以降の処理を実施し、リターンするところまでを実行します。【図28】の例では、0x0040A61Dがcallです。「Step into」の場合、次は0x0040A634へカーソルが移動します。「Step over」の場合、callの中の処理を実行してリターンしてきた0x0040A623で停止します。

 この2種類の使い分けもケースバイケースで、中身を詳細に追う場合は「Step into」、callの内容が分かっているか、ブラックボックスで結果だけ把握できればいい場合、概要の流れをまず追いたい場合は「Step over」を使うことになります。この使い分けは重要で、ある程度経験と慣れが必要になってきます。なお、このランサムウェアの場合、0x0040A61Dを「Step over」すると、ランサムウェアの本体が実行されてしまいます。

 ここで「Step into」をすると、callの示す先へ遷移します。さらに解析を進めますが、もう少し解析をしやすくするため、表示方法を変更してみます。画面のコードの部分を右クリックしてポップアップメニューを表示し、「Graph view」を選択します。すると、フローチャートのような表示に切り替わります(【図29】参照)。このケースでは、画面に全ての処理が収まっていますが、長い処理だとはみ出てしまいます。そうすると、自分の位置が分かりにくくなります。そういう場合は、「View」の「Graph Overview」を利用すると、ツリーの全体を見渡せるようになります。

CryptoWall_IDA_GraphView1 CryptoWall_IDA_GraphView2

【図29】IDA ProのGraph viewでのコード表示

 

 【図29】の0x004026A1を見ると、jzによるゼロフラグ判定を行っており、その分岐が矢印で示されています。条件によりどのようなフローになるかが分かりやすいので、うまく利用するといいでしょう。この画面の状態でも、ステップ実行が可能となっています。試しに、0x004026A1まで処理を進めると、赤色の矢印が点滅します。これは、0x0040269Aの「test eax, ecx」の結果、ゼロフラグがoffだったため、赤色の矢印のほうに処理がいくことを示しています(【図30】参照)。

CryptoWall_IDA_GraphView4

【図30】IDA ProのGraph viewでの条件分岐

 

 さらに処理を進めていくと、0x004026BDでさらにcallが発生します。なお、callの処理の中身を見たい場合、「sub_xxxx」の部分をダブルクリックすることで、そのcallの先を参照することができます。

 

< マルウェア動作時のメモリ解析 目 次CryptoWallの「メモリの怪しい使い方」の発見 >