work节点使用外部包_AFLSmart工具简单分析及使用介绍
AFLSmart 是一个在 AFL 基础上,结合了 Peach 的结构化输入组件的灰盒 smart fuzz 工具。
AFLSmart 链接:https://github.com/aflsmart/aflsmart
参考资料:《Smart Greybox Fuzzing》
什么是 AFLSmart
灰盒 smart fuzz
灰盒测试是基于程序运行时刻的外部表现同时又结合程序内部逻辑结构来设计用例,执行程序并采集程序路径执行信息和外部用户接口结果的测试技术。
具有结果反馈功能的模糊测试即属于灰盒 fuzz,如 AFL,会对待测程序进行插装,从而监控每个输入的路径覆盖率,为下一次选择输入文件进行变异提供依据。
smart fuzz 是面向具有高度结构化输入(如,PPT,mp3,PDF 等)的程序进行测试的一类模糊测试工具,典型的 smart fuzz 工具如 Peach。使用 Peach 的关键在于名为「Peach Pit」的 xml 配置文件。「Peach Pit」主要包含了文件的数据信息。
AFLSmart
AFLSmart 在 AFL 的基础上,参照了 Peach 的 File Cracker 组件,将文件按 chunk 划分,抽象为一个可以用 xml 文件描述的树形的结构,如下图为一个 wav 格式的文件抽象为 xml 文件的表示:
针对结构化的输入,AFL 提供了基于字典的方法进行解决,然而该方法的缺陷在于,在变异的时候,仍然处于 bit 级别的变异,AFL 无法对一个文件块进行增加和删除操作。
AFLSmart 源码中,对 chunk 结构的定义如下:
struct chunk { unsigned long id; /* The id of the chunk, which either equals its pointer value or, when loaded from chunks file, equals to the hashcode of its chunk identifer string casted to unsigned long. */ int type; /* The hashcode of the chunk type. */ int start_byte; /* The start byte, negative if unknown. */ int end_byte; /* The last byte, negative if unknown. */ char modifiable; /* The modifiable flag. */ struct chunk *next; /* The next sibling child. */ struct chunk *children; /* The children chunks linked list. */};
一个 chunk 结构里定义了 chunk 的类型、开始位置、结束位置、表示是否被修改的标志位、以及 chunk 的子节点和 next 节点。
在 AFL 的 bit 级别的变异的基础上,AFLSmart 增加了对 chunk 级别的变异操作,主要包括三种操作:
smart deletion:
在这种方法中,会对给定的种子文件,随机选取 chunk 进行删除。
smart addition:
在这种方法中,给定一个种子文件 S1,随机选取一个种子文件 S2,在 S2 中随机选取一个 chunk C2,将 C2 插入到 S1 中和 C2 具有相同父节点的 chunk C1 的后面(C1.parent.type ==C2.parent.type)
smart splicing:
这种方法中,对于给定的种子文件 S1,随机选取 chunk C1,随机选取种子文件 S2,找到 S2 中与 C1 类型相同的 chunk C2,将 C2 替换到 C1 的位置上。
AFLSmart 的安装
1. 安装 automake 及一些其他的包
sudo apt-get install build-essential automake libtool libc6-dev-i386 python-pip g++-multilib
2. 安装 mono 包,为了在 Linux 上支持 C#
sudo apt-get install mono-complete
3. 安装 gcc-4.4 以及 g++-4.4,(Peach 中的 Pin 组件在更高的 gcc 版本中会发生一些编译问题)
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt install gcc-4.4 sudo apt install g++-4.4
如成功,则直接看第四步,如不能成功,可尝试以下命令
sudo gedit /etc/apt/sources.list
向文件中添加如下内容:
deb http://dk.archive.ubuntu.com/ubuntu/ trusty main universe
然后安装
sudo apt-get update sudo apt install gcc-4.4 sudo apt install g++-4.4
4. 环境成功准备好后,开始 AFLSmart 的安装
git clone https://github.com/aflsmart/aflsmart cd aflsmart make clean all cd .. export AFLSMART=$(pwd)/aflsmart export WORKDIR=$(pwd)
5. 修改 Peach 的版本
cd $AFLSMART wget https://sourceforge.net/projects/peachfuzz/files/Peach/3.0/peach-3.0.202-source.zip unzip peach-3.0.202-source.zip patch -p1 < peach-3.0.202.patch cd peach-3.0.202-source CC=gcc-4.4 CXX=g++-4.4 ./waf configure CC=gcc-4.4 CXX=g++-4.4 ./waf install
6. 设置 PATH 的环境变量
export PATH=$PATH:$AFLSMART:$AFLSMART/peach-3.0.202-source/output/linux_x86_64_debug/bin export AFL_PATH=$AFLSMART export LD_LIBRARY_PATH=/usr/local/lib
7. 进入到 AFLSmart 目录,输入
./afl-fuzz
出现如下界面,说明安装成功。
AFLSmart 的使用
熟悉 AFL 的朋友,对于 AFLSmart 的使用应该不会太陌生,AFlSmart 的使用方法与 AFL 基本一致。这里还是以 tcpdump 为例,对 AFLSmart 的使用进行一个简单的介绍。
测试 tcpdump 之前,首先应该下载 tcpdump 源码包,下载地址:http://www.tcpdump.org/,在这个地址,下载 tcpdump 包与 libpcap 包。
下载 tcpdump 的一些其他依赖包:下载 bison 包,下载地址:ftp.gnu.org/gnu/bison, 下载 m4 包,下载地址:ftp.gnu.org/gnu/m4/。
1. 安装 libpcap:
tar -zxvf libpcap-1.3.0.tar.gz cd libpcap-1.3.0 ./configure make make install
2. 输入命令,安装 flex
sudo apt-get install flex
3.bison 与 m4 包的安装步骤与 libpcap 的相同,参照上述命令即可。
4. 使用 afl-gcc 对 tcpdump 进行编译,afl-gcc 会在对 tcpdump 进行编译时,对 tcpdump 进行插桩,从而方便监控用例的路径覆盖情况。命令如下:
tar -zxvf tcpdump-4.3.0.tar.gz cd tcpdump-4.3.0 CC=./aflsmart 安装目录/afl-gcc ./configure make clean all make install
编译过程中,出现如下界面,说明使用 afl-gcc 对 tcpdump 进行编译成功。
tcpdump 的命令格式如下:
tcpdump [ -adeflnNOpqRStuvxX ] [ -c 数量 ] [ -C 文档尺寸 ] [ -F 文档名 ] [ -i 网络接口 ] [ -m 文档名 ] [ -r 文档名 ] [ -s 长度 ] [ -T 类型 ] [ -w 文档名 ] [ -E algo:secret ] [ 表达式 ]
tcpdump 常用命令行选项:
-a 将网络地址和广播地址转变成容易识别的名字
-d 将已截获的数据包的代码以人容易理解的格式输出;
-dd 将已截获的数据包的代码以 C 程式的格式输出;
-ddd 将已截获的数据包的代码以十进制格式输出;
-e 输出数据链路层的头部信息;
-f 将 internet 地址以数字形式输出;
-l 将标准输出变为行缓冲方式;
-n 不将网络地址转换成易识别的主机名,只以数字形式列出主机地址 (如 IP 地址),这样能够避免 DNS 查询;
-t 不输出时间戳;
-v 输出较周详的信息,例如 IP 包中的 TTL 和服务类型信息;
-vv 输出详尽的报文信息;
-c 在捕获指定个数的数据包后退出;
-F 从指定的文档中读取过滤规则,忽略命令行中指定的其他过滤规则;
-i 指定监听的网络接口;
-r 从指定的文档中读取数据包 (该文档一般通过-w 选项产生);
-w 将截获的数据包直接写入指定的文档中,不对其进行分析和输出;
-T 将截获的数据包直接解释为指定类型的报文,现在支持的类型有 cnfp、rpc、rtp、snmp、vat 和 wb。
接下来,我们将使用 AFLsmart 对 tcpdump 的 -nr 功能进行测试,该参数的作用是从指定的文档中读取数据包。
6. 收集测试用例。我们需要 pcap 格式的输入,对 tcpdump 的-nr 功能进行测试。在 tcpdump 源码包中有一个 tests 文件夹,包含了许多我们测试所需的 pcap 文件。这里,我们直接使用这些 pcap 文件进行测试。
新建一个 tcpdumptest 文件夹,方便测试。将 testes 文件夹复制过来,只保留 pcap 的数据。
cd tcpdumptestmkdir incd testscp *.pcap ../incd ..rm -f tests
AFL 中还有一些对数据进行处理的工具,可以对输入数据进行覆盖率分析等,压缩输入文件的大小,从而提高测试的效率。如 afl-tmin、afl-cmin。网上已有许多介绍 AFL 的文章了,这里对这些工具就不重复介绍了。
你可以使用这些工具对 pcap 包进行一个处理,也可以不处理,直接使用它们进行测试。
7. 测试 tcpdump
输入命令:
cd aflsmart ./afl-fuzz -i ../testaflsmart/tcpdump/in/ -o ../testaflsmart/tcpdump/out/ tcpdump -nr @@
可能会出现如下界面:
按照图片提示,进入 root 用户模式,输入命令即可。
最终运行界面如下图所示:
AFLSmart 的测试
在 smart greybox fuzz 文中提到,他们使用 AFLSmart 与 AFL、Peach、AFLfast 对几种具有结构化输入的程序进行测试,结果如下如所示:
由上图可以看出,AFLSmart 在测试 AVI、WAV、JPEG2000 这三种格式时,与其他三种工具相比,优势明显。
*本文作者:红玫瑰与黑玫瑰,转载请注明来自FreeBuf.COM
work节点使用外部包_AFLSmart工具简单分析及使用介绍相关推荐
- Angular 个人深究(五)【外部包引用 Leaflet 简单实用】
2019独角兽企业重金招聘Python工程师标准>>> Leaflet 使用 最近在Angular项目中,用到了地图,由于种种原因放弃了百度地图api使用,最后选择了leaflet, ...
- 【MySQL】【高可用】从masterha_master_switch工具简单分析MHA的切换逻辑
简介:masterha_master_switch作为一个切换工具被集成在MHA程序包中, 安装:编译安装MHA manager后会在/usr/local/bin/中生成二进制可执行程序masterh ...
- 1.大数据工具简单分析天猫年底月销量
1.引言 在线上交易早已成熟的今天,电商交易量究竟有多少?为了清晰地比较天猫月销量,本文爬取了天猫2017年底.2018年初主流分类商品大量数据,并做了简单的数据统计.整体流程如下: 说明:利用scr ...
- Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析
Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析 本文主要介绍WebRTC中丢包重传NACK的实现,作者:weizhenwei ,文章最早发表 ...
- golang中的包管理工具——govendor和godep简单学习
为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...
- pip包管理工具-install执行流程简单查看
pip概述 pip是python提供的包管理工具,该工具提供了对python包的查找.下载.安装与卸载等功能的工具,当前是python中比较主流的管理工具. pip下载安装包的概述 pip工具的本质通 ...
- python导入外部包_您会喜欢的10个外部Python软件包
python导入外部包 by Adam Goldschmidt 亚当·戈德施密特(Adam Goldschmidt) 您会喜欢的10个外部Python软件包 (10 External Python p ...
- 《Go语言圣经》学习笔记 第十章 包和工具
<Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...
- 模块和包管理工具npm
模块和包管理工具npm 什么是模块化 模块化的优点 模块化规范 nodejs中模块的分类 加载模块用require方法 模块作用域 向外共享模块作用域中的成员 require()模块时,得到的永远是m ...
最新文章
- java实体外键_如何在JPA中添加用户实体和好友关系实体的外键
- 解密首批人工智能国家队 BAT都在【附下载】
- 03:Poor Herobrine 直接插入排序
- 小森生活一直服务器维护,《小森生活》怎么处理断线黑屏的问题 连接不上服务器解决办法...
- Excel制作带勾的方框
- Qt5.9生成dll详细步骤
- 新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
- JPA中的@MappedSuperclass
- Win7图片查看器打印不了图片怎么办
- 云图说 | 分布式缓存服务DCS—站在开源Redis前辈的肩膀上,扬帆起航
- 继开源之后 红帽打算把它当成新增长点
- antdesignpro 重定向到登录页面_Bluehost 域名解析和 301 重定向设置
- 可做fft分析吗_2020速卖通还要做吗?速卖通2020年市场分析!
- 小程序30分钟倒计时
- 【win+黑苹果双系统②】黑苹果设置开机启动+wifi
- 键盘左右键改变css样式_CSS上的3D键盘键| 现在是现实
- 根据经纬度获取地理位置
- phpwind 安装教程图文说明
- 百度离破产只有30天
- 智鼎在线测评行测题记录
热门文章
- ajax的模式_AJAX的完整形式是什么?
- ipv6寻址_什么是IPV4寻址?
- tohexstring方法_Java Long类toHexString()方法的示例
- c++ stl stack_C ++ STL中的stack :: push()函数
- 第 5-1 课:线程与死锁 + 面试题
- oracle 查看用户、权限、角色
- 执行后可以查看python的版本的是_windows肿么查看python opencv 版本
- pyHook pyHook3 区别_一般过去时态和现在完成时态之间到底有什么区别?通过一道语法题,帮你彻底讲清楚!...
- easyexcel安全扫描报php,easyExcel使用以及踩过的坑
- android 换行乱_Android自动换行布局