利用AFL进行模糊测试
1 模糊测试概述
1.1 模糊测试概念
模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。它是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。
1.2 模糊测试优势
进行软件漏洞挖掘时,通常有静态分析(Static Analysis)、动态分析(Dynamic Analysis)、符号执行(Symbolic Execution)、模糊测试(Fuzzing)这几种技术手段。
静态分析(Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性等指标的一种代码分析技术。静态分析的速度快,但是误报率高。
动态分析(Dynamic Analysis)是指逐步跟踪程序运行进行的分析。它的准确率很高,但是需要调试人员丰富的知识储备,而且这种调试方法很难进行大规模的程序漏洞挖掘。
符号执行(Symbolic Execution)简单来说,就是试图找到什么输入对应什么样的运行状态,它要去覆盖所有的执行路径。因此,当被分析的程序比较复杂,有很多执行路径时,就会遇到路径爆炸的问题。
模糊测试(Fuzzing)不需要过多的人为参与,也不像动态分析那样要求分析人员有丰富的知识。在模糊测试中,用随机数据攻击一个程序,然后等着观察哪里遭到了破坏。模糊测试的技巧在于,它是不符合常规逻辑的:自动模糊测试不去猜测哪个数据会导致破坏,将尽可能多的杂乱数据投入程序中。从而发现哪些输入能够使程序发生异常,进而分析可能存在的漏洞。当前比较成功的Fuzzer(执行模糊测试的程序)有AFL、libFuzzer、OSS-Fuzz等。
2 AFL工具
2.1 AFL简介
AFL(American Fuzzy Lop)是由安全研究员Michal Zalewski(@lcamtuf)开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。
2.2 AFL工作流程
AFL工作流程大致如下:
- 从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
- 选择一些输入文件,作为初始测试集加入输入队列(queue);
- 将队列中的文件按一定的策略进行“突变”;
- 如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
- 上述过程会一直循环进行,期间触发了crash的文件会被记录下来。
3 模糊测试实验
3.1 测试环境搭建
系统:Ubuntu 20.04
AFL:afl-2.52b
下载AFL源码(https://github.com/google/AFL/),解压后,编译安装。
sudo make
sudo make install
3.2 测试简单例子
3.2.1 编写测试程序
用c语言编写一个测试用例,设置一些BUG和漏洞。
sudo vim easy_test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h> int AFLTest(char *str)
{int len = strlen(str);if(str[0] == 'A' && len == 6){raise(SIGSEGV);//如果输入的字符串的首字符为A并且长度为6,则异常退出}else if(str[0] == 'F' && len == 16){raise(SIGSEGV);//如果输入的字符串的首字符为F并且长度为16,则异常退出}else if(str[0] == 'L' && len == 66){raise(SIGSEGV);//如果输入的字符串的首字符为F并且长度为66,则异常退出}else{printf("it is good!\n");}return 0;
}int main(int argc, char *argv[])
{char buf[100]={0};gets(buf);//存在栈溢出漏洞printf(buf);//存在格式化字符串漏洞AFLTest(buf);return 0;
}
3.2.2 插桩编译
对该源文件(easy_test.c)进行插桩编译(编译插桩是指在代码编译期间修改或新增代码)。
afl-gcc easy_test.c -o easy_test
可以看到在编译过程中,编译器已经提示存在漏洞,不理会,用AFL去测试。
3.2.3 开始fuzz
从stdin读取输入的目标程序,语法如下:
./afl-fuzz -i testcase_dir -o findings_dir /path/to/program […params…]
从文件读取输入的目标程序来说,语法如下:
./afl-fuzz -i testcase_dir -o findings_dir /path/to/program @@
因此需要给程序设置testcase_dir和findings_dir两个文件夹,以及在testcase_dir中存放一些测试用例testcase。
mkdir fuzz_in
mkdir fuzz_out
cd fuzz_in
vim testcase
testcase中的输入可以随意写下(例如:aaa),接着就可以进行fuzz了。
afl-fuzz -i fuzz_in -o fuzz_out ./easy_test
3.2.4 结果分析
经过5分钟的fuzz,共找到了7个crash,可以在fuzz_out中查看详情。
第1个crash:发现符合首字符为A且字符串长度为6的异常退出情况
第2个crash:发现符合栈溢出漏洞的crash情况
第3个crash:发现符合栈溢出漏洞的crash情况
第4个crash:发现符合栈溢出漏洞的crash情况
第5个crash:发现符合栈溢出漏洞的crash情况
第6个crash:发现符合首字符为L且字符串长度为66的异常退出情况
第7个crash:发现符合格式化字符串的%任意地址写入的漏洞情况
3.3 测试开源程序w3m
3.3.1 w3m介绍
w3m是一个基于文本的网页浏览器,支持多种操作系统,在命令行终端可以很好的支持中文。即使在没有鼠标支持的情况下也可以检查网页的输出。w3m可以处理表、Cookie、身份验证以及除 JavaScript 以外的几乎所有内容。下图为用w3m访问www.qq.com。
该项目在GitHub上开源,https://github.com/tats/w3m,目前有300多个star,最近的一次代码更新在几天前,表明该项目一直在维护中。
3.3.2 fuzz前序工作
下载源码
git clone https://github.com/tats/w3m.git
cd w3m
./configure CC="afl-gcc" CXX="afl-g++"
配置生成Makefile,出现报错configure: error: gc.h not found,提示缺少gc.h
查阅资料后发现,需要安装gc,解决方案如下:
- 下载gc-7.2.tar.gz后,解压
- 配置生成Makefile
cd gc-7.2
./configure
- 安装gc
make
sudo make install
重新对w3m进行配置后,能成功生成Makefile。
./configure CC="afl-gcc" CXX="afl-g++"
3.3.3 插桩编译
查看Makefile,可以看到编译器为afl-gcc和afl-g++后,确认无误后,执行编译。
gedit Makefile
make
3.3.4 开始fuzz
设置in和out文件夹,由于w3m是一款命令行浏览器,因此我们可以收集一些html文件放入in文件夹中作为测试用例。
由于是输入为文件,因此fuzz的命令如下:
afl-fuzz -i in -o out ./w3m @@
进行了一个多小时的fuzz,没有触发crash。原因可能是软件维护的比较好,bug较少,不容易找到。
3.4 总结
本文主要对模糊测试进行了熟悉运用,依靠AFL工具完成了对简单例子的fuzz和对开源程序w3m的fuzz,并对简单例子中发现的crash进行了分析,了解报错的原因。经过实验,了解了利用AFL进行模糊测试的大概过程:①插桩编译;②设置种子测试用例;③开始fuzz。模糊测试对于软件测试的帮助很大,其不受限于被测系统的内部实现细节和复杂程度,例如,使用模糊测试可以不用关心被测对象的实现语言等细节,因此即使是并不怎么熟悉代码内部结构的程序员也能完成测试。但是若模糊器是以穷举方式产生各种可能的数据组合,则被测目标程序响应的检测时间将急剧增长,这使得检测费力且耗时。总之,模糊测试是一项用于验证程序中真实错误的重要工具,也是所有意识到安全性问题且着力于程序健壮性的程序员们的工具箱中所必备的工具。
利用AFL进行模糊测试相关推荐
- 【软件与系统安全】AFL模糊测试实验
软件与系统安全 - AFL 模糊测试实验 软件与系统安全的作业,写得不尽详尽,仍有问题未解决,欢迎反馈 对 Coreutils 软件集合使用 AFL 进行模糊测试,撰写测试报告 在报告中详述: (1) ...
- 笔记整理-信息系统开发基础-软件测试-模糊测试
模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法. 在模糊测试中,用随机坏数据(也称做fuzz)攻击一个程序,然后等着观察哪里遭到了破坏.模糊测试的技 ...
- 2021年软件测试工具总结——模糊测试工具
~ 什么是模糊测试?~ 模糊测试(Fuzz Testing)是一种自动化的软件测试技术,最初是由威斯康辛大学的巴顿·米勒于1989年开发的,通常用于识别程序中的潜在漏洞.模糊测试的核心是自动或半自动的 ...
- 模糊测试入门案例,利用AFL和Honggfuzz模糊测试Tiff
1.AFL模糊测试tiff AFL的安装已经在前文记录过American Fuzzy Lop(AFL)的安装与简单使用,不再赘述.这里主要记录一下在使用AFL时的可以注意的点. 最好选择由C或者C++ ...
- linux 符号执行,[原创]符号执行Symcc与模糊测试AFL结合实践
上个月末无聊的划水时间段内,在推上看到有人发了一篇关于如何结合去年新发布的符号执行Symcc与模糊测试引擎AFL,以提升Fuzz效率的视频贴.打开这个链接后才发现是个卖课的,emmm.... , 看价 ...
- 经典 Fuzzer 工具 AFL 模糊测试指南
AFL(American Fuzzy Lop)是由安全研究员Michał Zalewski 开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具.通过记录输入样本的代码覆盖率,不断对 ...
- 模糊测试-AFL学习笔记之C/C++
目录 简介 文档 QuickStartGuide README perf_tips.txt status_screen INSTALL 安装 下载 编译 检查 例子 有源码-标准输入 源代码 编译 f ...
- 在Linux上使用AFL对Stagefright进行模糊测试
前言 模糊测试是一种自动向程序传递输入数据并监控其输出的自动化测试技术.通过这种技术,安全人员可以测试程序的可靠性以及识别潜在的安全漏洞. 我们(360成都安全响应中心)将对Stagefright M ...
- AFL (American fuzzy lop) 二进制程序模糊测试工具学习
AFL 前言 AFL的安装 AFL运行界面介绍 AFL执行阶段介绍 fuzzing -- 有源码的程序 fuzzing -- 无源码的程序 总结 前言 在学习了一段时间的pwn后,我个人对漏洞挖掘 ...
最新文章
- Sql — CTE公用表表达式和With用法总结
- C++shortest common supersequence最短公共超序列算法的实现(附完整源码)
- 一步步编写操作系统 37 一级页表与虚拟地址2
- 【HTML+CSS网页设计与布局 从入门到精通】第15章-表格格式:边距/居中/边框/折叠
- linux下搭建博客day4注册git账号
- 9ztu.com 就找图商品图片商品条码搜索引擎
- Redis学习笔记(二) Redis 数据类型
- 费曼:“只要我不能创造的,我就还不理解”
- 欧陆词典牛津高阶英汉双解词典(第9版)_V2.0层叠样式示意:
- amd编码器 hevc_HEVC/H.265硬件编码器实现杂谈
- 吴恩达:还没有人能完全理解人工智能,包括谷歌和百度
- OpenCV-Python 中文教程
- 仿微信朋友圈图片和视频播放
- python编程控制机器人_python程序控制NAO机器人行走
- 初学单片机:Proteus 8 和 keil 4的使用方法(Proteus 8 和 keil 4建立一个项目/文件)
- java制作SM2证书
- 《C#高级编程》读书笔记
- 通俗理解面向对象和面向过程+编程思想
- Yann LeCun,牛人也!
- 什么是极坐标方程 极坐标做画图 rd​原理; 弧长积分公式 极坐标弧积分 极坐标面积积分公式 极坐标与直角坐标的转化 如何将直角坐标方程Y=X转化成极坐标