AFL101

AFL01

AFL01是为了测试xpdf,主要是一个基础的插桩任务:

 

Afl++的安装不再此赘述,在afl++安装好之后尝试xpdf

Xpdf是开源的,可以搞到xpdf的源码:

 

用clang-fast编译,安装,

 

 

   

之后就可以直接跑了,命令也很简单,只指定了一个123的随机参数和连接pdftotext的输出位置:

afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output

 

 这个相对容易一些,没多久就可以出crash:

 

 

AFL03

AFL03的任务是熟悉使用Address Sanitizer对TCPdump做模糊测试,方便后期更好地去分析跟踪crash:

 

TCPdump凭借其强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具,此软件是在libpcap的基础之上开发的,即数据包捕获函数库,凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。二者都是开源的,有源码:

 

使用ASAN对二者进行编译:

先使用llvm11编译libpcap

 

 

再用ASAN编译安装tcpdump:

 

 

使用ASAN编译的过程会漫长一点:

 

Install:

 

这就可以开始fuzz了,需要注意ASAN需要大量的内存空间,设置参数:-m none可以让fuzz过程的内存使用不受限制:

afl-fuzz -m none -i $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/tests/ -o $HOME/fuzzing_tcpdump/out/ -s 123 -- $HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r @@

 

tcpdump参数解释,主要目的还是想尽可能多的调用tcpdump的函数:

-v:当分析和打印的时候,产生详细的输出。

-vv:产生比-v更详细的输出。

-vvv:产生比-vv更详细的输出。

-vvvv:以此类推

-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。

-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。

-e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。

-ee:更详细

-n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。

-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。

 

这里是临时截取的样图,在具体做exercise3的时候跑了17个小时也没跑出来crash,

官方是五个多小时就跑出来了:

 

和github上面给出的示例做比较,整体上没有做错或者少了哪步,不知道跑不出来的原因。

 

如果能跑出来的话,可以利用ASAN编译插桩TCPdump的特点,使用下面的命令对crash_file做一个分析,可以看到是一个堆溢出漏洞

$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r '/home/fuzz/fuzzing_ tcpdump/out/default/crashes/<crash_file_name>'

 

 

AFL05

AFL 05是对LibXML2做模糊测试,主要的突破点是实现多进程并行测试

这里的LibXML2是开源项目,有源码,因此运用一定技术对其进行编译插桩即可:

 

结合ASAN,命令如下:

 

CC=afl-clang-lto CXX=afl-clang-lto++ CFLAGS="-fsanitize=address" CXXFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address" ./configure --prefix="$HOME/Fuzzing_libxml2/libxml2-2.9.4/install" --disable-shared --without-debug --without-ftp --without-http --without-legacy --without-python LIBS='-ldl'

 

这里CC、CXX两个编译器都选择了AFL的lto模式编译器,同时CFLAGS、CXXFLAGS、LDFLAGS三者都开启地址随机化,(但为什么要开启地址随机化这个层面不太明白):

 

编译过程比较漫长,运行make -j$(nproc),使用全部线程加速编译过程:

 

编译的过程还是相对漫长,等待后Make install安装:

 

测试安装后的libxml2能够正常使用:

 

然后根据github上的推荐,下载语料库:

 

分别使用

afl-fuzz -m none -i ./afl_in -o afl_out -s 123 -x ./dictionaries/xml.dict -D -M master -- ./xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@

 

afl-fuzz -m none -i ./afl_in -o afl_out -s 234 -S slave1 -- ./xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@

 

开启主窗口和若干个副窗口(截图只有一个)进行模糊测试:

 

然后因为前面已经说明,因为使用了ASAN优化编译,对分析crash有很好的帮助,如下:

 

./xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude './afl_out/default/crashes/id:000000,sig:06,src:003963,time:12456489,op:havoc,rep:4'

 

 

栈溢出漏洞

 

AFL07

AFL07对VLC player做模糊测试,此为开源项目,可获取源码:

 

直接安装vlc player会报很多错,需要额外下载安装很多环境依赖,可以选择安装专门vlc依赖库跳过这一步:

 

然后configure就不会报错:

 

 

全进程快速编译:

 

检查可以正常使用:

 

按照github上的推荐获取语料库视频:

 

然后经过实验发现,若是此时直接对vlc进行模糊测试的话,会很慢,每秒只有若干次执行,所以受github上的处理方式提醒指导,选择对vlc套一个测试用的harness,实现选择性、对一部分代码插桩。

地址随机化对vlc-demux-run进行编译:

 

对libasf.c文件稍作修改,使得fuzz能够加速:

 

 

以上是能够正常模糊测试的工作,但是为了要测试出目标漏洞还需要做一个调整:已知目标漏洞是存在于ASF的demuxing中,所以对vlc-demux-run.c做一点改动,是对vlc_demux_process_memory函数的调用:

 

打上此补丁:

 

之后就是开心快乐的fuzz时间,使用fast模式,开启ASAN地址随机:

CC="afl-clang-fast" CXX="afl-clang-fast++" ./configure --prefix="$HOME/fuzzing_vlc/vlc-3.0.7.1/install" --disable-a52 --disable-lua --disable-qt --with-sanitizer=address

 

 

同时原文作者使用一种杂糅的方式,同时引进了功能函数和文件名的双匹配方式,编写了部分插桩的文件,会后续使用:

(不完全展示)

 

 

利用AFL_LLVM_ALLOWLIST选项,选定刚才产生的说明了部分插桩所针对的目标的文件进行编译,以此编译文件中所特定说明的对象:

AFL_LLVM_ALLOWLIST=$HOME/fuzzing_vlc/vlc-3.0.7.1/Partial_instrumentation make -j$(nproc) LDFLAGS="-fsanitize=address",

关于forkserver报错

 

如果使用AFL_IGNORE_PROBLEM=1略过的话,会发现报内存泄露,此路不通:

 

若改使用AFL_PRELOAD=foo.so,编译过程虽然不同,但是最后会报相同错误,以上错误原因未知,无从解决。

 

AFL09

AFL10利用WinAFL对7zip压缩软件进行模糊测试

 

在windows上运行AFL-fuzz,需要配置环境

首先第一个肯定是C环境的配置,相对MinGW在Windows上的配置还有些麻烦,直接下载VS省事很多,比如Visual Studio2019:

 

安装DynamoRIO运行时代码控制系统,以支持程序在运行的时候对程序代码流行完全控制:

 

获取winAFL的源码:

 

这时候利用vs2019的Developer Command Prompt,在WinAFL的目录下执行以下内容:

mkdir build32

cd build32

cmake -G"Visual Studio 16 2019" -A Win32 .. -DDynamoRIO_DIR=C:\Users\IEUser\Desktop\DynamoRIO-Windows-8.0.0-1\cmake

cmake --build . --config Release

 

注意第四行的DynamoRIO的路径配置

这几行执行完毕后可以看到WinAFL的二进制文件:

 

然后下载7-zip:

 

最好是使用HFS+ images作为语料库:

 

在AFL08中,在fuzzer会循环的位置寻找一个目标函数的偏移量进行fuzz,所以定位到main函数入口点为0x42F3B3:

 

所以main函数的偏移地址就是0x2F3B3。

检查目标在代码运行时控制系统下是否可以正常运行:

C:\Users\IEUser\Desktop\DynamoRIO-Windows-8.0.0-1\bin32\drrun.exe -c winafl.dll -debug -target_module 7z.exe -target_offset 0x02F3B3 -fuzz_iterations 10 -nargs 2 -- "C:\Program Files (x86)\7-Zip\7z.exe" l C:\Users\IEUser\Desktop\input\test.img

 

目标执行没问题

最终使用afl-fuzz.exe测试:

afl-fuzz.exe -i C:\Users\IEUser\Desktop\afl_in -o C:\Users\IEUser\Desktop\afl_out -t 2000 -D C:\Users\IEUser\Desktop\DynamoRIO-Windows-8.0.0-1\bin32 -- -coverage_module 7z.exe -coverage_module 7z.dll -target_module 7z.exe -target_offset 0x02F3B3 -nargs 2 -- "C:\Program Files (x86)\7-Zip\7z.exe" e -y @@

 

成功运行

本文作者:6896yzm

本文链接:https://www.cnblogs.com/6896yzm/p/afl101.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   翼织猫  阅读(135)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起