综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表...
综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表示本次执行没有新的路径产生,该测试用例不会被放入测...
这个文件到内存内存里,然后write_to_testcase(mem, st.st_size),并run_target,然后通过save_if_interesting来决定是否要导入这个文件到自己的 queue 里,如果发现了新的 path,就导入。 跳过开头的文件和sync_id即我们自己的输出文件夹读取outdir/.synced/sd_ent->d_name文件id_里的4个字节到minaccept里...
综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表示本次执行没有新的路径产生,该测试用例不会被放入测...
,并run_target,然后通过save_if_interesting来决定是否要导入这个文件到自己的queue里,如果发现了新的path,就导入。 设置syncing_party的值为sd_ent->d_name 如果save_if_interesting返回1,queued_imported计数器就加1 stage_cur计数器加一,如果stage_cur是stats_update_freq的倍数,就刷新一次展示界面。
save_if_interesting():保存有趣的测试用例。检查执行结果是否有趣,即,调用has_new_bits(virgin_bits)来判断是否产生了新的路径元组,若是则保存或加入队列。trace_bits指向由全体进程共享的内存区域,其中包含每次样本执行的覆盖率,其实是之后提到的覆盖次数桶的压缩存储。 2.2 插桩技术 既然要进行覆盖率的引导来辅助...
if (top_rated[i] && (temp_v[i >> 3] & (1 << (i & 7))) { u32 j = MAP_SIZE >> 3; /* Remove all bits belonging to the current entry from temp_v. */ // 从temp_v中,移除所有属于当前current-entry的byte,也就是这个testcase触发了多少path就给tempv标记上 while...
该函数在 perform_dry_run,save_if_interesting,fuzz_one,pilot_fuzzing,core_fuzzing函数中均有调用。该函数主要用途是初始化并启动fork server,多次运行测试用例,并用 update_bitmap_score 进行初始的byte排序。 函数控制流程图如下:结合源码进行解读如下:
save_if_interestingcksum=hash32()check_cpu_governorshow_init_statsdestroy_queueAFL 的突变分为两类:span style=\pivot_inputs...q->exec_cksum = cksumfirst_trace=trace_bitsY结束open fdperform_dry_runcull_queue处理超时操作并返回mainq->exec_cksum != cksum...
该函数在perform_dry_run,save_if_interesting,fuzz_one,pilot_fuzzing,core_fuzzing函数中均有调用。该函数主要用途是初始化并启动fork server,多次运行测试用例,并用update_bitmap_score进行初始的byte排序。 函数控制流程图如下:结合源码进行解读如下: /* Calibrate a new test case. This is done when ...