
それほど賢くないファザー
Marshall Whittaker
oxagast
システムの複雑さが増すにつれ、そのシステム内の問題の可能性も高まる。
--ホイッテイカーの法則
コンパイル依存関係:
automake autoconf-archive zlib1g-dev g++ gcc (GTKサポートが必要な場合は libgtk2.0-dev も)
コンパイル:
Linux:
$ aclocal && autoconf && automake -a && ./configure && make && make check
または、システムコールファザーを使ってみたい場合:
$ aclocal && autoconf && automake -a && ./configure --enable-syscalls && make && make check
GTKフロントエンドを無効にする場合:
$ aclocal && autoconf && automake -a && ./configure --disable-gtk && make && make check
FreeBSD
portsからg++をインストールした場合(C++11に必要):
$ aclocal && autoconf && automake -a && ./configure && make && make check
OpenBSD:
portsからg++をインストールした場合(C++11に必要):
$ CXX=$(find / -name 'eg++' 2>/dev/null | grep ports | head -n 1) AUTOCONF_VERSION=2.69 AUTOMAKE_VERSION=1.15 autoreconf -fmi
Windows:
WindowsバイナリはMinGW-W64でコンパイルするように設計されています(スレッド化を使用するため、seh版のMinGW-W64 g++をダウンロードしてください)。
MinGW-W64 g++ (seh版のみ) をインストールした後、同梱のmake_win.batスクリプトをクリックしてコンパイルを試すことができます。それが失敗した場合、環境が原因である可能性が高いので、以下を試してください。
(MinGW-W64をインストールした場所に移動し、mingw-64.batをクリック)
windres metadata.rc -O coff -o metadata.res
g++.exe src/common.cpp src/bin2hex.cpp src/popen2.cpp src/main.cpp src/help.cpp src/match_fault.cpp src/sys_string.cpp src/man_read.cpp src/randomizer.cpp src/trash.cpp src/log.cpp metadata.res src/version.h -I./ -I./include -std=c++11 -lstdc++ -lpthread -O2 -o ansvif.exe -static -static-libgcc -static-libstdc++
gcc src/win/printf.c -o printf.exe
注意: cygwinの.dll外部ファイルは不要になりました。MinGWのg++でコンパイルするためです。
Windows 7ではPowershell v2がデフォルトでインストールされていますが、このプログラムには少なくともPowershell v5が必要です。Windows 10にはPowershell v5が含まれています。MicrosoftのサイトからWindows Management Framework(新しいバージョンのPowershellを含む)をダウンロードできます。
https://www.microsoft.com/en-us/download/details.aspx?id=50395
テスト:
サンプルコードを試したい場合は、faulty.cを次のようにコンパイルします:
$ gcc faulty.c -o faulty
単に make check を実行することもできます。
使用方法:
重要: Windowsユーザーは動作させるためにPowershellからansvif.exeを実行する必要があります!
$ ./find_suid /usr/bin/ /bin/ /sbin/
$ ./ansvif -[tm] [テンプレート/マニュアルページ] -c /path/to/executable -b バッファサイズ
例:
Linux/BSD:
$ ulimit -c unlimited
$ ./ansvif -m mount -c /bin/mount -e examples/mount_e.txt -x examples/mount_o.txt\
-f 8 -b 2048
$ ./ansvif -t examples/blank.txt -F tmp/tmphtml -x examples/htmltags.txt -c /usr/bin/iceweasel -b\
128 -A "file:///home/username/src/ansvif/tmp/tmphtml" -f 2 -n -R "sleep 3 && killall\
iceweasel" -S ">"
$ cat examples/linux_syscalls_implemented.list | xargs -P \
`cat examples/linux_syscalls_implemented.list | wc -l` -I {calls} ./ansvif -t examples/space.txt \
-B "{calls} " -c ./syscalls -o syscall_crash -f 1 -z -d -b 16
Windows:
PS C:\ansvif\bin\ansvif_win> .\ansvif -t ..\..\examples\space -F ..\..\tmp\tmphtml -x `
..\..\examples\htmltags -c `
'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' `
-b 128 -A "file:///C:\\Users\marsh\OneDrive\Documents\Code\ansvif\tmp\tmphtml" `
-f 2 -n -S ">" -R "sleep 2 ; Stop-Process -Name chrome"
オプション:
ansvif
-t このファイルには、サンプルファイルのように、コマンド引数を1行ずつ記述します。
-e このファイルには、サンプルファイルのように、環境変数を1行ずつ記述します。
通常は次のように取得できます:
$ strings /bin/mount | perl -ne 'print if /[A-Z]=$/' > mount_envs
-c コマンドのパスを指定します。
-p マニュアルページの場所を整数で指定します(通常は1または8)
-m コマンドのマニュアルページを指定します。
-D マニュアルページで見つかった内容をダンプします。
-f 使用するスレッド数。デフォルトは2です。
-b ファジングに使用するバッファサイズを指定します。通常256~2048で十分です。
-r ランダムなガベージデータのみを使用します。
-o 出力をログファイルに書き込みます。
-z -bで指定された値までの1~の範囲でバッファサイズをランダム化します。
-x 他に入れるデータ。ユーザー名などを指定できます。
-S オプション間の区切り文字。
-s 省略する文字の指定。デフォルトは <>\\n |&\[\]\(\)\{\}:; で、改行は必須です。
-T スレッドのタイムアウト。
-W スレッドのタイムアウト。
-L rootで実行する場合の非特権ユーザー。
-A これをコマンドの後に常に配置します。
-B これをコマンドの前に常に配置します。
-F -xと通常のファジングデータを入れるファイルをプログラムに渡します。
-n ファズにランダムデータを使用しません。
-R 各ファズの後にこのコマンドを実行します。
-C 検出する非標準のエラーコード。
-V インストールされている場合はValgrindを使用します。
-1 一度だけ障害を起こそうとし、発生しない場合はエラーコード64を返します。スクリプトに便利です。
-P ファズ内で%を使用してバイナリを表します。
-M ファズで使用する最大引数数。
-y -b 0の短縮形で、通常は-Aまたは-Bでのみ有用です。
-K ターゲットがクラッシュした後もファジングを続けます。
-E ファズ対象プログラムの前に実行するコマンド。
-0 ファズ内にNULL文字を含めません。
-N -R "pkill prog"の短縮形。
-v 冗長出力。
-d デバッグデータ。
-h ヘルプページを表示します。
-i バージョン情報を表示します。
ansvif_gtk
-l -p ./ansvif のショートカット
-p ansvifバイナリの場所
推奨事項: 長時間のファジングやファイルファジングを行う場合、可能であればファイル(ファジング対象のバイナリも可能なら)をメモリに置くことを推奨します。つまり、/var/run/shmのようなディスクスラッシュが最小限で、特に大容量ファイルを扱う場合にファジングがやや高速になる場所に置いてください。ただし、shmに置いたファズファイルは、マシンを再起動すると失われるので注意してください!
このコードを本番環境で実行しないでください! faulty.cの出力をsuid(0)に設定しようとする場合は、必ず仮想マシン内で行ってください。 少なくとも、気にしないマシンで行ってください。 それ以外は、自由に遊んで楽しんでください!
注意:
WindowsユーザーはPowershellからansvifを実行する必要があります。 LinuxとWindowsのコードは比較的安定しているはずです。 Linuxでのシステムコールファジングは活発に開発中です。
謝辞
システムコールファジングのアイデアをくれたdll999に感謝します。 wikiの記事についてのいくつかの推奨事項をくれたmoo(#2600 on 2600net)に感謝します。 IRCやStackOverflowの数えきれないほどの人たちに感謝します。 Makefileのバグを修正してくれたDarkSt0rmに感謝します。