
Manulは、Windows、Linux、MacOS上のオープンソースおよびブラックボックスバイナリ向けのカバレッジガイド並列ファザーです。

Manulは、Windows、Linux、macOS(ベータ版)上でオープンソースおよびブラックボックスバイナリ向けの、カバレッジガイド付き並列ファザーです。純粋なPythonで書かれています。
pip3 install psutil
git clone https://github.com/mxmssh/manul
cd manul
mkdir in
mkdir out
echo "AAAAAA" > in/test
python3 manul.py -i in -o out -n 4 "linux/test/test_afl @@"
sudo apt-get install gcc make git wget
git clone https://gitlab.com/akihe/radamsa.git && cd radamsa && make && sudo make install
Windowsにradamsaをインストールする必要はありません。Manulは、このプラットフォームではradamsaネイティブライブラリと共に配布されています。
| CVE IDs | Product | Finder |
|---|---|---|
| CVE-2019-9631 CVE-2019-7310 CVE-2019-9959 | Poppler | Maksim Shudrak |
| CVE-2018-17019 CVE-2018-16807 CVE-2019-12175 | Bro/Zeek | Maksim Shudrak |
Manulを使用して新しいバグを見つけた場合は、私に連絡してください。リストに追加します。

pip install pywin32)Windowsプラットフォーム(DBI永続モードのみ必要)。現在、Manulは2種類のインストルメンテーションをサポートしています:AFLベース(afl-gcc、afl-clang、afl-clang-fast)とDBIです。
CC=afl-gcc CXX=afl-g++ CFLAGS=-fsanitize=address CXXFLAGS=-fsanitize=address cmake <path_to_your_target>
make -j 8
USE_ASAN=1 CC=afl-clang-fast CXX=afl-clang-fast++ cmake <path_to_your_target>
make -j 8
詳細はこちらの手順を参照してください。
このモードではターゲットをインストルメントする必要はありませんが、WindowsまたはLinux向けの最新バージョンのDynamoRIOフレームワークをダウンロードする必要があります。
Manulは、LinuxおよびWindows向けにx86/x64プリコンパイル済みクライアントと共に配布されています。以下のフォルダにあります:
linux/dbi_32|dbi_64/libbinafl.so (DynamoRIO client)
win/dbi_32|dbi_64/binafl.dll
残念ながら、DynamoRIOはMacOSでは公式にサポートされていません。
最新のDynamoRIOリリースパッケージはDynamoRIOダウンロードページにあります。
manul.configファイル内の以下の行をコメント解除し、DynamoRIOランチャーとクライアントへの正しいパスを指定する必要があります。
# Choose DBI framework to provide coverage back to Manul ("dynamorio" or "pin"). Example dbi = dynamorio
dbi = dynamorio
# If dbi parameter is not None the path to dbi engine launcher and dbi client should be specified.
dbi_root = /home/max/DynamoRIO/bin64/drrun
dbi_client_root = /home/max/manul/linux/dbi_64/libbinafl.so
dbi_client_libs = None
さらに、永続的なインメモリファジングを使用することで、ブラックボックスファジングキャンペーンのパフォーマンスを向上させることができます。このモードでは、特定の関数をインストルメントするようにManulに指示し(はい、バイナリを逆アセンブルしてそれを見つける必要があります)、以下の行をコメント解除することでループで実行します:
dbi_persistence_mode = 1
dbi_target_module = afl_test
dbi_target_method = open_file
#dbi_target_offset = 0x3198 # optionally you can provide offset of this function instead of name
dbi_fuzz_iterations = 1000
winAFLの作者は、実際の仕組みについてこちらで非常に良い説明を提供しています。Manulは、winAFLインストルメンテーションライブラリのコードの大部分を使用して、ターゲットと通信し、インストルメントします。
重要なお知らせ:32ビットバイナリをファズするには32ビットランチャーと32ビットクライアントを使用し、64ビットバイナリには64ビットランチャーと64ビットクライアントを使用してください!
インストルメンテーションライブラリをコンパイルするには、DynamoRIOの最新バージョンを使用する必要があります。インストルメンテーションライブラリのソースコードは、Manulメインフォルダにあるdbi_clients_srcにあります。
64-bit Linux
cd dbi_clients_src
wget <DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz> - download the latest DynamoRIO
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz/cmake
make
32-bit Linux
cd dbi_clients_src
wget <DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz> - download the latest DynamoRIO
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
CFLAGS=-m32 CXXFLAGS=-m32 cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz/cmake
make
On Windows, the easiest way to compile the library would be to install Visual Studio (tested on 2017 & 2013 versions), launch VS20XX Cross Tools Command Prompt and run the following commands:
64-bit Windows
cd dbi_clients_src
<Download and extract the latest version of DynamoRIO>
mkdir client_64
cd client_64
cmake -G"Visual Studio 15 Win64" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (or just Debug if needed)
32-bit Windows
cd dbi_clients_src
<Download and extract the latest version of DynamoRIO>
mkdir client_32
cd client_32
cmake -G"Visual Studio 15" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (or just Debug if needed)
Manulは当初Intel PINカバレッジガイド付きファジングをサポートしていましたが、パフォーマンスが低く、メンテナンスのオーバーヘッドが高いため、現在はサポートされていません。
最も頻繁に使用されるオプションはコマンドラインで指定できます。より多くのオプションは設定ファイル(manul.config)を使用してサポートされています。
Example: python3 manul.py -i corpus -o out_dir -n 40 "target @@"
positional arguments:
target_binary The target binary and options to be executed (don't forget to include quotes e.g. "target e @@").
optional arguments:
-h, --help show this help message and exit
-n NFUZZERS Number of parallel fuzzers
-s Run dumb fuzzing (no code instrumentation)
-c CONFIG Path to config file with additional options (see Configuration File Options section below)
-r Restore previous session
Required parameters:
-i INPUT Path to directory with initial corpus
-o OUTPUT Path to output directory
Manulはデフォルトのmanul.configファイルと共に配布されており、ユーザーはサポートされているすべてのオプションと使用例を見つけることができます。オプションは次の形式で指定する必要があります:Format: <option_name> = <value>。記号#を使用して行を無視できます。
dict = /home/max/dictionaries/test.dict。AFL変異戦略では、ユーザーがファズファイル内のランダムな場所に挿入できるカスタムトークンのリストを指定できます。Manulはこのオプションを介してこの機能をサポートしています(絶対パスが推奨されます)。
mutator_weights=afl:7,radamsa:2,my_mutator:1。変異子の重みにより、ユーザーはManulに対して、特定のファザーが10回の実行あたり何回の変異を実行するかを指示できます。この例では、AFL変異子が7/10の変異で実行され、Radamsaが2/10、カスタムmy_mutatorが1/10の割合になります。特定の変異子を無効にする場合は、重みを0に設定します(例:mutator_weights=afl:0,radamsa:1,my_mutator:9)。
deterministic_seed = False|True。Trueを指定すると、Radamsaの変異が決定論的になり、Manulの実行ごとに同じ出力が生成されます。
print_per_thread = False|True。このオプションを有効にすると、Manulは全体のサマリーの代わりに、実行中の各スレッドのサマリーを表示します。
disable_volatile_bytes = False|True このオプションを有効にすると、Manulは揮発性パスをブラックリストに登録しません。
forkserver_on = False|True AFLのフォークサーバーを有効または無効にします。
dbi = dynamorio|pin。このオプションは、Manulがターゲットをインストルメントするために使用するDBIフレームワークを指定します。
dbi_root = <path>。このオプションは、ManulにDBIフレームワークのメインランチャーを見つける場所を指示します。
dbi_client_root = <path>。このオプションは、Manulにインストルメンテーションを実行するDBIクライアントを見つける場所を指示します。
dbi_client_libs = name_#1,name_#2|None。このオプションは、メインターゲットと一緒にインストルメントする必要があるライブラリのリストを指定するために使用できます(例:ターゲットライブラリをロードする実行可能ファイルと、バグを探したい他のいくつかのライブラリがある場合)。
dbi_persistence_mode = 0|1|2。このオプションは、DBI永続モードを選択するために使用されます。0 - 永続化なし、1 - 標準永続化(関数ラッピング)、2 - まだサポートされていません。
dbi-persistence_mode = 1|2の場合、以下のオプションを指定する必要があります:
dbi_target_module = <module name>。Manulはここで指定されたモジュール内でターゲット関数を検索しようとします。
dbi_target_method = <function name>。永続化のためにラップする関数名。
dbi_target_offset = <offset of function e.g. 0x3198>。永続化のためにラップする関数のオフセット。デバッグシンボルが利用できない場合、このオプションをdbi_target_methodの代わりに使用できます。
dbi_fuzz_iterations = 500。プログラム全体が再起動する前にメモリ内で実行するファズイテレーションの数。この引数を調整して、ターゲットに最適な値を見つけてください。
dbi_thread_coverage = False。ターゲット関数を実行したスレッドからのみカバレッジをインストルメントします(まだサポートされていません)。
timeout = 10。ターゲットを強制終了して次のテストケースを送信するまでの待機時間。
init_wait = 1。このオプションは、ターゲットの初期化に必要なタイムアウトを設定するために使用できます。
オプションnet_config_masterとnet_config_slaveは、Manulインスタンスをネットワーク経由で分散するために使用されます。分散ファジングを実行するには、次の3つの手順を実行する必要があります。
IP:port形式のホストリストを含むファイルを作成します。ここでスレーブが実行されます。net_config_slave = 0.0.0.0:1337。Manulはインスタンスを起動し、ポート1337でマスターインスタンスからの着信接続を待機します。net_config_master = file_nameを使用して指定します。debug = False|True - デバッグ情報を表示します。
logging_enable = False|True - デバッグ情報をログに保存します。
manul_logo = False|True - 最初にManulロゴを表示します。
no_stats = False|True - 統計情報を保存します。
sync_freq = 10000。カバレッジビットマップの同期頻度を変更できます。このオプションは、Manulが並列ファジングインスタンス間でカバレッジを同期する頻度を指定します。値を小さくするとパフォーマンスは低下しますが、インスタンス間の調整が向上します。
#custom_path = test_path - このオプションを使用すると、テストケースをカスタムフォルダに保存できます(ターゲットが事前定義された場所からロードしたい場合)。
cmd_fuzzing = True|False。このオプションを有効にすると、Manulはファイルに保存する代わりに、コマンドラインを介してターゲットに入力を提供します。
user_signals = 6,2,1|None。ユーザーは、ターゲットからのどのシグナルを無視するか(クラッシュと見なさない)をManulに指示できます。
target_ip_port = 127.0.0.1:7715|None - ターゲットのIPとポートを指定するために使用します。
target_protocol = tcp|tcp - ネットワーク経由でターゲットに入力を送信するプロトコルを指定するために使用します。
net_sleep_between_cases = 0.0。このオプションは、ターゲットに送信されるテストケース間の遅延を定義するために使用できます。
現在、ネットワークファジングは実験的な機能です(詳細はissuesを参照してください)。
カスタム変異子は以下の3つの手順で追加できます: 手順1. Python (.py) ファイルを作成し、適当な名前を付けます(例:example_mutator.py)。
手順2. 2つの関数def init(fuzzer_id)とdef mutate(data)を作成します。詳細はexample_mutatorを参照してください。Manulはファジング初期化時にinit関数を呼び出し、ターゲットに提供される各ファイルに対してmutateを呼び出します。
手順3. manul.configのmutator_weightsを使用してその名前を指定し、変異子を有効にします。例:mutator_weights=afl:2,radamsa:0,example_mutator:8。
注:AFLおよびRadamsa変異子は常に指定する必要があります。AFLやRadamsaを無効にしたい場合は、それらの重みを0に設定してください。
TBD
