??先梳理一下syzkaller的作業方式,這樣便于理解為什么syzkaller的搭建這么復雜:
??一般測驗的Linux內核都需要運行在虛擬機上進行測驗,應該很少直接用物體機上測驗,因此需要qemu來支持硬體虛擬機,其次,Linux內核只有核是沒辦法運行的,還需要發行版外環境的支持,所以我們還需要使用debootstrap來生成一個小型的Linux發行版用于測驗,
??因此syzkaller的使用其實主要需要兩個東西,一個是要測驗的Linux內核,一個是小型發行版以便運行內核,也因此,syzkaller環境的搭建實際上也是為了滿足以上這兩個內容:
- 一些必要的依賴用來保證軟體的正常安裝和使用
- 編譯測驗內核所需的更高版本的gmp、mpfr、mpc、gcc和用這些更高版本的工具所編譯的內核
- 生成小型Linux發行版所需的鏡像(用debootstrap生成)
- syzkaller測驗所需的qemu虛擬機環境、go環境、用于syzkaller識別的
my.cfg檔案(用于指定內核和發行版)
平臺
??VMware Ubuntu16.04
安裝依賴
sudo apt-get install gcc g++ m4 make libncurses5-dev libssl-dev texinfo build-essential openssl zlibc minizip libidn11-dev libidn11 flex bison git debootstrap qemu-system-x86 libelf-dev
創建所需目錄
??在/home/lyg下創建一個作業目錄(lyg是用戶名,請根據自己的系統進行修改),以便完成各種最新軟體的編譯:
mkdir workspace
cd workspace
mkdir bin fuzz source
環境變數宣告
sudo vim ~/.bashrc
??添加:
export GOPATH=/home/lyg/workspace/fuzz/syzkaller
export GOROOT=/home/lyg/workspace/bin/go
export PATH=$GOPATH/bin:$PATH
export PATH=$GOROOT/bin:$PATH
export GCC=/home/lyg/workspace/bin/gcc8.1.0
source ~/.bashrc
配置更適合高版本Linux內核編譯的環境
??具體軟體包括:gmp-6.1.0、mpfr-3.1.4、mpc-1.0.3、gcc8.1.0,下載至workspace目錄下并在該目錄下解壓,
??在workspace目錄下創建tmp檔案夾,進入該目錄進行如下操作,并在每個操作結束后洗掉tmp檔案夾下的所有檔案,(命令中的路徑資訊根據自己的情況進行修改)
../gmp-6.1.0/configure --prefix=/home/lyg/workspace/bin/gmp6.1.0
make -j4
sudo make install
rm –r *
../mpfr-3.1.4/configure --prefix=/home/lyg/workspace/bin/mpfr3.1.4 --with-gmp=/home/lyg/workspace/bin/gmp6.1.0
make -j4
sudo make install
rm –r *
../mpc-1.0.3/configure --prefix=/home/lyg/workspace/bin/mpc1.0.3 --with-gmp=/home/lyg/workspace/bin/gmp6.1.0 --with-mpfr=/home/lyg/workspace/bin/mpfr3.1.4
make -j4
sudo make install
rm –r *
#可能在/usr/lib/x86_64-linux-gnu/中找不到 libmpfr.so.4,所以這里要建立一個符號鏈接;已存在就忽略
sudo ln -s /home/lyg/workspace/bin/mpfr3.1.4/lib/libmpfr.so.4 /usr/lib/x86_64-linuxgnu/libmpfr.so.4
??對gcc的編譯程序可能會非常久(筆者是大約1h):
../gcc-8.1.0/configure --prefix=/home/lyg/workspace/bin/gcc8.1.0 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/home/lyg/workspace/bin/gmp6.1.0 --with-mpfr=/home/lyg/workspace/bin/mpfr3.1.4 --with-mpc=/home/lyg/workspace/bin/mpc1.0.3
make -j4
sudo make install
rm –r *
sudo ln -s /home/lyg/workspace/bin/gcc8.1.0/bin/gcc /usr/local/bin/gcc8
sudo ln -s /home/lyg/workspace/bin/gcc8.1.0/bin/g++ /usr/local/bin/g++8
編譯目標內核
??將內核檔案下載至workspace/source目錄下并解壓,然后進入內核根目錄執行如下命令:
make CC="$GCC/bin/gcc" defconfig
make CC="$GCC/bin/gcc" kvmconfig # 這條命令可能會報ERROR,可以忽略
??接下來編輯.config檔案,對該檔案中如下的行進行編輯,(注意:以下這些命令應該是以注釋如“CONFIG_KCOV is not set”形式存在的,因此需要將該注釋轉換即可,部分不存在的需要手動添加,但注意不要添加在末尾,應添加在中間,)
CONFIG_KCOV=y
CONFIG_DEBUG_INFO=y
CONFIG_KASAN=y #這個默認配置中可能沒有,需要添加
CONFIG_KASAN_INLINE=y #這個默認配置中可能沒有,需要添加
CONFIG_CONFIGFS_FS=y
CONFIG_SECURITYFS=y
??接著執行如下命令:(編譯程序較久,30mins)
make CC="$GCC/bin/gcc" olddefconfig
make CC="$GCC/bin/gcc" -j8
??編譯結束后會產生鏡像如下:
linux-5.10.9/vmlinux
linux-5.10.9/arch/x86/boot/bzImage
創建測驗虛擬機鏡像image
??在source目錄下創建檔案夾image,進入該目錄下載檔案create-image.sh(需要外網),當然也可以直接去GitHub找到syzkaller的倉庫,然后在tools檔案夾下找到該檔案復制出來,
wget https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh
??賦予其執行權:
chmod 777 create-image.sh
??由于該腳本中呼叫的debootstrap會訪問debian的官網鏡像,但是由于網路原因(開梯子也不行),導致下載速度過慢且易產生錯誤,因此需要對該檔案進行更改,將鏡像路徑替換為清華鏡像,如下圖中筆者添加了下面黃色框所在行的內容,用來指定鏡像路徑,(由于環境問題,可能也進入綠色框中執行,因此必要時需要對綠色框中內容也進行替換并洗掉黃色框這一行內容,由于筆者的環境不會經過綠色框,因此不做修改,)

??修改完后運行該腳本:
./create-image.sh
??運行結果如下:


??運行結束后會在該目錄下生成檔案stretch.img,
測驗可否用qemu進入目標虛擬機
??首先檢測系統是否支持虛擬化,使用命令如下:
egrep -c '(vmx|svm)' /proc/cpuinfo
??如果得到的回復值大于0,則表明虛擬化支持已開啟;否則如果是真實主機需要重啟并進入BIOS開啟VT虛擬化,如果是VMware則需要勾選虛擬化支持如下:

??當支持虛擬化后使用如下命令進行測驗:
sudo qemu-system-x86_64 \
-kernel /home/lyg/workspace/source/linux-5.10.9/arch/x86/boot/bzImage \
-append "console=ttyS0 root=/dev/sda debug earlyprintk=serial slub_debug=QUZ"\
-hda /home/lyg/workspace/source/image/stretch.img \
-net user,hostfwd=tcp::10021-:22 -net nic \
-enable-kvm \
-nographic \
-m 2G \
-smp 2 \
-pidfile vm.pid \
2>&1 | tee vm.log
??進入登錄界面即為成功(使用root用戶不需要密碼即可登錄),

配置Go環境
??syzkaller是用go語言完成的,因此其安裝和執行需要go環境支持,去go官網下載go然后將該壓縮包解壓至~/.bashrc中宣告的GOROOT目錄中,即目錄/home/lyg/workspace/bin中即可,GOPATH指明了go的默認作業目錄,
安裝syzkaller并測驗
??從GitHub上下載syzkaller壓縮包,放入/home/lyg/workspace/fuzz/syzkaller/src/github.com/google目錄下并解壓,進入解壓后檔案夾執行git防止出錯(已有git的忽略):
git init
git config user.name "lyg" #名稱隨意
git config user.email "lyg@12345.com" #郵箱隨意
git add *
git commit -m "some init msg"
??此時可能git會報一個錯說“由于.gitignore檔案的存在bin會被忽略”,這個錯誤不用處理,
??接著在該目錄下執行make完成syzkaller的編譯,此處呼叫了go,而由于網路原因可能下載速度較慢,提高下載速度的方法在這里,
編譯結束后在該檔案夾下創建檔案my.cfg(注意更改目錄),如下:
{
"target": "linux/amd64",
"http": "127.0.0.1:56741",
"workdir": "/home/lyg/workspace/fuzz/syzkaller/src/github.com/google/syzkaller-master/workdir",
"kernel_obj": "/home/lyg/workspace/source/linux-5.10.9",
"image": "/home/lyg/workspace/source/image/stretch.img",
"sshkey": "/home/lyg/workspace/source/image/stretch.id_rsa",
"syzkaller": "/home/lyg/workspace/fuzz/syzkaller/src/github.com/google/syzkaller-master",
"procs": 8,
"type": "qemu",
"vm": {
"count": 4,
"kernel": "/home/lyg/workspace/source/linux-5.10.9/arch/x86/boot/bzImage",
"cpu": 1,
"mem": 1024
}
}
??現在可以測驗運行syzkaller了:
sudo ./bin/syz-manager -config=my.cfg

??運行一段時間后在my.cfg指定的IP和埠查看結果,如下:

??至此完成syzkaller的搭建,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/252191.html
標籤:區塊鏈
上一篇:第八十九周學習生活總結
