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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步