脅威の研究

アバストが自社のマシンコード逆コンパイラをオープンソース化

Threat Intelligence Team, 2018年1月25日

アバストは、7年にわたり開発を続けてきた自社のマシンコード逆コンパイラを、プラットフォームに依存しない実行可能ファイル解析のためにオープンソース化します。

アバストは、悪意を持ったソフトウェアと闘うサイバーセキュリティコミュニティを支援するために、自社の解析ツール、RetDec をリリースしました。このツールを利用すると、アプリケーションのコードを調べ、アプリケーションを実行せずに、その動作を確認することができます。すべては、皆で力を合わせてオンラインの「悪い奴ら」と闘うために!

昨年12月の初めに Botconf 2017 のプレゼンテーション (スライド) で発表したとおり、アバストのマシンコード逆コンパイラ、RetDec がオープンソース化されました。これにより、誰でも自由に RetDec を使用し、そのソース コードを研究、改変して、再配布できるようになりました。

RetDec をオープンソース化した目的は、x86/PE 実行可能ファイルなどのプラットフォーム固有のコードを C ソース コードなどの高度な表現形態に変換するための汎用ツールを提供することです。ここで言う「汎用」という言葉の意味は、ツールが 1 つのプラットフォームに限定されず、異なるアーキテクチャ、ファイル形式やコンパイラなど、様々なプラットフォームをサポートするということです。アバストでは、x86/PE や ARM/ELF などの様々なプラットフォームにおける悪意のあるサンプルの解析に RetDec を頻繁に使用しています。

逆コンパイラとその他の関連ツールのソースコードは現在 MIT ライセンス供与により GitHub にて入手可能です。逆コンパイラのオープンソース化により、弊社ではこの逆コンパイラの広範囲にわたる使用を図るとともに、その継続的な開発に幅広い協力を得たいと考えています。

逆コンパイラとは?

RetDec の仕組みについて掘り下げる前に、逆コンパイラが一般的にどのように機能するかについて簡単にご説明しましょう。

逆コンパイラとは、実行可能ファイルを入力とし、その機能を元のままに保ちながら、より高レベルの表現への変換を試みるプログラムです。例えば、入力ファイルは application.exe で、出力は C などの高レベルのプログラミング言語になります。従って、逆コンパイラはソース ファイルを実行可能ファイルにコンパイルするコンパイラとは正反対の働きをします。逆コンパイラが時として「逆方向コンパイラ」と呼ばれるのは、このためです。

プログラムの機能を保持することにより、入力されたプログラムが行う動作をソースコードにできる限り正確に反映させたいのです。そうしなければ、プログラムが実際には行わない動作を、行うものと推測するリスクを冒すことになります。

一般に、コンパイル処理中に多くの情報が失われるため、逆コンパイラが元のソースコードを完全に再構成することはできません。さらに、マルウェア作成者はソフトウェアの逆コンパイルをできる限り困難にするために、難読化と 逆コンパイル対策の様々な工夫を凝らします。

RetDec は、非常に多岐にわたる、サポートされているアーキテクチャとファイル形式のほか、独自のヒューリスティクスとアルゴリズムを用いてアプリケーションの解読と再構成を行うことにより、上述の問題に対処します。また、RetDec は実績ある LLVM インフラストラクチャを使用し、MIT のライセンス供与により無料で提供される、この規模の逆コンパイラとしては唯一のものです。

逆コンパイラは様々な目的で使用できます。最も一般的なのはバグや脆弱性を探したり、悪意のあるソフトウェアを解析したりする場合の逆エンジニアリングです。逆コンパイルは 2 つの実行可能ファイルを比較する場合に失われたソース コードを回復するため、あるいはコンパイルされたプログラムがソース コードに書かれている動作を正確に実行するか否か検証するためにも使用されます。

逆アセンブラについてすでにご存じの方は、逆コンパイラも基本的に同じものだとお考えかもしれません。残念ながら、そうではありません。逆コンパイラと逆アセンブラには、いくつかの重要な相違点があります。逆コンパイラは実行可能ファイルをプラットフォームにとらわれない高レベルのソースコードに再構成しようと試みますが、逆アセンブラは低レベルでプラットフォーム固有のアセンブリ命令をユーザーに提供します。アセンブリの出力はプラットフォーム間での互換性がなく、改変されるとエラーが発生しやすくなり、ターゲット プロセッサの一連の命令に関する特定の知識を必要とします。逆コンパイラのもう一つのプラス面は、C ソース コードなどの高レベルのソースコードを生み出すことです。このコードは解析される特定のプロセッサのアセンブリ言語をまったく知らない人でも読むことができます。

逆コンパイラには多数の様々な種類があることにご留意ください。RetDec はマシン コード逆コンパイラで、ネイティブのプロセッサ コード (Intel x86 用など) を実行するプログラムの逆コンパイルのみをサポートすることを意味します。従って、マシン コード逆コンパイラではバイトコード (.NET、Python、Java など) の逆コンパイルは不可能です。

RetDec のご紹介:  アバストのマシンコード逆コンパイラ

RetDec は 2011 年から開発が行われてきたマシン コード逆コンパイラです。元々はチェコ共和国のブルノ工業大学情報技術学部と AVG Technologies の共同プロジェクトとして開発されました。2016 年に AVG Technologies がアバストによって買収されて以来、アバストがこの逆コンパイラの開発を続けてきました。

Avast_blog_retargetable_decompiler-1.jpg

RetDec という名称は「Retargetable Decompiler」 (再ターゲット可能な逆コンパイラ) の略です。逆コンパイラが何であるかについてはすでにご説明しましたが、再ターゲット可能な逆コンパイラとは何でしょうか? 弊社の逆コンパイラにこの名前を付けたのは、ターゲット アーキテクチャ、オペレーティング システム、または実行可能ファイルの形式が 1 つに限定されないからです。

この逆コンパイラで何を行うことができるかをご理解いただくために、その機能の概要を見てみましょう。

  • サポートされるファイル形式: ELF、PE、Mach-O、COFF、AR (アーカイブ)、Intel HEX、および未加工のマシン コード
  • サポートされるアーキテクチャ (32b のみ): Intel x86、ARM、MIPS、PIC32、および PowerPC
  • 詳細情報による実行可能ファイルの静的解析
  • コンパイラとパッカーの検出
  • ロードと命令の解読
  • 静的にリンクされたライブラリコードの署名ベースの削除
  • デバッグ情報の抽出と利用 (DWARF、PDB)
  • 命令慣用句の再構成
  • C++ クラス階層の検出と再構成 (RTTI、vtable)
  • C++ バイナリからのシンボルのデマングル (GCC、MSVC、Borland)
  • 関数、タイプ、および高レベルの構成体の再構成
  • 組み込みの逆アセンブラ
  • 2つの高レベル言語での出力: C および Python 類似言語
  • コール グラフ、制御フロー グラフおよび様々な統計の生成
  • IDA 逆アセンブラからのファイルの直接的な逆コンパイルを可能にする IDA プラグイン

RetDec を試してみたい方に

この逆コンパイラを試す最も簡単な方法は、弊社のウェブ サービスを利用することです。お気に入りのウェブブラウザから逆コンパイルする実行可能ファイルをアップロードし、逆コンパイル ボタンを押すだけです。逆コンパイルが終了すると、結果が表示されます:

retargeting_decompiler_1.png

DA 逆アセンブラをインストールしている場合は、弊社の IDA プラグインを使用して IDA 内で逆コンパイルを直接実行できます:

retargeting_decompiler_2.png

さらにプログラミング的なアクセスをご希望の場合は、弊社の REST API を使用できます。これにより、HTTP リクエストを送信して RetDec と相互に作用するアプリケーションの作成が可能です。API 経由でこの逆コンパイラを使用する最も簡単な (お勧めの) 方法は retdec-python を使用することです:

retargeting_decompiler_3.png

最後に、この逆コンパイラのソース コードは GitHub で入手可能なため、お使いの PC で弊社の逆コンパイラを直接構築し、インストールして使用できます。現在のところ、RetDec は Linux および Microsoft Windows オペレーティング システムをサポートしています。

多くの方に弊社の逆コンパイラを活用していただければ幸いです。ご質問やご意見、ご感想などはご遠慮なく弊社までお寄せください

詳細については、RetDec のホーム ページにアクセスしてください。これ以外のアバストのオープンソース プロジェクトについては Github ページをご覧ください