AFL维护了一个队列(queue),每次从这个队列中取出一个文件,对其进行大量变异,并检查运行后是否会引起目标崩溃、发现新路径等结果。
STAGE_FLIP1
每次翻转一位(1 bit
),按一位步长从头开始。STAGE_FLIP2
每次翻转相邻两位(2 bit
),按一位步长从头开始。STAGE_FLIP4
每次翻转相邻四位(4 bit
),按一位步长从头开始。STAGE_FLIP8
每次翻转相邻八位(8 bit
),按八位步长从头开始,也就是说,每次对一个byte做翻转变化。STAGE_FLIP16
每次翻转相邻十六位(16 bit
),按八位步长从头开始,每次对一个word做翻转变化。STAGE_FLIP32
每次翻转相邻三十二位(32 bit
),按八位步长从头开始,每次对一个dword做翻转变化。比如 xxxxxxxxIHDRxxxxxxxx
这样的字符串,如果在被 位反转后 运行后的 覆盖率变低了很多,这个时候fuzz 会认为这个是一个特定字符串,存在这个字符串时,覆盖率才会更高。这样就会将这个字符串记录为 token
其实token的长度和数量都是可以控制的,在 config.h 中有定义,但是因为是在头文件宏定义的,修改之后需要重新编译使用。