黑客Winafl中基于插桩的覆盖率反馈原理

最近winafl增加支持对Intel PT的支持的,但是只支持x64,且覆盖率计算不全,比如条件跳转等,所以它现在还是不如直接用插桩去hook的方式来得准确完整,这里主要想分析也是基于 DynamoR…

近期winafl提升了对intelPT适用的适用,可是只适用x64,而且普及率测算不详细,例如标准自动跳转,因此它依然比不上立即应用仪器设备挂勾的方式那般精确和详细,这儿关键是期待剖析应用场景DynamoRIO仪器设备的普及率意见反馈基本原理。

  我以前在《初识 Fuzzing 专用工具 WinAFL》(https://paper.seebug.org/323/#31)的“

  3.2.2插进控制模块”每节中剖析了仪器设备的基本原理,但找不着我要的参考答案,因此务必全自动剖析源码。 比如,我想知道: 根据在循环系统中启用模糊不清检测总体目标涵数来提升速率,但DynamoRIO遮盖信息内容怎样与模糊不清器主进程同步? 从总体上,怎样保持纪录自然环境和纪录修复,进而达到目标涵数的持续循环系统? 怎样纪录和剖析普及率信息内容?

  遮盖信息内容纪录和剖析基本原理 第四个难题发觉许多人早已剖析了afl,能够这里寻找《AFL內部保持关键点小记》(http://rk700.github.io/2018/13/29/afl-internals/),简略小结: 当AFL编译源码时,它为每一代码生成1个自然数,表达部位详细地址; 在二进制组里纪录自动跳转的源地址和目地详细地址,二者的XOR結果是支系的重要,储存每一支系的实行频次,后以1字节数储存; save支系的实行记数事实上是1个尺寸为32K的哈希表,它坐落于共享内存中,有利于总体目标系统进程和模糊不清系统进程中间的共享资源。相匹配的伪代码给出:

  模糊不清系统进程根据桶哈希桶对这种支系的实行频次开展归类。下列构造界定左边的实行频次和右边的trace_bits:

  是不是开启新相对路径,关键是根据测算每一支系的trace_bits的哈希值(优化算法:u32 cksum **=** hash32(trace_bits,MAP_SIZE常量,HASH_CONST常量);) 遮盖信息内容传送基本原理 最先在fuzzer系统进程中建立1个命名管道,在其中fuzzer_id是1个任意值:

  2.建立drrun系统进程以运作目标程序和Hook,在文档childid _(%fuzzer_id%)。

  txt中纪录子系统进程id,即总体目标系统进程ID,随后等候管路联接,并载入上边的txt文档来获得总体目标系统进程。

  Id,主要用于在请求超时后终断系统进程:

  3.开启在检验控制模块winafl.dll中建立的命名管道,随后根据管路与fuzzer主系统进程互动:

  11.当检验控制模块winafl.dll检验到程序流程初次运作到总体目标涵数通道时,将实行pre_fuzz_handler涵数,随后将根据管路载入'P'指令,标示总体目标涵数已起动,和afl-fuzz.exe系统进程接受指令后,管路指令“F”被载入总体目标系统进程,并监控请求超时和循环系统启用频次。 Afl-fuzz.exe根据读写能力管路指令与总体目标系统进程互动,包括'F'(撤出总体目标涵数),'P'(进到总体目标涵数),'K'(请求超时终断系统进程),'C '(奔溃),'Q'(撤出步骤)。遮盖信息内容根据文档投射方式(运行内存共享资源)载入winafl_data.afl_area:

伪造总体目标涵数循环系统启用的基本原理 那步的重要是在启用总体目标涵数以前启用的pre_fuzz_handler涵数,及其涵数撤出后启用的post_fuzz_handler涵数。 键入pre_fuzz_handler涵数时,winafl.dll将最先获得下列信息内容。
  运行内存语义信息内容适用每一服务平台的寄存器纪录:
  下一阶段是获得并设定模糊不清总体目标函数参数:
  当总体目标涵数撤出时,实行post_fuzz_handler涵数将修复堆栈顶端表针和pc详细地址,进而达到目标涵数的循环系统启用: 回顾总结 小结全部winafl执行全过程: Afl-fuzz.exe根据建立命名管道和运行内存投射来与总体目标系统进程互动。管路用以上传和接受指令以实际操作相互的系统进程。存储芯片投射主要用于纪录遮盖信息内容。 遮盖纪录关键根据drmgr_register_bb_instrumentation_event设定BB实行的回调函数,并根据instrument_bb_coverage或instrument_edge_coverage纪录普及率。假如寻找新的实行相对路径,则将样版放到序列文件目录中以开展事件文档变动,以提升编码普及率。率; 在总体目标系统进程实行到总体目标涵数以后,启用pre_fuzz_handler来储存语义信息内容,包含寄存器和运作主要参数; 总体目标涵数撤出后,启用post_fuzz_handler涵数纪录修复语义信息内容,实行回到初始总体目标涵数,并回到流程2; 当文件目录涵数对于特定总数的循环系统启用运作的频次时,该系统进程撤出。