网站建设管理需要招聘什么人才,高端品牌粉碎机,什么是网络营销?与电商营销有什么区别?,在线代理网页浏览网站Beacon是一个定向模糊测试工具#xff0c;给定行号#xff0c;能够定向探索行号附近的代码区域。主要思想是采用静态分析的方法获取到与目标有关的变量的最弱前置条件#xff08;weakest precondition#xff09;的信息#xff0c;并在相关位置插入断言#xff0c;来提前…Beacon是一个定向模糊测试工具给定行号能够定向探索行号附近的代码区域。主要思想是采用静态分析的方法获取到与目标有关的变量的最弱前置条件weakest precondition的信息并在相关位置插入断言来提前终止模糊测试执行与目标无关的输入提高模糊测试的吞吐量来提高效率。
关于这篇工作的具体介绍可以参考该链接的解读https://zhuanlan.zhihu.com/p/531371498
0. 安装
docker 拉取Beacon的镜像
docker pull yguoaz/beacon使用方法见该链接https://outstanding-hydrogen-2d1.notion.site/Beacon-documentation-8480ed4e7fff452a989f7e77ce749951
官方教程给出了基本的操作说明这里打算实际复现下这个过程。
1. 分析precondition
/Beacon/precondInfer /Beacon/Test/swftophp-2017-7578.bc -target-file/Beacon/Test/cstest.txt -join-bound5这个例子中
/Beacon/Test/swftophp-2017-7578.bc是目标程序的字节码/Beacon/Test/cstest.txt 是给定的行号。比如包含下面的内容
parser.c:66给定的行号通常是漏洞的崩溃点一般通过CVE数据库里的崩溃报告来获取。
执行上面命令后会输出三个文件
bbreaches_Beacon_Test_cstest.txt : 能到达目标指令的基本块集合。range_res.txt : 范围分析结果transed.bc : 转换后的字节码用于后续的处理
bb_reaches_Beacon_Test_cstest.txt内是一堆数字下面节选了一部分应该是LLVM IR中间层的基本块的ID。
2676
38526
27001
7456
37338
19712
38153
1958
37059
33506
2190
37077range_res.txt是前置条件分析的结果包含了变量的取值范围等信息。 {fun: outputTrailer_0x2608af8,funLoc: 7320,instRes: [],argRes: [],unreachbb: [7353,7369]},{fun: parseSWF_DEFINEMORPHSHAPE_0x25efb78,funLoc: 32260,instRes: [{value: %62 icmp ne void (i8*, ...)* %61, null, !dbg !7087,range: [0,0],line: 32343}],argRes: [],unreachbb: [32347]}
2. 插桩
插桩过程利用上面输出的信息
/Beacon/Ins -output/Beacon/Test/CVE-2017-7578.bc \
-byte -blocks/Beacon/Test/bbreaches-CVE-2017-7578.txt \
-afl -loglog.txt -load/Beacon/Test/outputs/range_res.txt \/Beacon/Test/outputs/transed.bc各个选项的含义
-output输出插桩后的字节码文件-blocks接收可达的基本块列表就是前面生成的bb_reaches_Beacon_Test_cstest.txt 需要注意默认情况下可达性分析的结果是基于字节码的因此需要使用-byte选项如果用户自己做了源码级的可达性分析可以用-src选项。并且提供可达的行号形式为“文件名:行号” -load: 获取precondition比如前面生成的range_res.txt-afl允许AFL覆盖率追踪的插桩-asan选项默认是关掉的可能会导致功能性错误
然后将字节码编译为可执行的二进制文件注意需要链接一些动态库。
clang /Beacon/Test/CVE-2017-7578.bc -o /Beacon/Test/CVE-2017-7578 -lm -lz /Beacon/Test/afl-llvm-rt.o3. 开始fuzz
最后执行afl-fuzz命令
/Beacon/afl-fuzz -i /Beacon/Test/in -o /Beacon/Test/fuzz-output -m none -t 9999 -d -- /Beacon/Test/CVE-2017-7578 总体流程和其他工作差不多。
4. 再来测试下Libtiff
由于镜像中没有提供生成字节码的文件所以需要提前安装gllvm或者wllvm这里就不再赘述。
然后准备好libtiff的目标文件cstest.txt和libtiff种子文件夹in放在/Beacon/libtiff_test文件夹下
直接运行下面脚本即可需要注意下面脚本假设gllvm放在/Beacon/文件夹下。
cd /Beacon/libtiff_test
git clone https://gitlab.com/libtiff/libtiff.git
cd libtiff
export CC/Beacon/gllvm/gclang
export CXX/Beacon/gllvm/gclang
./autogen.sh
./configure --disable-shared
make clean
make
cd tools/
/Beacon/gllvm/get-bc tiffcp
mv tiffcp.bc /Beacon/libtiff_test/
/Beacon/precondInfer /Beacon/libtiff_test/tiffcp.bc -target-file/Beacon/libtiff_test/cstest.txt -join-bound5
/Beacon/Ins -output/Beacon/libtiff_test/tiffcp.ci.bc \
-byte -blocks/Beacon/libtiff_test/bbreaches__Beacon_libtiff_test_cstest.txt \
-afl -loglog.txt -load/Beacon/libtiff_test/range_res.txt \/Beacon/libtiff_test/transed.bcclang /Beacon/libtiff_test/tiffcp.ci.bc -o /Beacon/libtiff_test/tiffcp -lm -lz /Beacon/Test/afl-llvm-rt.o/Beacon/afl-fuzz -i /Beacon/libtiff_test/in -o /Beacon/libtiff_test/fuzz-output -m none -t 9999 -d -- /Beacon/libtiff_test/tiffcp
另外如果给的是无效的target在运行precondInfer命令时会报如下错误
malformed target file -- exiting!