在对源码进行重新编译之后,使用如下命令用AFL对其进行fuzz:
sudo afl-fuzz -i fuzz_in -o fuzz_out ./wx @@
其中,fuzz_in
为输入数据所在文件夹,@@
表示从文件读取输入。但是这里的输入是在fuzz_in文件夹下,因此命令行写@@,程序会在./
下找输入,找不到自然不会出现正确结果。
命令行应改为
sudo afl-fuzz -i fuzz_in -o fuzz_out ./wx ./fuzz_in/testcase
下面对界面进行简单的介绍:
process timing
这里展示了当前fuzzer的运行时间、最近一次发现新执行路径的时间、最近一次崩溃的时间、最近一次超时的时间。
值得注意的是第2项,最近一次发现新路径的时间。如果由于目标二进制文件或者命令行参数出错,那么其执行路径应该是一直不变的,所以如果从fuzzing开始一直没有发现新的执行路径,那么就要考虑是否有二进制或者命令行参数错误的问题了。对于此状况,AFL也会智能地进行提醒
overall results
这里包括运行的总周期数、总路径数、崩溃次数、超时次数。
其中,总周期数可以用来作为何时停止fuzzing的参考。随着不断地fuzzing,周期数会不断增大,其颜色也会由洋红色,逐步变为黄色、蓝色、绿色。一般来说,当其变为绿色时,代表可执行的内容已经很少了,继续fuzzing下去也不会有什么新的发现了。此时,我们便可以通过Ctrl-C,中止当前的fuzzing
stage progress
这里包括正在测试的fuzzing策略、进度、目标的执行总次数、目标的执行速度
执行速度可以直观地反映当前跑的快不快,如果速度过慢,比如低于500次每秒,那么测试时间就会变得非常漫长。如果发生了这种情况,那么我们需要进一步调整优化我们的fuzzing
关于并发执行:
要提高AFL测试效率,可以使用并发测试。
查看自己机器CPU cores:
cat /proc/cpuinfo| grep "cpu cores"| uniq
这样,可以同时开4个fuzzer进行测试:-M指定主fuzzer,-S指定从fuzzer,sync_out为同步文件夹,下面有各个fuzzer的目录。
注意:sync_out命名不能更改!
afl-fuzz -i fuzz_in -o sync_out -M fuzzer1 ./afl_test fuzz_in/testcase
afl-fuzz -i fuzz_in -o sync_out -S fuzzer2 ./afl_test fuzz_in/testcase
afl-fuzz -i fuzz_in -o sync_out -S fuzzer3 ./afl_test fuzz_in/testcase
通过afl-whatsup命令查看总体测试情况: