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 文件的表示:

7062e549fe4377109f8dd0df40fdb230.png

针对结构化的输入,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 进行删除。

83c3db1ee9f9d162b326e27c0484403d.png

smart addition:

在这种方法中,给定一个种子文件 S1,随机选取一个种子文件 S2,在 S2 中随机选取一个 chunk C2,将 C2 插入到 S1 中和 C2 具有相同父节点的 chunk C1 的后面(C1.parent.type ==C2.parent.type)   

54b3ff398eb93f3ae16f4252f5651ae6.png

smart splicing:

这种方法中,对于给定的种子文件 S1,随机选取 chunk C1,随机选取种子文件 S2,找到 S2 中与 C1 类型相同的 chunk C2,将 C2 替换到 C1 的位置上。   

254e4304dcf4176a55a35d040d8f0692.png

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

出现如下界面,说明安装成功。

014b16471fe7ee1f648123362e02e910.png

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 进行编译成功。

b21d98afba6a6075dcf2097d8d00d8bc.png

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 @@

可能会出现如下界面:

7709b0e9e05c0edd6ddbf05c6b9bd0e9.png

按照图片提示,进入 root 用户模式,输入命令即可。

最终运行界面如下图所示:

c343b83a963f99e19d081564b3b6fc69.png

AFLSmart 的测试

在 smart greybox fuzz 文中提到,他们使用 AFLSmart 与 AFL、Peach、AFLfast 对几种具有结构化输入的程序进行测试,结果如下如所示:

388f07d08509953ca1a6ec84d8268e7b.png

由上图可以看出,AFLSmart 在测试 AVI、WAV、JPEG2000 这三种格式时,与其他三种工具相比,优势明显。

*本文作者:红玫瑰与黑玫瑰,转载请注明来自FreeBuf.COM

b17ea1f694ad27b4263e38a39a82a0b8.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android adb 启动APP

目录启动命令一 常规命令 包名/activity二 常规命令 包名命令关闭App获取包名和activity的路径代码获取1 命令获取( 需要app运行在前台&#xff0c;停留在启动界面)2命令获取(先执行命令&#xff0c;再点击app启动)启动命令 一 常规命令 包名/activity adb shell am start…

python语言使用什么语句实现上下文管理协议_Python 上下文管理器

上下文管理器在使用Python编程中&#xff0c;可以会经常碰到这种情况&#xff1a;有一个特殊的语句块&#xff0c;在执行这个语句块之前需要先执行一些准备动作&#xff1b;当语句块执行完成后&#xff0c;需要继续执行一些收尾动作。例如&#xff1a;当需要操作文件或数据库的…

Android日志[基础篇]Android Log日志输出

Android日志[基础篇]二 Android Studio修改LogCat日志的颜色 android.util.Log输出日志的常用方法如下&#xff1a; Log.v(String tag, String msg)Log.d(String tag, String msg)Log.i(String tag, String msg)Log.w(String tag, String msg)Log.e(String tag, String msg) …

python函数应用_python 函数应用

#函数的参数就是个变量#定义函数的时候&#xff0c;使用关键字参数&#xff0c;可以指定默认值def hello(namereboot,age1):return hello %s,your age is %s %(name,age)print hello(reboot,3)print hello(3,reboot)#print hello(age3,namereboot)print hello(reboot)def f(n):…

Android日志[基础篇]二 Android Studio修改LogCat日志的颜色

上一篇提到Android日志的5个级别的日志输出&#xff0c;在logcat里面设置自己喜欢或习惯的颜色&#xff0c;本文不只讲Android Sudio修改logcat的日志颜色。 代码和效果 代码 private void logColor(){Log.v(TAG,"logColor verbose");Log.d(TAG,"logColor de…

readfile函数使用方法_1分钟学会LOOKUP函数,有网友说使用这个方法,初学者秒变大神...

Hi&#xff0c;大家好&#xff0c;本专栏将会从零开始和大家用图文的方式&#xff0c;30天让你从不会到熟练使用函数&#xff0c;0基础开始学习Excel函数&#xff0c;让你喜欢上它&#xff01;有兴趣的小伙伴可以持续关注我&#xff0c;或者在专栏进行查看学习&#xff0c;愿与…

Android JNI Attempt to remove non-JNI local reference, dumping thread

Attempt to remove non-JNI local reference, dumping thread 解决办法&#xff1a; 去除Jni代码 env->DeleteLocalRef(javaObject);注意&#xff1a;是java层传递给jni层的对象不需用了DeleteLocalRef来进行对象删除&#xff0c;jni层创建的对象仍然需要保留代码。 这个…

背景图层和普通图层的区别_图层样式(一)—高级混合选项

一、图层顺序为了便于说明&#xff0c;首先建立例子&#xff0c;新建图层&#xff0c;用画笔随便画个圈&#xff0c;新建蒙版随便画一笔&#xff0c;然后把所有图层样式加给它。可以看到样式从上到下的顺序&#xff0c;这也是它们混合的图层顺序。图层顺序我的效果&#xff0c;…

Android9.0 http网络请求失败问题的处理

目录处理方法(任意一种)&#xff1a;APP改用https请求targetSdkVersion 降到27以下配置network-security-config&#xff08;推荐&#xff09;原因出错案例处理方法(任意一种)&#xff1a; APP改用https请求 这种方式是最佳方法&#xff0c;需要前后端协调&#xff0c;后端得…

代码里无图片地址_项目实战:爬高清图片

↑ 关注 星标 &#xff0c;后台回复【大礼包】送你2TPython自学资料好消息&#xff1a;Python学习交流群&#xff0c;已经建立&#xff0c;猛戳加入之前我发过一些爬虫的文章&#xff0c;不过一直没发过爬取图片的&#xff0c;今天就给大家分享一篇吧&#xff01;/1 前言/上篇…

Android TextView通过SpannableString设置字体、大小、颜色、样式、超级链接

代码应该都能看明白 public class MainActivity extends ActionBarActivity {private TextView tv, tv2;private SpannableString sStr, sStr2;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.act…

winform项目_winform项目——仿QQ即时通讯程序01:原理及项目分析

即时通讯程序&#xff0c;腾讯QQ可以说是一家独大&#xff0c;虽然市场上仍然有类似QQ的即时通讯程序&#xff0c;但是基本上面向的对象都是特定人群。那么&#xff0c;现在做一个即时通讯的软件还有意义吗&#xff1f;在我看来&#xff0c;意义非常大。作为一个学习编程的人&a…

Android面试基础一

Android面试基础二-原理及常见问题 目录1、四大组件1&#xff09;Activity2&#xff09;Service3&#xff09;ContentProvider4&#xff09;Broadcast Receiver2、四大组件的生命周期和简单用法1&#xff09;Activity2&#xff09;Service3&#xff09;BroadcastReceiver4&…

python怎么用大数据分析师_如何七周成为数据分析师18:Python的新手教程

本文是《怎样七周成为数据剖析师》的第十八篇教程&#xff0c;假定想要了解写作初衷&#xff0c;能够先行阅读七周指南。温馨提示&#xff1a;假定您曾经熟习Python&#xff0c;大可不用再看这篇文章&#xff0c;或只选择部分。Python是近年来最火爆的言语&#xff0c;曾经作为…

Android面试基础二-原理及常见问题

Android 面试基础一 目录Android源码相关分析1、Android属性动画实现原理2、补间动画实现原理3、Android各个版本API的区别4、Requestlayout&#xff0c;onlayout&#xff0c;onDraw&#xff0c;DrawChild区别与联系5、invalidate和postInvalidate的区别及使用6、Activity-Wind…

python数据展示库_收藏!盘点很实用的数据科学Python库

数据科学是一门研究数据并从中挖掘信息的学科。它不要求自创或学习新的算法&#xff0c;只需要知道怎么样研究数据并解决问题。这一过程的关键点之一就在于使用合适的库。本文概述了数据科学中常用的、并且有一定重要性的库。在进入正题之前&#xff0c;本文先介绍了解决数据科…

Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录调试中的堆栈轨迹从外部来源打开堆栈轨迹监控剪…

python股票数据分析实验报告_Python实验报告

一、实验原理(要求、任务等)(一)、Python的开发环境Python诞生于20世纪90年代初&#xff0c;是一种解释型、面向对象、动态数据类型的高级程序设计语言&#xff0c;是最受欢迎的程序设计语言之一。编写、编译和运行Python程序有以下3种方法。1.使用交互式解释器2.使用Windows命…

Android日志[进阶篇]一-使用 Logcat 写入和查看日志

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录查看应用日志写入日志消息Logcat 消息格式设置…

哈希表数据结构_算法与数据结构-哈希表

前面我们已经讲到了数组和链表&#xff0c;数组能通过下标 O(1) 访问&#xff0c;但是删除一个中间元素却要移动其他元素&#xff0c;时间 O(n)。 循环双端链表倒是可以在知道一个节点的情况下迅速删除它&#xff0c;但是吧查找又成了 O(n)。难道就没有一种方法可以快速定位和删…