主要有以下几种

  • bitflip,按位翻转,1变为0,0变为1
  • arithmetic,整数加/减算术运算
  • interest,把一些特殊内容替换到原文件中
  • dictionary,把自动生成或用户提供的token替换/插入到原文件中
  • havoc,对原文件进行大量变异
  • splice,将两个文件拼接得到新的文件

bitflip

在这个过程中,会根据不同的步长来翻转bit。

同时在连续翻转时,会有afl自定义策略:自动检测token,即例如翻转文件头时,因为文件头被破坏,程序的运行路径就与原来不一样了,所以破坏文件头里的任一bit效果是一样的,随后afl会将这个文件头作为一个可能的token存储起来。

在每次翻转相邻的8bit时,会有策略生成effector map,这个map里存储了无效的data字节,即在进行字节翻转(8bit)时,如果对一个字节翻转后,路径没有变化,说明这个字节很有可能对fuzzing的意义不大,所以被加入到map中,之后的变异过程中,就会根据map跳过一些无用的字节。

其中比较详细的介绍可以参考https://paper.seebug.org/496/#part-2af

arithmetic

在bitflip后进入此阶段,也是根据不同的步长对字节进行-35~35的加减。

interest

这个过程是根据不同的步长进行替换,替换的内容是afl内设定的一些数。

dictionary

在这个过程中,如果用户有提供token,则会有两个步骤尝试替换token到原文件里或者插入token,接下来会将之前识别出的token进行替换。

havoc

这个过程里含有多种变异手段,并且将他们进行组合

  • 随机选取某个bit进行翻转
  • 随机选取某个byte,将其设置为随机的interesting value
  • 随机选取某个word,并随机选取大、小端序,将其设置为随机的interesting value
  • 随机选取某个dword,并随机选取大、小端序,将其设置为随机的interesting value
  • 随机选取某个byte,对其减去一个随机数
  • 随机选取某个byte,对其加上一个随机数
  • 随机选取某个word,并随机选取大、小端序,对其减去一个随机数
  • 随机选取某个word,并随机选取大、小端序,对其加上一个随机数
  • 随机选取某个dword,并随机选取大、小端序,对其减去一个随机数
  • 随机选取某个dword,并随机选取大、小端序,对其加上一个随机数
  • 随机选取某个byte,将其设置为随机数
  • 随机删除一段bytes
  • 随机选取一个位置,插入一段随机长度的内容,其中75%的概率是插入原文中随机位置的内容,25%的概率是插入一段随机选取的数
  • 随机选取一个位置,替换为一段随机长度的内容,其中75%的概率是替换成原文中随机位置的内容,25%的概率是替换成一段随机选取的数
  • 随机选取一个位置,用随机选取的token(用户提供的或自动生成的)替换
  • 随机选取一个位置,用随机选取的token(用户提供的或自动生成的)插入

将上面的变异手段随机挑选组合作为一轮变异,然后一次修改原文件包含多轮变异。

splice

这个是将文件队列中的文件拼接形成一个新的文件。

cycle

这个对应到afl面板中右上角的cycle,如果不停止afl,上述的havoc和splice会一直执行。