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

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

サポート情報

ホーム > サポート情報一覧 > CryptoWallの「メモリの怪しい使い方」の発見

CryptoWallの「メモリの怪しい使い方」の発見

目次へ

 IDA Proの簡単な操作方法が一通り分かったところで、解析を進めていきます。先ほど述べたように、プログラムを進めていくと、あるcallで一気にランサムウェアの暗号化の処理まで進んでしまうこともあります。そのため、それぞれの処理を一つずつ紐解いていき、その意味を理解した上で進めるのが理想です。

 しかし、実際の解析では、時間も人員も限られることが大半です。さらに、プログラムの処理も、せっかく解析したのに、後でその結果が使われていなかった、ということもしばしば見受けられます。これは、機械的に生成するロジックに不要な部分が含まれてしまうケースのほか、プログラムの製作者が色々なところからテンプレ化されたコードを流用した結果、実行されても利用しない「無駄処理」になっていることもあるからです。

 そのようなところに時間を割くのは不毛でしかありません。そのため、実際の解析では、今回のように「マルウェアが実行されてもいい」環境で、挙動を監視しつつある程度飛ばしながら特異点を探す、という方法のほうが現実的だと思われます。

 今回のケースでは、表層解析では特異な点が見当たらないが、実際にはランサムウェアが実行されるため、そのための「カラクリ」を見切る必要があります。今回は、メモを取りつつ何度も繰り返し実行し、「ランサムウェアの挙動が起こる直前」を探っていました。すると、妙なことに気づきました。通常、メモリにロードされたプログラムは、.textセグメント上の実行可能領域(コードセグメント)のコードを実行していきます。しかし、このプログラムは、ある時点で動的に確保されたメモリ上で動作するようになっていたのです。つまり、「どこかで実行可能なメモリ領域を取得し、そこにプログラムを展開する処理がある」ということになります。では、どのようにしてメモリを取得して、メモリ上のプログラムに遷移したのでしょうか?試行錯誤して処理を絞り込んでいき、そのポイントを発見することができました(【図31】参照)。

CryptoWall_IDA_Step001

【図31】メモリ内のプログラムへ制御を移す個所

 

 【図31】の0x00406ED5で、動的に確保したメモリのアドレスに飛んでいたのです。これを、この1行のコードを見ただけでは「retnだから、callの呼び出し元に戻る処理ではないか?」と思うでしょう。しかし、直前の行が問題です。通常、リターンする前には、スタックフレームを元に戻し、callされる前の状態に戻す処理が入るはずです。そして、retnは、実のところ、espが指す4バイトのデータをpopし、その4バイトデータをアドレスとしてeipの参照先を変えるだけです。しかし、retnの直前では、push eaxを行っており、espが指す4バイトの値は、このpushされたeaxの値になってしまっています。eaxの値は0x001D0000で、確保されたヒープ領域であることが分かります。retn実行時のespの指す4バイトのデータも、「00 00 1D 00」となっており、これがリトルエンディアンであることから、「retnは0x001D0000へジャンプしてしまう」ことが分かります。これは、バッファオーバランによるスタックのリターンアドレスの書き換えの技法と考え方は同じですね。

 では、このアドレスのメモリ上には今、どのような値が入っているのでしょうか?確認してみましょう。

 まず、バイナリで値を参照してみます。「View」→「Open subview」→「Hex dump」をクリックすると、Hex Viewのタブが追加されます(環境により、追加される場所が変わります)。Hex Viewにカーソルを合わせ、さらにメニューの「Jump」→「Jump to address …」でダイアログを表示し、0x001D0000を入力してその部分を表示させます(【図32】参照)。

CryptoWall_IDA_Step002

【図32】プログラムのジャンプ先に指定されたメモリの内容

 

 予想通り、なにやらデータが設定されています。そして、これはこれから実行されるコードであるはずです。この部分をコードとして解析してみましょう。「View」→「Open subview」→「Disassembly」からIDA Viewを表示し、次に「Jump」→「Jump to address …」でダイアログを表示し、0x001D0000を入力してその部分を表示させます。そして、0x001D0000からの部分を選択し、右クリックのポップアップメニューから「Analyze selected area」を選択します。注意喚起のダイアログがでたら、「Force」で強制的に解析してみましょう。すると、実行コードが表示されました(【図33】参照)。

CryptoWall_IDA_Step003 CryptoWall_IDA_Step004

【図33】プログラムのジャンプ先に指定されたメモリのコード内容

 

 メモリ上に展開されているプログラムの開始部分を解析することができました。当然、「Step into」または「Step over」で処理を進めると、0x001D0000から実行されるプログラムを解析することができます。わざわざメモリの上に実行プログラムを展開し、その上で実行させる方法も特殊であることから、この中のプログラムは大分「怪しい」と思われます。

 

< マルウェアの内部を解析する 目 次メモリに展開されたプログラムはどこから来たのか? >