Advanced Software Armoring and Polymorphic Kung Fu

DEFCON 16の中でちょっと興味深かったものを紹介。Mandiantの Nick Harbourの発表から。


PE Scrambler というツールを紹介していた。通常、マルウェアはパッカー(UPXとか)でパッキングされていることが多い。これはバイナリを暗号化したり圧縮したりして静的解析を困難にするものだが、実行時にはメモリ内に元のバイナリがそのまま展開されるため、動的解析は比較的容易に行える。一方この PE Scramblerはパックするのではなくて、バイナリそのものを解析しにくくなるように変換するツールだ*1。Anti-Reversingのテクニックを多数盛り込んでいる。具体的な手法としては以下の4つが紹介されていた。

  • Function Call Dispatching
  • Code Chunking
  • Conflicting Disassembly
  • Polymorphic Replacement

"Function Call Dispatching"はディスパッチテーブルを作成することで、オリジナルの関数呼び出しの順序関係を解析しにくくする。
"Code Chunking"はコードを複数の小さなチャンクに分割して、ジャンプ命令を多用することで解析を困難にするもの。
"Conflicting Disassembly"は逆アセンブルする際に2通りに解釈できるようなバイトシーケンスをうまく使って、IDA Proなどのツールを出し抜こうとするもの。例としてあげられていたものに、"EB FF C0 48"というバイト列がある。"EB FF"が "JMP -1"なので自分自身にジャンプして、"FF"が 2つの命令に使われる("FF C0" => "INC eax")。これを複雑にすると IDA Proも罠にひっかかてしまい、うまく逆アセンブルできないらしい。
"Polymorphic Replacement"は同じ意味の別の命令に置き換えることで、わかりにくくする。簡単な例では PUSH命令を SUBと MOVに置き換えるとか。


このツールはこれら4つの手法を駆使してマルウェアを検知しにくく、またリバースエンジニアリングによる解析を困難にする。解析する側には頭の痛いものだ。

発表資料とツールはこちらから。


ちなみに Mandiantのチームは、DEFCONで開催された "Race to Zero"コンテストでも優勝したようだ。*2

*1:似たようなツールは、Themida、VMProtectなど他にもいくつかあるらしい

*2:与えられたマルウェアのサンプルから、AVソフトで検出されないように、いかに早くできるかを競うコンテスト。日本からの参加者もいたようだけど結果は??