afl-fuzz技术初探

afl-fuzz技术初探

转载请注明出处:http://www.cnblogs.com/WangAoBo/p/8280352.html

参考了:

http://pwn4.fun/2017/09/21/AFL%E6%8A%80%E6%9C%AF%E4%BB%8B%E7%BB%8D/

http://blog.csdn.net/youkawa/article/details/45696317

https://stfpeak.github.io/2017/06/12/AFL-Cautions/

http://blog.csdn.net/abcdyzhang/article/details/53487683

在计算机领域,Fuzz Testing(模糊测试)是一种很有效的测试方法,主要原理为构造一系列“坏”数据传入应用程序,通过判断程序是否发生异常发现和检测潜在的bug.而在安全领域引入fuzz技术,无疑可以使安全研究员效率倍增,更有效的挖掘和防护漏洞。

AFL(American Fuzzy Lop)是目前最高级的Fuzzing测试工具之一,由lcamtu开发.当需要测试的程序有源码时,AFL通过对源码重新编译时插桩(插入分析代码)的方法来探测程序内部的执行路径.相对于其他fuzzer,AFL-Fuzz具有更低的性能消耗,更有效的fuzzing策略和tricks最小化技巧,只需简单的配置即可处理复杂的程序.当然,对于没有源码的可执行程序,AFL也可进行处理,但需要QEUM模拟器的支持.

本次实验将介绍AFL的安装和使用方法,以有源码的upx为例进行展示,也会简要介绍AFL处理无源码程序的情况.

安装afl

听学长介绍,afl会烧ssd,不建议在本地安装

  • 解压并安装:

bash $make $sudo make all

如果不报错,则afl-fuzz就安装成功了

有源码的afl-fuzz

这里以fuzz upx为例进行测试

编译upx

$git clone https://github.com/upx/upx.git
$cd upx
$vim Makefile
CC = /usr/local/bin/afl-gcc #添加此句

$cd src
$vim Makefile
CXX    ?= /usr/local/bin/afl-g++ #将CXX改成afl-g++

通过upx的文档,还需要安装三个库:

安装lzma-sdk

$git submodule update --init --recursive

安装ucl

  • 编译:

bash $cd ucl-1.03 $./configure $make $sudo make install

bash $export UPX_UCCLDIR="~/ucl-1.03"

安装zlib

  $wget http://pkgs.fedoraproject.org/repo/pkgs/zlib/zlib-1.2.11.tar.xz/sha512/b7f50ada138c7f93eb7eb1631efccd1d9f03a5e77b6c13c8b757017b2d462e19d2d3e01c50fad60a4ae1bc86d431f6f94c72c11ff410c25121e571953017cb67/zlib-1.2.11.tar.xz

  $cd zlib-1.2.11/
  $./configure
  $sudo make install

编译upx

$cd ~/upx
$make all

若没有报错,则编译成功

此时可在/src目录下找到upx.out文件

对upx进行fuzz测试

$cd ~
$mkdir afl_in afl_out
afl_in存放测试用例,afl_out存放fuzz结果
$cp /usr/bin/file afl_in
$afl-fuzz -i afl_in -o afl_out ~/upx/src/upx.out @@
@@会代替测试样本,即相当于执行了upx.out file

AFL运行界面:

运行结果与分析

可以看出,在短短的十几分钟内,已经跑出了6个crash,安全从业者可以通过分析afl_out中的文件得到更多信息,可以看出使用afl-fuzz比起人工审查效率有了极大地提高

对于从stdin获取输入的程序,可以使用

# afl-fuzz -i afl_in -o afl_out ./file

无源码的afl-fuzz

对无源码的程序进行fuzz一般有两种方法:

  1. 对二进制文件进行插桩
  2. 使用-n选项进行传统的fuzz测试

这里主要介绍第一种,该方法是通过afl-qemu实现的.

编译afl版的qemu

$ cd qemu_mode
$ ./build_qemu_support.sh

在编译时,可能会遇到以下的报错:

报错信息都比较明显,安装相应的库即可

若遇到glib2丢失,可以

$sudo apt-get install libglib2*

对readelf进行fuzz

以readelf为例

$mkdir afl_in afl_out
$cp test afl_in
test为自己准备的测试elf
$sudo cp /usr/bin/readelf .
$afl_fuzz -i afl_in -o afl_out -Q readelf -a @@

如下图,已经开始fuzz了:

本篇博文只对afl-fuzz的基本操作做了介绍,更多的高级用法还待以后探索

原文地址:https://www.cnblogs.com/WangAoBo/p/8280352.html

时间: 2024-11-08 11:31:56

afl-fuzz技术初探的相关文章

网页三维地图技术初探

根据是否需要加载地图服务器中的资源将网页三维地图技术分为两大类: 一.需要服务器配合的 1.cesiumjs    网址:http://www.cesiumjs.org 许可证:Apache 2.0 license 可以在调整经纬度,但是不能调整人眼的视角,也就是地球的轴线不能在显示器的平面中旋转. 优点:可以绘制三维数据,圆柱圆锥.卫星 2.openwebglobe 网址:http://www.openwebglobe.org/ 许可证:Open source licenced under M

BLCR技术初探

BLCR技术到底是什么技术?我没空和你乱扯,自己去看该官方网站的介绍:http://crd.lbl.gov/groups-depts/ftg/projects/current-projects/BLCR 首先要下载BLCR的源代码,可以在上面提到的官网上下载,现在最新版本是0.8.5的,目前已经有RPM安装包,但我是下载的源代码包:blcr-0.8.5.tar.gz.编译安装blcr如下所示  % tar xvzf blcr-0.8.5.tar.gz % cd blcr-0.8.5 % mkdi

基于 fuzz 技术验证移动端 app 的健壮性

问题定义 app发布后经常容易出现各种诡异的crash, 这些crash固然可以通过各种崩溃分析服务去定位. 但是的确很影响用户体验. 在crash分类中有一类是后端接口引发的. 比如常见的引发app crash的原因 接口自身变更, 接口失效或者超时, 比如用户进地铁 接口格式变更. 字段缺失 接口内容变更, int string格式搞错了. 某些字段原本是有值后来就变成了null 一旦出了问题, 后端背锅或者做兼容是常见的方案. 但是对于app自身来说,也需要加强健壮性测试. 健壮性的英文名

区块链扫盲:区块链技术初探(二)

?5. 共识机制 区块链是一种去中心化的分布式账本系统,由于点对点网络下存在较高的网络延迟,各个节点所观察到的事务先后顺序不可能完全一致.因此区块链系统需要设计一种机制对在差不多时间内发生的事务的先后顺序进行共识.这种对一个时间窗口内的事务的先后顺序达成共识的算法被称为"共识机制". 5.1区块链和分布式系统容错的相同点 (1) Append only. (2) 强调序列化(时间有序). (3) 少数服从多数原则. (4) 分离覆盖的问题:即长链覆盖短链区块,多节点覆盖少数节点. 5.

基于qemu和unicorn的Fuzz技术分析

前言 本文主要介绍如果使用 qemu 和 unicorn 来搜集程序执行的覆盖率信息以及如何把搜集到的覆盖率信息反馈到 fuzzer 中辅助 fuzz 的进行. AFL Fork Server 为了后面介绍 afl 的 qemu 模式和 unicorn 模式, 首先大概讲一下 afl 的 fork server 的实现机制.afl 与 fork server 的通信流程如图所示 首先 afl-fuzz 调用 init_forkserver 函数 fork 出一个新进程作为 fork server

U+V2深度隐藏PE制作技术初探

所谓U+,习惯上是指用UltraISO软件把ISO文件写入U盘来制作启动盘的一种技术.第一代U+兼容性不太好,不推荐使用.目前,兼容性比较好的是第二代U+启动技术(USB-HDD+ V2/USB-ZIP+ v2),通常简称为U+V2,最新版 U+ 2.0可以创建启动分区并支持"低端隐藏"."高端隐藏"和"深度隐藏"启动分区.U+V2高端隐藏和深度隐藏启动分区解决了PE中低端隐藏时运行一键还原工具时隐藏的启动分区与可见区互换的问题,让U+技术达到了

干货好文!自底向上——知识图谱构建技术初探

知识图谱的构建技术主要有自顶向下和自底向上两种.其中自顶向下构建是指借助百科类网站等结构化数据源,从高质量数据中提取本体和模式信息,加入到知识库里.而自底向上构建,则是借助一定的技术手段,从公开采集的数据中提取出资源模式,选择其中置信度较高的信息,加入到知识库中. 在本文中,笔者主要想分享一下自底向上构建知识图谱的全过程,抛砖引玉,欢迎大家交流. “The world is not made of strings , but is made of things.” ——辛格博士,from Goo

Scratch克隆技术、多线程编程及通讯技术初探

一.引言 Scratch,作为世界流行的青少年编程语言,其对青少年智力的开发及计算思维的培养根本毋庸置疑.既然定位在青少年,那就不能复杂,但是,又要遵循"低门槛,高上限"两个基本特征.让青少年尽快入门的同时,又可以让部分能够深入钻研的同学深刻体会到编程的创造性.复杂性及内在乐趣.而后者,在全国青少年编程竞赛与等级考试中肯定要体现出来--自然也是体现参加者作品创意与难度的所在. Scratch开发者恰当地把握了上述要求与特征:最基础最重要的计算机编程语言特征必须具备,同时又尽可能巧妙地&

JNI技术初探(二)

package com.zzw.demo1; public class Hello { static { System.loadLibrary("hello"); } private native String say(String str); private native float average(int[] a); private native int max(int[][] f); public static void main(String[] args) { Hello h