AFLplusplus自定义变异器—源码细节
AFL++自定义变异器
- 支持C/C++库和Python模式
- C/C++ library (
*.so
) - Python module
- C/C++ library (
1. 简介
相关注意事项:
custom_mutator_stage
在确定性变异之后启用;- 在使用C/C++接口时,需要引入一个动态链接库(动态库路径存放在环境变量
AFL_CUSTOM_MUTATOR_LIBRARY
中),该库(部分)定义AFL++暴露出来的接口
可参考 custom_mutators/examples
目录下的示例文件
2. APIs
总览
C/C++:
1 |
|
python:
1 |
|
细节(C/C++)
变异部分:
afl_custom_queue_get
:用于种子调度,决定该种子是否被模糊测试;
1 |
|
afl_custom_fuzz_count
:fuzz次数,相当于stage_max;
1 |
|
afl_custom_fuzz
:执行特定的变异操作;
1 |
|
afl_custom_havoc_mutation_probability
:表示afl_custom_havoc_mutation
被调用的概率
1 |
|
afl_custom_havoc_mutation
:自定义havoc
变异操作;
1 |
|
初始化/清理部分:
afl_custom_init
:进行一些初始化操作maybe? 初始化一些data数据?mutator->data
为void类型数据,可以存放一些自定义的东西?
1 |
|
调用链:afl-fuzz.c main ==> setup_custom_mutators ==> load_custom_mutator ==> afl_custom_init
afl_custom_deinit
:进行mutator的一些清理程序
1 |
|
调用链: afl-fuzz.c main ==> destroy_custom_mutators ==> afl_custom_deinit
Trim相关:
🍖 封装在trim_case_custom
函数中(Line 350 in afl-fuzz-mutators.c中)
完整调用链:afl-fuzz-run.c (trim_case: 811) ==> trim_case_custom ==> xxx
1 |
|
afl_custom_init_trim
:初始化操作?可以定义trimming步长 ==> stage_max?返回trim次数?
1 |
|
afl_custom_trim
:执行自定义的精简操作?
1 |
|
afl_custom_post_trim
:修剪后处理操作?判断修剪是否成功?并更改一些参数值?
1 |
|
其他:
afl_custom_post_process
:post-processing函数,在AFL将测试用例写到磁盘之前调用(write_to_testcase?),以便执行被测目标
1 |
|
afl_custom_queue_new_entry
:允许额外的分析(例如,调用一个不同的工具,做一个不同的覆盖率,并将其保存在自定义变异器中)调用链:afl-fuzz-init.c (pivot_inputs()) ==> run_afl_custom_queue_new_entry() ==> afl_custom_queue_new_entry()
afl_custom_describe
:给保存的文件名添加额外的描述
1 |
|
3. 总结
AFL++ custom mutators本质上不是一个插件,而是在AFL++模糊测试阶段设置了若干函数端点,并以C/C++接口或者Python接口的方式暴露给用户,并提供给用户使用,旨在提高模糊器的功能性
多参数项目对
fuzz_one()
进行了大改,主要包括两个部分:第一个部分从json文件中读入参数规范,第二个部分是根据参数类型选择特定的变异操作,AFL++ custom mutators虽然提供了变异方法,但该方法是在确定性变异后、havoc变异之前执行的,此外还可以在havoc阶段添加havoc_mutator,但:1⃣ 多参数项目拆解了确定性变异和havoc,根据参数的类型来pick适当的变异操作,因此将多参数变异添加到custom mutators里不会有啥效果;
2⃣ AFL++ custom mutators的流程是:在进行确定性变异之后,如果定义了custom_mutator,那么就执行custom_mutator定义的变异,否则跳转到进行havoc变异,其本质还是原生AFL++对于单个输入的顺序变异方式,并没有体现多参数的性质。因此如果要实现多参数,还是需要对引擎进行修改;
3⃣ 解析参数规范的部分貌似无法添加到合适的接口上;