近期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: