确定性变异:
bitflip:按位翻转,1变为0,0变为1;这一阶段还会按照不同的长度和步长进行多种不同的翻转,每次翻转1/2/4/8/16/32 bit,依次进行。
arithmetic:整数加/减算术运算
interest:把一些特殊内容替换到原文件中。所谓的特殊内容是AFL预设的一些比较特殊的数,比如可能造成溢出的数。
dictionary:把自动生成或用户提供的token替换/插入到原文件中。
随机变异:
havoc:“大破坏”,是前面几种变异的组合
splice:“连接”,此阶段会将两个文件拼接起来得到一个新的文件,并对这个新文件继续执行havoc变异。
- #include
- #include
- #include
- #include
- #include
-
- int AFLTest(char *str)
- {
- int len = strlen(str);
- if(str[0] == 'A' && len == 6)
- {
- raise(SIGSEGV);
- //如果输入的字符串的首字符为A并且长度为6,则异常退出
- }
- else if(str[0] == 'F' && len == 16)
- {
- raise(SIGSEGV);
- //如果输入的字符串的首字符为F并且长度为16,则异常退出
- }
- else if(str[0] == 'L' && len == 66)
- {
- raise(SIGSEGV);
- //如果输入的字符串的首字符为F并且长度为66,则异常退出
- }
- else
- {
- printf("it is good!\n");
- }
- return 0;
- }
-
- int main(int argc, char *argv[])
- {
- char buf[100]={0};
- gets(buf);
- //存在栈溢出漏洞
- printf(buf);
- //存在格式化字符串漏洞
- AFLTest(buf);
-
- return 0;
- }
(编译插桩是指在代码编译期间修改或新增代码,插桩是为了覆盖率而实行的方法)
- 方法1:
- CC="afl-gcc" CXX="afl-g++" ./configure --prefix="out_binary_Path"
- sudo make && make install
-
- 方法2:直接修改 Makefie 文件,修改编译器:
- CC = afl-gcc
- CXX = afl-g++
- ./configure --prefix="out_binary_Path"
- sudo make && make install
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
- A@@@@@DVV@@Z@@@@@@@@@@@@@@@@P@@@@@⚌⚌⚌@@@@@@@@@@@@P@@@@@⚌⚌@@@@@@@@@@⚌@@@@@@@P@@G@@.V@⚌@@@
这两种类型的Fuzzer执行不同的Fuzzing策略,前者进行确定性测试(deterministic ),即对输入文件进行一些特殊而非随机的的变异;后者进行完全随机的变异。
可以看到这里的-o指定的是一个同步目录,并行测试中,所有的Fuzzer将相互协作,在找到新的代码路径时,相互传递新的测试用例,如下图中以Fuzzer0的角度来看,它查看其它fuzzer的语料库,并通过比较id来同步感兴趣的测试用例。
afl-whatsup 可以查看每个fuzzer的运行状态和总体运行概况( 依靠读afl-fuzz输出目录中的fuzzer_stats文件来显示状态的,每次查看都要需要手动执行),加上-s选项只显示概况,其中的数据都是所有fuzzer的总和。