Driller工具分析

Driller是一款基于AFL的模糊测试增强工具,它结合了AFL的效率和动态符号执行的探索能力。当AFL遇到无法突破的边界时,Driller利用Angr进行符号执行,生成新的输入以继续测试。Driller通过监控AFL的状态转换速率,决定何时启动符号执行,并通过SMT求解器创建新输入,反馈给AFL进行变异。工具安装涉及shellphuzz和angr,使用时可通过shellphuzz调用driller。
摘要由CSDN通过智能技术生成

1. Driller介绍

driller在afl的基础上开发的crash模糊测试工具。Driller在AFL的基础上加入了动态符号执行引擎,当模糊测试发生stuck时,使用动态符号执行去突破这些限制,生成满足fuzz需求的新输入,使得fuzz能够继续执行。
总体上说,Driller结合了AFL的高效、低消耗、快速的优点和动态符号执行探索能力强的优点,又避免了AFL较难突破特殊的边界和动态符号执行路径爆炸的问题。

Driller为CTF团队开发,结合了AFL和该团队的符号执行工具Angr,具体原理可参考Driller论文driller augmenting fuzzing through selective symbolic execution,angr论文The Art of War: Offensive Techniques in Binary Analysis, AFL官网和本人的另一篇文章。

2. 基本原理

我们使用AFL模糊测试器作为符号辅助Fuzzing的基础,并使用angr作为它的符号执行工具。通过监测AFL的执行,我们能够决定什么时候开始符号执行AFL产生的输入。为了做出这个决定,我们按照模糊器发现新状态转换的速率采取行动。如果AFL报告说,在执行了一轮输入变化后没有发现新的状态转换,我们假设模糊器难以取得进展,并且在AFL被认为是唯一的所有路径上引用angr(即,任何路径有一个跳转,由源地址和目标地址的元组标识,没有其他路径),寻找AFL无法找到输入的转换。
Driller的符号组件是通过使用angr的符号执行引擎来实现的,以便根据AFL提供的具体输入来符号性地追踪路径。这避免了符号执行固有的路径爆炸问题,因为每个具体输入对应于单个(追踪)路径,并且这些输入经AFL严格过滤以确保仅追踪有希望的输入。每个具体输入对应于PathGroup中的单个路径。 在PathGroup的每一步中,检查每个分支以确保最新的跳转指令引入先前AFL未知的路径。 当发现这样的跳转时,SMT求解器被查询以创建一个输入来驱动执行到新的跳转。这个输入反馈给AFL,AFL在未来的模糊步骤中进行变异。 这个反馈循环使我们能够将昂贵的符号执行时间与廉价的模糊时间进行平衡,并且减轻了模糊对程序操作的低语义洞察力。

3. 安装使用

driller工具是由python语言写的,主要依赖于angr,afl等2个工具。我们可以通过shellphfuzz工具来使用driller,安装步骤可以参考博客driller安装教程
使用方式:
官方推荐的driller的使用方法是通过shellphuzz工具来使用,使用方式如下,“-i”选项指定afl-fuzz的线程数,“-d”选项指定driller(即符号执行工具)的线程数,如果不使用-d或者-d 0,则不使用符号执行。

# fuzz with 4 AFL cores
shellphuzz -i -c 4 /path/to/binary

# perform symbolic-assisted fuzzing with 4 AFL cores and 2 symbolic tracing (drilling) cores.
shellphuzz -i -c 4 -d 2 /path/to/binary

4. 源码分析

这里主要分析shellphuzz、driller、afl部分的代码,主要解释3个工具如何一起工作,符号执行的时机是什么时候等。

4.1 shellphuzz

shellphuzz工具是AFL工具的一层Python接口,可以看做afl的python封装。shellphuzz支持启动afl、添加slave worker、注入或删除测试case,检查性能数据,使用符号执行等。

shellphuzz启动流程:

    if args.driller_workers:
        print "[*] Drilling..."
        drill_extension = driller.LocalCallback(num_workers=args.driller_workers)

    stuck_callback = (
        (lambda f: (grease_extension(f), drill_extension(f))) if drill_extension and grease_extension
        else dri
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值