lava安装实践
lava运行,0/44,正好系统是刚安装过的,什么都没有,所以正好完整的记录一下过程(还好要到了root,省了好多事)
解压然后安装
sudo apt-get install libacl1-dev
然后运行 ./validate.sh,注意为其和core..文件夹下的configure文件添加执行权限。
由于在运行命令时将输出都重定向了&> /dev/null
,所以看不到问题,就很僵硬,一步一步单提出来运行试试。
make clean
第一步:报的WARNING: ‘aclocal-1.15’ is missing on your system.
安装Automake
wget http://ftp.gnu.org/gnu/automake/automake-1.16.tar.gz
tar -xvf automake-1.16.tar.gz
cd automake-1.16
./configure --docdir=/usr/share/doc/automake-1.16
make
make install
然后报错:build-aux/git-version-gen: Permission denied
解决方法:chmod 777 build-aux/git-version-gen
configure时爆错:configure: error: Autoconf 2.65 or better is required.
安装autoconf-2.68.tar.gz
wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
tar xzf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure
make && make install
然后configure时报错:error: no acceptable m4 could be found in $PATH.
然后安装m4
wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
tar -xvf m4-1.4.9.tar.gz
cd m4-1.4.9
./configure
make
make install
然后问题没解决。。
查资料需要运行autoreconf -vfi,需要autopoint,sudo apt-get install autopoint,然后发现版本不够,回去更新autoconf-latest。
然后再试autoreconf -vfi,注意要在base64/core..里运行,出错为build-aux/git-version-gen: Permission denied,sudo chmod 777 build-aux/git-version-gen,再运行通过
然后make clean,注意前面安装时要用sudo权限,但这里执行不要用
./configure –prefix=’pwd’/lava/base64/coreutils-8.24-lava-safe/lava-install
没有问题
make -j $(nproc)
报错gperf: command not found
sudo apt-get install gperf
然后报错 makeinfo: command not found
sudo apt-get install texinfo
make install
没问题
ok
Building buggy base64...
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.
不容易不容易
在core../lava-install/bin里能够找到编译完的程序。明明是base64,为啥编译了这么多。。
注意:虽然编译了这么多,不过将base64.c的文件夹用来测md5sum还是不行的,需要用md5sum的文件夹。。一开始想先用base64测测,没想到扩展时竟然在这卡了挺久。。
uniq特殊
64位是20/28,据说32位没这问题
who特殊
who的lava_get 插入的有些问题,who.c中需要改成如下,目录在coreutils-8.24-lava-safe/src/who.c 中。
unsigned int lava_get(unsigned int bug_num) {
#define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))
if (0x6c617661 - bug_num == lava_val[bug_num] ||
SWAP_UINT32(0x6c617661 - bug_num) == lava_val[bug_num]) {
printf("Successfully triggered bug %d, crashing now!\n", bug_num);
fflush(0);
//exit(0);
}
else {
//printf("Not successful for bug %d; val = %08x not %08x or %08x\n", bug_num, lava_val[bug_num], 0x6c617661 + bug_num, 0x6176616c + bug_num);
}
return lava_val[bug_num];
}
与AFL的结合
命令行输入
export CC=afl-gcc
export CXX=afl-g++
./validate.sh
就可以生成afl版的,记得编译完要改回去,还有,在编译前要讲validate.sh里的输出地址改了
参考文章