LAVA-M数据集的使用

一、 省流版

$ wget http://panda.moyix.net/~moyix/lava_corpus.tar.xz
$ xz -d lava_corpus.tar.xz	# 此步将tar.xz格式解压缩成tar格式,不保留原压缩文件,如果要保留原压缩文件,加上-k
$ tar -xvf lava_corpus.tar
$ sudo apt install libacl1-dev	# 安装libacl1-dev
# 进入到  lava_corpus/LAVA-M/base64/coreutils-8.24-lava-safe 文件夹下  ubuntu20以后会遇到的奇怪的bug
# 将lib文件夹下的所有 .c 文件中的IO_ftrylockfile替换为IO_EOF_SEEN
$ sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c 
$ echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
# 在 lava_corpus/LAVA-M/base64/coreutils-8.24-lava-safe/lib/mountlist.c 的头部加入: #include <sys/sysmacros.h> 
# 进入到 lava_corpus/LAVA-M/base64 文件夹下
$ export CC=afl-gcc
$ export CXX=afl-g++
$ ./validate.sh 	# 运行脚本安装,这一步需要在普通用户权限下执行
$ afl-fuzz -m none -t 5000 -i fuzzer_input/ -o outputs coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@

二、详细版

参考:
https://blog.csdn.net/kjfjdsj/article/details/123695273?spm=1001.2014.3001.5502

https://www.jianshu.com/p/63e99530d744

https://www.jianshu.com/p/31a048ccb2ad

由于root模式下LAVA-M的自动化脚本不可用,最好在普通用户权限下运行,遇到权限不足的,切换到root修改文件的权限。

提前安装需要的包

$ sudo apt install libacl1-dev	# 安装libacl1-dev

下载压缩包

$ wget http://panda.moyix.net/~moyix/lava_corpus.tar.xz

解压

# .tar.xz文件可以分两步解压缩
$ xz -d lava_corpus.tar.xz	# 此步将tar.xz格式解压缩成tar格式,不保留原压缩文件,如果要保留原压缩文件,加上-k
$ tar -xvf lava_corpus.tar

此时如果直接进入到 lava_corpus/LAVA-M/base64/ 运行如下 ./validate.sh 命令,结果应该如下:

Building buggy base64...
Checking if buggy base64 succeeds on non-trigger input...
Success: base64 -d inputs/utmp.b64 returned 127
Validating bugs...
Validated 0 / 44 bugs
You can see validated.txt for the exit code of each buggy version.

于是我就将 validate.sh 中的命令拆开,一步一步执行,遇到了Ubuntu20上的一些奇怪bug。

$ ./configure --prefix=`pwd`/lava-install LIBS="-lacl" &> /dev/null
$ make`	# 这一步会报错,报错内容如下
lib/freadseek.c:68:3: error: #error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your system, then report this to bug-gnulib."
   68 |  #error "Please port gnulib freadseek.c to your platform! Look at the definition of getc, getc_unlocked on your system, then report this to bug-gnulib."
      |   ^~~~~      
# 解决方法 将lib文件夹下的所有 .c 文件中的IO_ftrylockfile替换为IO_EOF_SEEN
$ sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c

$ make #再次make还会报错,报错内容如下
lib/fflush.c:43:20: error: '_IO_IN_BACKUP' undeclared (first use in this function)
   43 |   if (fp->_flags & _IO_IN_BACKUP)
# 解决方法
$ echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h

$ make #再次make还会报错,报错内容如下
.../lava_corpus/LAVA-M/base64/coreutils-8.24-lava-safe/lib/mountlist.c:526: undefined reference to `makedev'
collect2: error: ld returned 1 exit status
# 解决方法
# 在 lava_corpus/LAVA-M/base64/coreutils-8.24-lava-safe/lib/mountlist.c 的头部加入: #include <sys/sysmacros.h>

$ make # 这次成功
$ make install

编译安装部分就完成了。剩下的bug校验部分可以直接用validate.sh 文件中的后半部分内容,直接执行 validate.sh 应该也行。创建 my_validate.sh 文件,内容如下。

#!/bin/bash

PROG="base64"
PROGOPT="-d"
INPUT_PATTERN="inputs/utmp-fuzzed-%s.b64"
INPUT_CLEAN="inputs/utmp.b64"

echo "Checking if buggy ${PROG} succeeds on non-trigger input..."
./coreutils-8.24-lava-safe/lava-install/bin/${PROG} ${PROGOPT} ${INPUT_CLEAN} &> /dev/null 
rv=$?
if [ $rv -lt 128 ]; then
    echo "Success: ${PROG} ${PROGOPT} ${INPUT_CLEAN} returned $rv"
else
    echo "ERROR: ${PROG} ${PROGOPT} ${INPUT_CLEAN} returned $rv"
fi

echo "Validating bugs..."
cat validated_bugs | while read line ; do
    INPUT_FUZZ=$(printf "$INPUT_PATTERN" $line)
    { ./coreutils-8.24-lava-safe/lava-install/bin/${PROG} ${PROGOPT} ${INPUT_FUZZ} ; } &> /dev/null
    echo $line $?
done > validated.txt

awk 'BEGIN {valid = 0} $2 > 128 { valid += 1 } END { print "Validated", valid, "/", NR, "bugs" }' validated.txt

echo "You can see validated.txt for the exit code of each buggy version."

运行 ./my_validate.sh 命令, 结果如下

Checking if buggy base64 succeeds on non-trigger input...
Success: base64 -d inputs/utmp.b64 returned 0
Validating bugs...
Validated 44 / 44 bugs
You can see validated.txt for the exit code of each buggy version.

得到 validated.txt 文件,第一列为每个 bug 的编号。第二列为返回结果,值为0表示程序正常返回,即bug注入失败,非0表示注入成功。

至此就完成了base64的安装与检验,其余三个程序照此即可。

### 使用AFL插桩技术在LAVA-M项目中的应用 为了在LAVA-M项目中利用AFL进行有效的模糊测试,需要理解AFL的工作原理以及其与LAVA-M集成的具体方法。AFL通过编译器插桩来监控程序执行路径,并基于此优化输入样本的选择过程[^2]。 #### 设置环境变量以启用AFL插桩功能 当准备使用AFL对LAVA-M中的目标应用程序进行模糊测试时,首先要设置合适的编译选项以便于AFL能够插入必要的跟踪代码到被测软件内部。这通常涉及到修改默认使用的GCC/G++为由AFL提供的特殊版本`afl-gcc`/`afl-g++`: ```bash export CC=afl-gcc export CXX=afl-g++ ``` 上述命令会告知后续构建过程中采用经过特别定制化的C/C++编译器来进行源码编译工作,从而确保每一个可执行文件都包含了用于追踪分支覆盖率的信息[^4]。 #### 编译带有AFL支持的目标程序 进入具体的待处理项目目录(例如coreutils-8.24-lava-safe),按照常规流程重新编译整个工程即可完成基本配置下的AFL兼容性改造。此时生成的应用程序不仅保留原有逻辑不变,同时也具备了接受来自AFL框架指导的能力,可以更高效地探索潜在的安全漏洞位置[^3]。 #### 启动AFL并指定初始种子集合 准备好之后就可以启动AFL本身了。一般情况下建议提供一组精心挑选过的起始测试案例给它作为起点——这些样例应当尽可能覆盖广泛的功能模块,有助于加速发现深层次缺陷的速度。对于LAVA-M而言,则可以直接指向官方给出的标准语料库地址作为基础素材来源[^1]。 ```python import os os.system('afl-fuzz -i input_samples_dir -o findings_output_dir ./path_to_target_binary') ``` 这段Python伪代码展示了调用AFL核心组件的方式之一:其中-i参数指定了用来初始化队列的文件夹名;而-o则决定了保存新发现异常情况的位置;最后紧跟的是实际要分析二进制文件的确切路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值