【AFL(六)】AFL源码中的那些头文件
前言:
AFL中有一些自定义的头文件,说不上很重要,但是又不得不说。一共有五个头文件需要说一下:
当然还有一个afl-as.h文件,这个跟插桩过程相关,暂且先不谈。
【一】config.h
顾名思义,属于配置类的头文件,包含大量的宏定义,用来规定。
宏定义大概分三个部分,刚开始是一些通用的参数,如输入输出文件的大小,用户的颜色配置;第二部分是跟变异有关的,比如在文件变异时候的interest过程,所用到的预设特殊值,就是在这个头文件中定义的,还有bitflip阶段的 token 长度定义也是在这个头文件中;第三部分是特殊用途的宏定义,比如 HASH_CONST 定义了哈希函数里的一个长度常量,等等;
【二】types.h
属于类型重定义的作用,一些在 afl-fuzz.c 中看不太懂的类型,可以在这里看看是不是有相关定义,比如 u8
在源码中经常出现,实际上在这个头文件可以看出 typedef uint8_t u8
,所以其对应的类型应该是 uint8_t
,对应的是 C99 标准里的无符号字符型
【三】debug.h
调试,宏定义各种参数及函数,比如显示的颜色,还有各种自定义的函数,如果改AFL,这些东西相当于没有编译器情况下的"高端printf(滑稽脸)",比如最常见的 OKF("We're done here. Have a nice day!\n"); 其中的 OKF
就是一个输出代表成功信息的函数
【四】alloc-inl.h
内存相关,提供错误检查、内存清零、内存分配等常规操作,“内存器的设计初衷不是为了抵抗恶意攻击,但是它确实提供了便携健壮的内存处理方式,可以检查 use-after-free 等”
【五】hash.h
头文件主要是提供了一个哈希函数,实现一个参数为 const void* key, u32 len, u32 seed 返回为 u32
的静态内联函数,以高效率抽象出自己实现的哈希函数。
在头文件中准对函数的实现其实有一些别人的优化,也有一些相关论文 CollAFL:Path Sensitive Fuzzing-SP-2018 就是准对哈希函数的改进。