1、AFL(American Fuzzy Lop)
是一款开源的fuzzing工具。对于其中的共享内存进行分析:afl并不是对输入文件进行随机变化(除非dump模式,而是会对target进行插桩,以辅助mutated input的生成。插桩后的target,会记录执行过程中的分支信息;随后,fuzzer便可以根据这些信息,判断这次执行的整体流程和代码覆盖情况。AFL使用共享内存,来完成以上信息在fuzzer和target之间的传递。
在执行完成后,边缘计数将被分段,以便共享映射中具有非零边缘计数的每个字节都包含2的幂次。
映射的关系可以从下面的代码中查看。
将共享映射与全局位图进行比较,位图包含先前运行中观察到的所有位。如果设置了任何新的位,则存储测试输入,因为它导致了覆盖范围的增加,并且全局位图将更新以包含新的覆盖范围。
2、将反馈机制扩展到代码覆盖范围之外的方法
(1)将大型比较指令拆分为多个较小的指令。
(2)ANGORA.
3、处理问题可以分为三种状态:
知道相关的状态值:分析员知道哪些状态是interesting/知道状态变化:能够识别代码中被怀疑会改变状态的位置/缺少中间状态: 分析者可以创建人工的中间状态来指导fuzzer
下面通过实例来进行分析
4、知道相关的状态值——迷宫模型
首先分析迷宫模型的源码
main函数如下:
也可以增大迷宫的大小,增强难度
其他的内容是一样的
5、已知状态变化:
在某些情况下,用户可能不知道相关状态的哪些部分值得研究,或者状态可能分散在各个部分.
6、
分析员可以认识到 这实现了一对多字符串比较。利用这种洞察力,可以引导模糊者找到解决方案,将这个复杂的约束转化为一系列简单的字符串比较。
该工具的目标是分析师可以使用这些注释为模糊化过程提供高级指导。在交互式模糊化会话中,分析员不时检查代码覆盖率,以确定模糊化者似乎难以覆盖的分支。然后分析者就可以找出模糊器无法取得进展的原因。
7、该工具实现的功能
1)允许分析员选择与解决手头问题相关的代码区域。
2)我们允许直接访问AFL位图来存储附加值。位图项可以直接设置或递增,因此可以向反馈函数公开状态值。
3)使分析员能够影响覆盖率计算。这允许相同的边缘覆盖率导致不同的位图覆盖率。这允许在不同的状态下创建更细粒度的反馈。
4)引入一个原语,允许用户添加爬山优化[48]。这样,如果可能的状态空间太大而无法进行详尽的探索,那么用户就可以提供一个目标来实现。
8、具体实现
-
IJON-Enable
IJON-ENABLE(和IJON-DISABLE)注释可用于启用和禁用覆盖反馈。这样,我们可以有效地排除代码库的某些部分,或者引导模糊者只在满足某些条件的情况下探索代码。此注释允许模糊处理者集中精力解决难题,而无需浪费时间探索输入队列中的许多其他路径。
引入了一个应用于所有位图索引计算的掩码
如果掩码设置为零,则只能寻址和更新第一个位图条目,相当于disable。如果设置为0xffff,则使用原始行为,相当于enable。
-
IJON-INC and IJON-SET
可用于在位图中设置递增或特定项的设置,它添加了一个超出当前代码覆盖范围的反馈机制。
函数内部实现如下
调用ijon_inc(n)后,位图中的第n项将递增。
调用ijon_set(n)将第n项的最低有效位设置为1。
上述例子中,它使用x和y坐标的组合作为反馈。游戏中任何新访问的位置都被视为新的覆盖范围。
-
IJON-STATE
为了产生更细粒度的反馈,可以研究状态和代码覆盖率的笛卡尔积。
更改基本块边缘映射到位图项的方式,并且修改了编译器过程,使位图索引的计算如下:state⊕(ids⊕2)⊕idt
-
IJON-MAX
最大化原语,它有效地将模糊器转化为一个基于爬山的黑盒优化器
对于超级玛丽,最大化x.
IJON-MAX(slot,x)注释告诉fuzzer最大化字符的x坐标。使用玩家的y坐标(高度)来选择插槽。这使得能够在不同的高度上独立地最大限度地前进。
Helper函数
(1). IJON_CMP(x,y):计算x和y之间不同的位数。
此外,IJON_CMP将参数与当前文件名和行的散列相结合,大大降低了碰撞的可能性。是通过INC来实现的。
IJON_HASH_INT(u32 old, u32 val) / IJON_HASH_STR(u32 old, char*str) / ....
IJON_STRDIST(chara, charb)
计算并返回a和b的公共前缀的长度。
为了传递中间覆盖结果,基于afl的模糊器使用包含共享位图的共享内存区域。我们通过用一个共享结构替换它来扩展这个区域。这个结构有两个不同的字段。第一个是原始的AFL共享位图。第二个是用于最大化原语的共享max映射。
ps:还没学会怎么实际操作使用