未加星标

Vuzzer自动漏洞挖掘工具简单分析附使用介绍

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏
*本文原创作者:vickylzy,本文属CodeSec原创奖励计划,未经许可禁止转载

Vuzzer 是由计算机科学机构 Vrije Universiteit Amsterdam、Amsterdam Department of Informatics 以及 International Institute of Information Technology, Hyderabad 共同开发的工具。

项目来源 : https://github.com/vusec/vuzzer

参考资料 :《VUzzer: Application-aware Evolutionary Fuzzing》

VUzzer 是什么? 为何选择 VUzzer

自动漏洞测试技术当前主要为基于fuzzing的有结果反馈能力的AFL与使用符号执行的driller等。

符号执行(symbolic execution)的一大优势在于发现尽可能多的路径,实现高覆盖率,但其消耗大量运行空间的方式使其难以扩展,而vuzzer能在不使用符号执行的情况下,对AFL效率进行大幅的提升。

VUzzer使用应用感知的”智能“变异策略――基于数据流和控制流,使用轻量静态分析与动态分析,通过结果反馈和优化输入的生成过程以求产生更优秀更少的测试输入,达到加快挖掘效率,增加挖掘深度的目的。

案例

用以下简单的情况进行对比

...
read(fd,buf,size);
if(buf[5] == 0xD8 && buf[4] == 0xFF){
//在汇编代码中以CMP形式出现,同时应注意其检查顺序
if(...)
//if的嵌套
...some useful code containg bug...
}else{
...
EXIT_ERROR("Invalid file\n");
} 输入buf中的buf[4],buf[5]包含着tainted data。

对于工具AFL―-对程序进行黑盒测试的fuzzer:

1.必须通过变异输入完全猜对两字节为FFD8才能进入深层代码

2.必须找对该在buf[4],buf[5]的位置进行变异

3.作为一基于覆盖率的fuzzer,AFL追求发现新路径,当AFL没能通过if而进入了else,对其来说仍然发现了新路径,将会以这个进入else的输入作为新的反馈。可能致使AFL过分轻视if分支,这种情况在嵌套判断语句中会更加明显。

这将会使fuzzer浪费大量时间与运算资源,在else和其下的错误处理中。

而对于VUzzer:

1.在静态分析阶段,vuzzer会通过在程序的汇编码中寻找cmp指令集相关命令,将if语句中的判断值提取出来存储在Lcmp当中,找到这些magic bytes值是什么(如 FFD8)

2.而在动态分析中,通过不断迭代,将Lcmp 与取地址值类操作Llea中信息与种子文件输入和新生成输入进行类型匹配等,找到这些magic bytes在输入中的可能位置,更精准的进行变异

3.而对于嵌套判断语句引起的深度代码不易发现的问题,VUzzer的基本块(Basic Block)权重管理将会很好的解决这个问题


Vuzzer自动漏洞挖掘工具简单分析附使用介绍

对于应用反汇编后,汇编码中的每一个基本块(Basic Block),都有一个权重值,由于VUzzer追求更深层的代码,所以对可能执行到概率越小的块,他的权重值要更高,若从main到达块A的概率为P,其权重就为1/p。

但如何做到这一点?

以上图为例如果说有main开始,那么执行到main的概率就是1,main后有两个可能方向,那么就划分两者概率均为0.5,依次向下。

例如$H{概率}=E*0.5+P{外来}(0.5)*0.5=0.5$

则$H{权重}=1/H{概率}=2$

例图中蓝线所表示为F块触发概率为0.25,权重为倒数4

特别的,对于很小可能含有bug的错误处理块其权重为1(通过动态分析才能发现错误处理块)

由此有了,解决深层代码被隐藏的方法。

VUzzer 概述
Vuzzer自动漏洞挖掘工具简单分析附使用介绍

vuzzer顶层图(具体术语参见下表)


Vuzzer自动漏洞挖掘工具简单分析附使用介绍

静态分析阶段

1).在汇编码中进行,找出基本块,计算块权重并将块重量存入 LBB

2).扫描编码中的cmp指令相关的立即数,存入 Limm (包含如上文中的0xFF,0xD8等)

动态分析阶段― 每一loop为一代

1).对种子文件(使用者提供的基础输入)进行DTA分析,捕获输入中的共同特征,以期找到magic bytes的位置与错误处理块,使新产生的孩子测试输入,不会陷于外围的判断和出错处理

2).对于发现了新的基本块的输入用例,进行DTA分析,追踪输入的值在程序中的运行,监测数据流特征,以推断输入的结构

3).适应度计算

适应度是对每一个输入而言的,适应度越高,代表其可进入更多的块,更深的块(权重更大的块),是更有价值的输入。


Vuzzer自动漏洞挖掘工具简单分析附使用介绍

再结合此图,对于每一个输入,运行中必会通过一条路径,输入A的适应度就是改路径所经过块的权重和

例如路径1(红色)2(蓝色):

$p1=A-B-D-E-H-J=1+1+2+2+2-1=7$

$p2=A-B-D-E-F-J=1+1+2+2+4-1=9$

$适应度{P2}>适应度{P1}$

输入2将更被看重,更多的参与到生成下一代去,具体做法是将输入按适应度呈顺序排列存入 Lfit ,再选取使用时,使用前n%的做法

4).生成下一代

其变异来源是被称为vuzzer下的 ROOT set 的输入集合,其中包含种子文件,tainted input, Lfit 中的前n%。


Vuzzer自动漏洞挖掘工具简单分析附使用介绍

典型的子测试用例演化算法

vuzzer采用典型演化算法步骤并优化

INITIALIZE population with seed inputs
repeat
SELECT1 parents
RECOMBINE parents to generate children
MUTATE parents/children
EVALUATE new candidates with FITNESS function
SELECT2 fittest candidates for the next population
until TERMINATION CONDITION is met //迭代次数超过限制 或 触发crash
return BEST Solution

| 变异策略 | 具体步骤 || ― | ―――――- || 交叉 | 取一个偏移量,而后使两半互换 || 删去 | 删除字节 || 替换与插入 | 在特定的位置改变或插入特定的字节 |

特定的字节,是通过从程序的汇编码中cmp指令集族的代码中取出立即数置入 Limm ,并从 Limm 中取出。生成为不同长度的新字节串得到的

特定的位置,是通过从父测试用例集中,寻找其偏移量,并在此之上变异引起的

产生孩子测试用例后由此再进行一轮,在达到迭代上限或发现bug前,循环往复

vuzzer安装

这里结合 官方安装说明 进行讲解:

需求条件:

环境:

32位linux系统,因vuzzer作者声明仅在 Ubuntu14.04 版本中完成测试,所以建议使用该版本系统。

vuzzer_github 在本地目录准备源码

$ git clone https://github.com/vusec/vuzzer

A C++11 compiler and Unix build utilities (e.g. GNU Make).

gcc4.8开始默认支持c++11

Ubuntu14.04当前自带版本为4.8.*的gcc,g++,支持c++11。

通过以下命令可以检查当前版本

$ gcc version

$ g++ version

若不合适可通过过以下命令安装该版本

$ sudo apt-get install gcc-4.8

$ sudo apt-get install g++-4.8

A recent (>=2.13) version of Intel Pin. The framework must be present in directory pin inside the VUzzer top directory. 准备Intel Pin。

PIN的下载可以通过以下两个方法:

(1).(推荐)使用vuzzer自带pin配置脚本,自动下载合适版本pin并配置,在vuzzer根目录输入以下命令,使用此方法pin会被下载至vuzzer/support/

make -C support -f makefile.pin


Vuzzer自动漏洞挖掘工具简单分析附使用介绍

(2) . 在官方网站 Pin A Binary Instrumentation Tool 下载合适版本pin工具(查看release note寻找对应版本)

后在vuzzer目录下建立一个到pin的链接:

$ cd vuzzer

$ ln -s /path-to-pin-home pin 其中/path-to-pin-home是Pin的根目录,不是可执行文件


Vuzzer自动漏洞挖掘工具简单分析附使用介绍

python 2.7 for converting raw provenance to PROV format in Turtle syntax.

Ubuntu14.04带有python2.7

通过以下命令检查

$ python version

如果未安装执行以下命令安装

$ sudo apt-get install python-2.7

EWAGBoolArray: To install it in your system just copy headers file into /usr/include folder

完成该步骤仅需将指定头文件下载放置到/usr/include目录下

具体为下载headers file所指向链接下4个.h格式文件。

后通过以下命令拷贝头文件,其中 headers 为包含4个头文件的文件夹

$ sudo cp headers/* /usr/include/

BitMagic : To install it in your system do

输入该命令安装BitMagic

$ sudo apt-get install bmagic

A suitable version of the modified libdft typically the latest available. This must be placed in directory support/libdft

要求修改过的libdft,在当前vuzzer目录的support下已有该版本,已准备好编译,无需操作

BitVector module for python.点击bitvector下载

官方网站: https://engineering.purdue.edu/kak/dist/BitVector-2.2.html

安装通过以下命令:在解压后的BitVector目录下

$ sudo python setup.py install


Vuzzer自动漏洞挖掘工具简单分析附使用介绍

环境准备结束

安装

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

分页:12
转载请注明
本文标题:Vuzzer自动漏洞挖掘工具简单分析附使用介绍
本站链接:http://www.codesec.net/view/561380.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(17)