GitHub-syzkaller-setup
Ubuntu20.04
sudo apt update
sudo apt install make gcc flex bison libncurses-dev libelf-dev libssl-dev debootstrap
在自己用户目录下创建文件夹,具体创建因人而异,可以参考:
/workspace 一级目录
/source /bin /fuzz
/source 下有 /image /kernel
具体代码如下
cd ~
mkdir workspace
cd workspace
mkdir source bin fuzz
cd source
mkdir image kernel
以上仅作为目录创建参考,文中会以$KERNEL
,$iMAGE
,$GOPATH
来代指,执行的时候需更换为自己的实际目录。
可以直接使用git
命令去官网进行克隆,速度慢的话可以选择国内的镜像网站直接下载。
笔者自己是手动下载了压缩包,复制到前文创建好的kernel文件夹中,进行解压。
解压后的文件夹即为内核根目录,即$KERNEL
git clone --branch v5.14 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $KERNEL
推荐一下另一个链接,非官方的链接 http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
图为笔者选择的内核,将该内核复制到创建的文件夹中并解压
cp -r ~/下载/linux-5.14.1.tar.gz ~/workspace/source/kernel
cd ~/workspace/source/kernel
tar -zxvf linux-5.14.1.tar.gz
解压成功后 ,~/workspace/source/kernel/linux-5.14.1
即为笔者的内核目录$KERNEL
cd $KERNEL
make defconfig
make kvm_guest.config
此处注意make的安装以及更新,笔者一开始就在此处犯了错。
接下来是编辑.config
文件,以下内容在文件中应该是以#CONFIG_KCOV is not set
这种形式存在,如果不存在就直接添加。
可以选择自己喜欢的编辑器,笔者一开始使用的vim但是不好找到对应位置,所以笔者在这推荐使用pluma
打开.config
文件,使用pluma可以直接用CTRL+F去查找然后进行修改。
编辑的.config文件内容↓:
# Coverage collection.
CONFIG_KCOV=y
# Debug info for symbolization.
CONFIG_DEBUG_INFO=y
# Memory bug detector
CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y
# Required for Debian Stretch
CONFIG_CONFIGFS_FS=y
CONFIG_SECURITYFS=y
接下来仍在该目录执行:
make olddefconfig
仍然是$KERNEL
位置
make -j`nproc`
构建成功后,会生成vmlinux
和bzImage
ls $KERNEL/vmlinux
ls $KERNEL/arch/x86/boot/bzImage
若第一步没有安装debootstrap,在这一步就必须要进行安装了
sudo apt-get install debootstrap
然后在github的syzkaller里的tools文件夹中找到文件creat-image.sh
并复制出来,放到image文件夹中。
cd $image
#将 creat-image.sh 文件复制到此处
sudo chmod 777 creat-image.sh
这里如果直接运行可能会非常缓慢,因为在creat-image里面有调用了官方的镜像,速度较慢。所以建议进入creat-image
文件中去修改镜像源。修改为清华或者阿里的源都可以。
具体的修改位置也可以使用pluma去查找deb.debian.org
,将此处地址更换掉。
然后就可以运行文件了。
./creat-image.sh
运行成功后会生成stretch.img
文件。
sudo apt-get install qemu-system-x86
egrep -c '(vmx|svm)' /proc/cpuinfo
如果值大于0则支持虚拟化。
如并不大于0,则需要开启虚拟化,真实主机开启虚拟化需要重启进入bios。
Intel Virtual Technology
,选择Enabled
,保存后退出BIOS并启动系统,这次执行上面命令就可以返回大0的值。qemu-system-x86_64 \
-m 2G \
-smp 2 \
-kernel $KERNEL/arch/x86/boot/bzImage \
-append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \
-drive file=$IMAGE/stretch.img,format=raw \
-net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \
-net nic,model=e1000 \
-enable-kvm \
-nographic \
-pidfile vm.pid \
2>&1 | tee vm.log
注意将代码中的$KERNEL
等路径替换为自己的路径。
如果成功会进入一个qemu的虚拟机,在这进行测试:
ssh -i $IMAGE/stretch.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost
测试连接成功后使用poweroff
可以退出。
syzkaller是使用go语言编写的,所以需要go语言环境的支持。尽量安装1.16以上版本的go语言。
笔者在实际操作时一开始是安装的go1.19.2
,不过在后续对syzkaller进行编译的过程中遇到了多个问题,搜索后发现原因应该是go语言的版本太新了,需要选择更早的版本进行安装,最后是安装的go1.17
版本。
在安装go语言的时候,可以通过命令行直接安装,也可以手动下载,然后拷贝至~/workspace/bin/
文件中,解压后的go文件夹即为笔者的$GOROOT
文件夹。
官网下载可能较慢,推荐使用go语言中文网。
export GOROOT=$GOROOT
export PATH=$GOROOT/bin:$PATH
环境变量声明后,就可以查看当前的go语言版本了。
go version
不过笔者在退出后重新打开终端,发现对是syzkaller进行编译会一直报错go: not found
,查阅后发现上述声明是仅仅针对当前窗口,需要去/etc/profile
里面修改。
sudo echo "export GOROOT=$GOROOT" >> /etc/profile
sudo echo "export PATH=$GOROOT/bin:$PATH" >> /etc/profile
source /etc/profile
首先是下载syzkaller,可以直接将syzkaller克隆到主机上。
建议一开始先进到提前创建好的fuzz文件夹中,在此进行下载。
cd ~/workspace/fuzz
git clone https://github.com/google/syzkaller
手动下载后将压缩包放到~/workspace/fuzz/syzkaller/src/github.com/google/
文件夹中,并在此解压unzip syzkaller-master.zip
。
因为在接下来会编辑的my.cfg
文件中,文件夹名为syzkaller,所以我也将解压后的文件夹名字进行了更改。
mv syzkaller-master syzkaller
然后进入syzkaller文件夹,进行编译。
cd syzkaller
make
make
此处是笔者消耗时间最多的地方,遇到了诸多问题。
go :not found
,解决环境变量声明后不再出现此问题{
"target": "linux/amd64",
"http": "127.0.0.1:56741",
"workdir": "$GOPATH/src/github.com/google/syzkaller/workdir",
"kernel_obj": "$KERNEL",
"image": "$IMAGE/stretch.img",
"sshkey": "$IMAGE/stretch.id_rsa",
"syzkaller": "$GOPATH/src/github.com/google/syzkaller",
"procs": 8,
"type": "qemu",
"vm": {
"count": 4,
"kernel": "$KERNEL/arch/x86/boot/bzImage",
"cpu": 2,
"mem": 2048
}
}
$GOPATH
是go语言工作路径,笔者的是~/workspace/fuzz/syzkaller
。
编写完my.cfg
创建workdir文件夹
mkdir workdir
最后就可以运行syzkaller了
./bin/syz-manager -config=my.cfg
笔者是才刚刚开始接触fuzz,在操作系统和linux方面只是在选修课中简单接触过,这次看着github的教程和csdn上的博客,一路磕磕绊绊,才算勉强完成了syzkaller的安装搭建,不过这次也让我实实在在的使用了linux的相关指令,文章基本全程参考github,有少量自己遇到的问题,也许很多地方说的不明白,还请海涵。之后也会尝试去使用syzkller。