测试用例也周期性地替换、裁剪。
AFL生成比较小的,自足的测试用例语料。
因为以上的措施,使得AFL能比盲fuzz或者只有代码覆盖率驱动的工具具有更好地性能。
使用AFL替代gcc编译源码来实现插桩,因为有优化性能影响不大。
CC=/path/to/afl/afl-gcc ./configure
CXX=/path/to/afl/afl-g++ ./configure
make clean all
当测试lib库的时候,需要找到或者写入简单程序,从stdin或者从文件读取数据,传入到被测试的lib库中。所以,以把被插桩的lib库以静态的方式连接到可执行文件显得至关重要。或者确保正确的.so文件在程序运行时加载(通过LD_LIBRARY_PATH)。最简单的选择是使用静态编译,通常采用以下方式:
CC=/path/to/afl/afl-gcc ./configure --disable-shared
在使用make命令时设置AFL_HARDEN=1的时候,可以促使CC自动化代码加固选项,使得检测简单的内存bug更加容易。Libdislocator是一个AFL提供的帮助者lib(具体详见libdislocator/README.dislocator),能帮助发现堆崩溃问题。
在没有源代码的时候,可以使用QUMU中的“user space emulation”模式对二进制进行插桩。具体操作:
cd qemu_mode
./build_qemu_support.sh
关于QEMU插桩的说明及注意事项,可以参见qemu_mode/README.qemu