この文書は、Choronzon の背後にある理論を簡潔に説明することを目的としています。さらに、内部の詳細と、Choronzon を拡張して新しい要件に対応する方法について説明します。Choronzon のアーキテクチャの概要は、当初 ZeroNights 2015 カンファレンス で発表されました。発表の録画とスライドデッキも入手可能です。
Choronzon は進化的ファザーです。より良い結果を生み出し続けるために、進化プロセスを模倣しようとします。これを実現するために、ファジングされたファイルのうちどれが興味深いか、どれを破棄すべきかを分類する評価システムを備えています。
さらに、Choronzon は知識ベースのファザーです。ユーザー定義の情報を使用して、対象のファイル形式のファイルを読み書きします。Choronzon の用語に慣れるためには、各ファイルが 染色体 で表現されることを理解してください。ユーザーは検討中のファイル形式の基本構造を記述する必要があります。すべての詳細や側面を記述するのではなく、ファイル形式の高レベルな概要が推奨されます。これらのユーザー定義の基本構造のそれぞれが 遺伝子 と見なされます。各染色体は遺伝子のツリーを含み、そこから対応するファイルを構築できます。
Choronzon は3つのサブシステム、Tracer モジュール、Chromosome モジュール、およびファザーに分割されています。
簡単に説明すると、Chromosome コンポーネントは対象のファイル形式を記述するために使用されます。ユーザーは独自のモジュールを作成して、新しい形式やカスタム形式をサポートできます。テストケースとして、PNG モジュールが Choronzon に付属しています。
一方、Tracer コンポーネントは対象アプリケーションを監視し、その実行に関するさまざまな情報を収集する責任があります。このバージョンの Choronzon は、Intel's Pin バイナリ計装ツールを使用して、実行中に訪問された基本ブロックを記録します。ただし、Choronzon は他のトレーシングバックエンドもサポート可能です。また、Choronzon の次期バージョンでは、パフォーマンスへの大きな影響のため Pin は置き換えられる予定であることに注意してください。
最後に、ファザーコンポーネントはテスト対象のファイルの内容を変更するために使用されます。このモジュールには、Mutators と Recombinators のコーパスが含まれています。Mutators は、単純に、一般的なファザーが行うようにファイルを変更します。例えば、バイト反転、バイトスワップ、ランダムバイト変異などを行います。しかし Choronzon には、ファザーではあまり一般的ではない別の機能があります。 は、 モジュールによって提供されるファイル形式の構造に関する情報を使用して、インテリジェントなファジングを実行します。
ディレクトリ chromosome/parsers には、ファイル PNG.py があります。この Python モジュールは、ファザーに PNG ファイル形式を記述します。他のファイル形式用のカスタムモジュールをこのディレクトリに追加できます。
Chromosome サブシステムの基本アイデアは、Deserializer を使用して初期シードファイルを Genes のツリーに変換することです。その後、Serializer を使用して(ファジングされた)Genes がファイルに書き込まれます。
Choronzon では、パーサーモジュールの目的は、すべての細かい詳細ではなく、ファイル形式の基本構造を提供することであると考えてください。これにより、ファザーはほとんど正常なファイルを構築でき、対象アプリケーションからの早期終了を回避できます。さらに、このアプローチは時間を節約します。なぜなら、ファイル形式のすべての側面を記述することは時間がかかり、開発のオーバーヘッドが大きくなるからです。
新しいパーサーモジュールは以下をインポートする必要があります:
また、以下を実装する必要があります:
Choronzon に付属の例では、各 PNGGene は PNG チャンクに対応します。一般に、Gene は対象形式の基本データ構造と考えることができます。各 Chromosome は Genes のツリーで構成され、一意のファイルを表します。各 Gene は、自身のデータとツリー内の下位の Genes のデータを結合したバイト列を生成できなければなりません。
PNGSerializer は、Genes のリストが与えられたときに(ほぼ正常な)ファイルを生成できなければなりません。一方、PNGDeserializer は、対象形式の有効なファイルを解析し、それを Genes のツリーに逆シリアル化できなければなりません。
PNG 形式のコメント付きの例については、chromosome/parsers/PNG.py を確認してください。
Tracer モジュールは、対象アプリケーション(および/またはその1つ以上のライブラリ)を逆アセンブルするために使用されます。このバージョンの Choronzon では、これは IDA で実現されています。このアプローチを使用した理由は、ファジングキャンペーンからの任意の興味深い情報を IDB と関連付けることができるからです。ただし、Choronzon をよりポータブルでアクセスしやすくするために、近い将来 IDA への依存をなくす可能性があります。
ファイルは、Pin ユーティリティを使用してアプリケーションに対してテストされます。analyzer/coverage ディレクトリには、この Pin ツールのソースコードがあり、対象アプリケーションの各基本ブロックの先頭にフックを注入します。実行が完了すると、ヒットした基本ブロックをバイナリの基本ブロックと関連付けます。これにより、私たちにとって価値のあるメトリクス(カバレッジなど)を計算できます。
Fuzzer コンポーネントは、Chromosome 表現を使用してファイルをファジングします。先に述べたように、Choronzon には2つのファジング方法があります。
最初の方法では、Choronzon は1つ以上の遺伝子からコンテンツを取得し、Mutators のいずれかを適用します。Mutators は、ランダムバイト変異、高位ビットセット、バイトスワップなど、一般的だが効果的なファジング方法を実装しています。独自のカスタムミューテーターを作成して、fuzzers/mutators.py に追加することもできます。
2番目のファジング方法は、組み換えと呼ばれます。Recombinators は、ファイルの構造を変更するために使用されます。以下に PNG 形式の例を示します。
PNG ファイルは、4つのフィールドを含む連続したチャンクで構成されます。
IHDR、IDAT、IEND チャンクのみを持つ PNG ファイルがあると仮定します。その構造は次のようになります。
[ PNG signature ] [ IHDR ] [ IDAT ] [ IEND ]
Choronzon は基本構造(つまり PNG チャンク)を認識しているため、そのシーケンスを変更できます。組み換えが成功すると、ファジングされた PNG 出力ファイルは次のようになります。
[ PNG signature ] [ IDAT ] [ IHDR ] [ IEND ]
Choronzon には、複雑なファイル形式にも対応できるようにする、さらに多くの組み換え戦略が含まれています。
Choronzon は、Ubuntu 16.04 LTS(Linux カーネル 4.4)および Windows 10 上で、Python 2.7、Pin 3、IDA Pro 6.6~6.9 を使用してテストされています。
実行するには、sortedcontainers Python パッケージをインストールする必要があります。こちら から入手するか、pip 経由でインストールできます。
さらに、Choronzon は IDA Pro(実際にはそのターミナルバージョン)を必要とします。IDA Pro のパスは、設定ファイルに次のように指定する必要があります:
DisassemblerPath = 'C:\\Program Files (x86)\\IDA 6.6'
IDA Pro 6.6、6.7、6.8、6.9 で正常にテストされています。
Choronzon のカバレッジ Pin ツールは analyzer/coverage にあり、コンパイルする必要があります。詳細については Pin のドキュメントを確認するか、次の手順を実行できます:
coverage.cpp と makefile.rules ファイルを /path/to/pin/source/tools/MyPinTool にコピーしますmake を実行します。Windows の場合は、Visual Studio コマンドラインを実行し、Cygwin から make ユーティリティとその依存関係を使用します。obj-intel64 ディレクトリ(32ビットシステムの場合は obj-ia32)を /path/to/choronzon/analysis/coverage にコピーして戻しますChoronzon でファジングするには、設定ファイルを提供する必要があります。settings ディレクトリに Choronzon の設定例があります。