マルウエアの多くは、容易に検知や解析をされないようにするため、動作時に使用する文字列や自身のプログラムコードなどを「難読化」している。
そこで今回は、マルウエアによる難読化の仕組みと解読方法を、具体例を挙げて解説しよう。
解析や検知の回避を狙う
ここでの難読化とは、特定のルール(計算式)で文字を変換してデータを読みにくくすることである。一般的な暗号化とは異なり、変換には秘密情報(暗号鍵)を用いない。難読化を「暗号化」と呼ぶ場合もあるが、本記事では難読化とする。
マルウエアのプログラムコードが読めれば、その処理の流れや接続先のURLなどを比較的容易に把握できる。テキストエディターやバイナリエディターでマルウエアのEXEファイルを開いただけで、接続先であるC2サーバー▼のURLなどが文字列として発見できる場合もある。こうした特徴がすぐに分かれば、アンチウイルスソフトのベンダーはパターンファイルやシグネチャーを作りやすくなり検知が容易になる。
こうした事態を避けるため、マルウエアを開発する攻撃者はデータを平文で扱わず、あの手この手で難読化を施す。難読化されていると、マルウエアを含むプログラムやメモリーの内容をざっと見ただけではどのような処理をしているか解析しづらく、挙動をつかみにくい(図1)。また、パターンファイルやシグネチャーで検知することが難しくなる。そのため最近のマルウエア解析では、まずは難読化の解読から始めることが多い。
今回例として取り上げるのは、2020年の半ばころに出現したランサムウエア▼の「Conti」である。
Contiは、世界中で大きな被害をもたらしているランサムウエアの1つである。その作者は、様々な難読化を施して、解析や検知を妨害している。ここでは、そのうちの1つを取り上げて具体的に説明していく。
Contiは、すべての文字列をメモリー上で難読化しており、使用するタイミングで1文字ずつ復元する。図2は、メモリー上に難読化された状態で配置されている文字列をツールで読み出した例である。「lovjk□l□□lol」という文字列になっており、このままではどういう意味なのかが全く分からない。