一个不太智能的模糊测试器
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++ 版本)。 安装带有 seh 的 MinGW-W64 g++ 后,你可以尝试通过点击包含的 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] [template/manpage] -c /path/to/executable -b buffersize
示例:
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 此文件应包含逐行的命令参数,如示例文件所示。
-e 此文件应包含逐行的环境变量,如示例文件所示。
通常可以通过类似以下方式获取:
$ 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 将缓冲区大小随机化为从 1 到 -b 指定的值。
-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 提供的系统调用模糊测试思路。 感谢来自 2600net #2600 频道的 moo 对 wiki 文章提出的几条建议。 感谢 IRC 和 StackOverflow 上无数的人的帮助。 感谢 DarkSt0rm 修复了 Makefile 中的一个 bug。