【论文分享】Dowser: a guided fuzzer to find buffer overflow vulnerabilities

这篇论文是Usenix 2013的一篇文章,主要是一个检测缓冲区溢出漏洞的工作。
复旦白泽战队也对这一文章作过解读:https://www.jianshu.com/p/cf0c71f7d625

简介

Dowser是一个导向的模糊测试工具,其结合了污点追踪、程序分析和符号执行去找到程序逻辑里的缓冲区溢出漏洞。很显然,复杂的指针运算比数组访问更容易触发内存错误。更重要的是,越复杂的漏洞其指针运算也就越复杂。这就导致使用现有的随机模糊测试和静态分析很难找到复杂的bug。

Dowser根据指针的复杂性对指针解引用指令进行排序,然后使用符号执行去定位到最有趣的操作去。定位单独的操作需要Dowser去减少搜索空间。与其去追求代码覆盖率,符号执行模块使用一种新的算法去最大化指针的覆盖率。我们控制在某些很有可能操作指针值的分支上去控制程序的执行。结果,Dowser找到了真实程序里很深的bug。而且,比其他工具要快。

背景

  • 缓冲区溢出漏洞很严重,而且一时半会没办法全部弄没。
  • 解决这个问题有两个办法,一个是运行时保护,一个是发布软件前检测出漏洞并修复。厂商一般喜欢后者。
  • 检测漏洞的方法很多,但都存在一些缺点。黑盒模糊测试很快速很流行,但是会丢失掉一些路径以及许多bug。符号执行太慢又不好扩展。同时,基于代码覆盖率的模糊测试并不能找到可能存在bug的复杂路径,而是更多地去遍历单一的基本块。

方法

  1. 首先对目标程序进行数据流分析,然后对所有循环内的访问buffer的指令进行排序。排序是基于复杂度来排序,就比如下面这个。

在这里插入图片描述
2. 挑选权值高的访问,选择输入来访问buffer。然后使用污点分析去确定哪个输入字节影响了候选指令的解引用。就比如下面的三个输入ABC,只有输入B到达了那个复杂的内存访问操作。
在这里插入图片描述

  1. 用符号执行去触发程序中的溢出。再详细点就是,符号执行包含候选指令的循环,并只将相关的字节设为符号化。
  2. 最后,检测可能发生的溢出。使用谷歌的AddressSanitizer对程序进行茶庄,来确保内存访问指令不会读或写不应该访问的区域(Red Zones)。
    在这里插入图片描述

结果

最后的实验结果如下,能检测出已知漏洞,也能发现未知漏洞,并且运行时间很快。
在这里插入图片描述

总结

感觉这篇文章基本上把能用的技术都用上了,包括静态分析、符号执行、模糊测试、污点分析等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值