AFL源码分析(四)
本文最后更新于:2023年10月6日 晚上
AFL源码分析(四)
afl-fuzz.c
main函数主循环
1 |
|
fuzz_one
fuzz_one作为fuzz的核心函数,主要有以下几个阶段:
- 前期准备阶段
- CALIBRATION阶段
- TRIMMING阶段
- PERFORMANCE SCORE阶段
- SIMPLE BITFLIP (+dictionary construction) 简单位翻转
- ARITHMETIC INC/DEC 算术加减
- INTERESTING VALUES
- DICTIONARY STUFF
- RANDOM HAVOC
- SPLICING
- 后期收尾阶段
前期准备阶段
根据概率判断是否开启fuzz,建立文件映射,建立输出缓冲区。
1 |
|
CALIBRATION
若评估失败,且评估次数小于3次,再次评估测试用例。根据评估用例判断是否继续进行fuzz。
1 |
|
TRIMMING
对queue_cur进行剪枝,初始化out_buf。
1 |
|
PERFORMANCE SCORE
计算测试用例得分,进行简单的deterministic。
1 |
|
SIMPLE BITFLIP (+dictionary construction)
对out_buf做简单的位翻转。
1 |
|
ARITHMETIC INC/DEC
对测试用例做简单的算术加减变异,不区分大小端。
1 |
|
INTERESTING VALUES
将out_buf随机替换为AFL提供的interesting内容。
1 |
|
DICTIONARY STUFF
基于用户提供的extras,以及自动生成的a_extras进行替换和插入变异。
1 |
|
RANDOM HAVOC
随机变异阶段,有很大的随机性。
主要有以下变异方式:
随机翻转out_buf字节
随机选中interesting_8的值替换out_buf中的随机byte
随机选中interesting_16的值替换out_buf中的随机2bytes
随机选中interesting_32的值替换out_buf中的随机4bytes
随机选择out_buf中的1byte并随机减去一个值
随机选择out_buf中的1byte并随机加上一个值
随机选择out_buf中的2bytes并随机减去一个值
随机选择out_buf中的2bytes并随机加去一个值
随机选择out_buf中的4bytes并随机减去一个值
随机选择out_buf中的4bytes并随机加上一个值
随机选择out_buf中1byte与1~255中某个值进行异或
随机删除随机长度随机位置的值
随机删除随机长度随机位置的值
随机插入随机长度值
随机替换随机长度值
指定dict时,随机替换token
随机插入token
1 |
|
SPLICING
拼接测试用例,重新进行Random Havoc。
1 |
|
后期收尾阶段
设置fuzz标志位,取消映射,释放缓冲区。
1 |
|
trim_case
对测试用例进行剪枝,找到最小的符合原来路径的输入。
1 |
|
calculate_score
根据queue entry的执行速度、覆盖到的path数和路径深度来评估出一个得分,这个得分perf_score在后面havoc的时候使用。
1 |
|
common_fuzz_stuff
修改测试用例,执行target程序,处理结果。处理成功返回0,否则返回1。
1 |
|
save_if_interesting
判断case是否为interesting模式。若是crash,则保存case到queue文件夹以及crash文件夹中,设置keeping为1,返回1;若是tmout,保存到hangs文件夹中,返回0。其它情况也返回0。
1 |
|
simplify_trace
简化路径信息,将命中路径设置为0x80,未命中的设置为1。
1 |
|
参考链接
https://eternalsakura13.com/2020/08/23/afl/
https://hollk.blog.csdn.net/category_11470526.html
https://paper.seebug.org/1732/
https://www.z1r0.top/2023/03/23/AFL-fuzz%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/