综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表示本次执行没有新的路径产生,该测试用例不会被放入测...
综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表示本次执行没有新的路径产生,该测试用例不会被放入测...
检查执行结果是否有趣,即,调用has_new_bits(virgin_bits)来判断是否产生了新的路径元组,若是则保存或加入队列。trace_bits指向由全体进程共享的内存区域,其中包含每次样本执行的覆盖率,其实是之后提到的覆盖次数桶的压缩存储。 2.2 插桩技术 既然要进行覆盖率的引导来辅助遗传算法的进化过程,就必须统计覆盖率,而如果...
/* Configure shared memory and virgin_bits. This is called at startup. */EXP_STvoidsetup_shm(void){u8*shm_str;if(!in_bitmap)memset(virgin_bits,255,MAP_SIZE);// 如果 in_bitmap 为空,调用 memset 初始化数组 virgin_bits[MAP_SIZE] 的每个元素的值为 ‘255’。 memset(virgin_tmout, 255,...
cksum = hash32(trace_bits, MAP_SIZE, HASH_CONST)校验此次运行的trace_bits,检查是否出现新的情况。hash32函数较为简单,不多做分析。 这段代码的主要意思是先用cksum也就是本次运行的出现trace_bits哈希和本次testcase q->exec_cksum对比。如果发现不同,则调用has_new_bits函数(见2.6)和我们的总表virgin_...
has_new_bits 检查有没有新路径或者某个路径的执行次数有所不同 将current和virgin分别初始化为trace_bits和virgin_map的u64首元素地址 trace_bits表示被fuzz覆盖的字节,初始值为全0,每次按字节置位,指向共享内存bitmapvirgin_bits表示没被fuzz覆盖的字节,初始值为全1,每次按字节置位,是位于栈上的数组 ...
8.调用hash32 校验此次运行的 trace_bits,检查是否出现新的情况; 9.将本次运行的出现 trace_bits 哈希和本次 testcase的 q->exec_cksum对比。如果发现不同,则调用 has_new_bits函数和总表virgin_bits 对比; 10.判断q->exec_cksum 是否为0,不为0说明不是第一次执行。后面运行如果和前面第一次 trace_bits...
static inline u8 has_new_bits(u8* virgin_map) {//检查有没有新路径或者某个路径的执行次数有所不同 #ifdef WORD_SIZE_64//64位实现 u64* current = (u64*)trace_bits;//current指向trace_bits的首地址 u64* virgin = (u64*)virgin_map;//virgin指向virgin_map的首地址 ...
调用hash32校验此次运行的trace_bits,检查是否出现新的情况; 将本次运行的出现trace_bits哈希和本次 testcase的q->exec_cksum对比。如果发现不同,则调用has_new_bits函数和总表virgin_bits对比; 判断q->exec_cksum是否为0,不为0说明不是第一次执行。后面运行如果和前面第一次trace_bits结果不同,则需要多运行几...
hnb = has_new_bits(virgin_bits) 如果hnb大于new_bits,设置new_bits的值为hnb 如果q->exec_cksum不等于0,即代表这是判断是否是可变queue i从0到MAP_SIZE遍历,如果first_trace[i]不等于trace_bits[i],代表发现了可变queue,且var_bytes为空,则将该字节设置为1,并将stage_max设置为CAL_CYCLES_LONG,即需要...