AFL-变异策略
主要有以下几种
- 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会一直执行。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 X Mεl0n | 随手记!