1.论文简介
该论文是2021 IEEE Symposium on Security and Privacy (SP)的会议论文,作者是宾西法尼亚大学的博士,论文链接: link.
论文project在github上的链接: link.
2.论文复现环境
我的linux系统是Ubuntu20.04,但是作者的实验环境是ubuntu18.04,作者在dockfile里说明了为什么使用ubuntu18.04,如下图。刚开始尝试在20.04上搭环境,后面发现一直报错,网上搜了一些办法一直没解决。作者也提供了docker版,后面就在docker上跑了这个实验。
3.安装docker
参考链接: link.
4.建立docker镜像和环境
下载作者project,可以git,也可以手动下载
git clone https://github.com/petablox/arbitrar.git
cd docker/
建立docker镜像环境,注意不要少了后面那个点(我刚开始少了那个点)
docker build -f Dockerfile .
报错
修改dockfile
根据报错信息,发现是因为少了llvm-10-dev这个包,但是直接命令行安装apt-get install llvm-10-dev还是会报错,在安装这个包的过程中有个询问yes或者no,如果不加-y是默认no,会安装失败。因此在dockerfile文件中,run opam之前,USER是ROOT的地方加上apt-get install -y llvm-10-dev,修改如下图91行所示:
之后重新运行
docker build -f Dockerfile .
此时docker的镜像环境安装成功!
5.启动docker
docker run -d --name arbitrar-docker
-d:在大部分的场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的运行模式。注意:加了-d参数默认不会进入容器,想要进入容器需要使用指令docker exec,下面会用到。
–name: 为容器指定一个名称。
出错 说需要参数
查看所有的容器命令如下
docker ps -a
关于docker的学习,参考链接: link.
后台运行容器:
-i交互式操作,
-t终端,
/bin/bash放在镜像名后的是命令,这里我们希望有个交互式shell,因此用的是/bin/bash。
sudo docker run -d -it --name arbitrar-docker c91c9d2e73ba /bin/bah
查看所有容器
sudo docker ps
查看发现只有只有一个容器,就是我们刚建立的
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
sudo docker exec -it bdbc5470bb58 /bin/bash
此时整个docker建立成功,接着在docker里运行arbitrar这个工具。
6.运行ARBITRAR
# Inside user aspire's home directory
./install-arbitrar.sh
报错
如下图
上图所示,发现两个错误,一个是cargo,一个是软链接出错,软链接错误在root下仍没有解决,可以先放着,后面使用的时候加上路径就可以。cargo build --release出错,重新安装cargo
sudo apt-get install cargo
安装完以后
cargo build --release
显示成功,之后make
make
make install
发现是链接错误,可以加到环境变量里,也可以不用管
之后重新
./install-arbitrar.sh
因为之前装错,显示已经有了这个文件,删除以后重新安装。
7.应用ARBITRAR
mkdir my-arbitrar-database
cd my-arbitrar-database
arbitrar init
因为我的docker环境在链接时有问题,所以在使用arbitrar时都要加上他的路径。
数据库初始化出错
注意:这里和后面都有同一个错误,root和用户权限一定不要混用,比如在搭建docker环境和安装ARBITRAR这个工具的时候都是root,使用的时候却是用户aspire,这样就会出错。解决办法,修改目录权限,把相关的都改成用户aspire。
在arbitrar目录下
ls
查看文件下各个权限
ll
发现安装arbitrar工具的时候是root权限,因此用户aspire无法使用,会报错
修改目录下的权限为用户权限
sudo chown aspire:aspire -R ./
之后查看目录下的文件权限
ll
已经都是用户权限了
之后重新运行init,没有问题。
collect使用作者提供的sample中的json文件自动收集还是出错,出错如下图所示,没找到出错原因,有时间看源码试一试
因此使用第一种办法,自己在github上下载源码包,使用wllvm工具编译成.bc文件,然后链接到数据库里。wllvm的使用方法参考github上的projectlink.
github上下载源码包
git clone https://github.com/openssl/openssl.git
查看openssl文件
cd openssl
ll
export LLVM_COMPILER=clang
CC=wllvm ./config
编译
make
出错,发现还是用户权限混淆使用
history |grep chown
修改用户权限
sudo chown aspire:aspire -R ./
重新编译
make
编译不成功
make clean
形成.bc文件,openssl里是libssl
extract-bc libssl.so
ll
查看已经有了libssl.so的bc文件
将openssl.bc文件链接到我们建立的数据库
/home/aspire/arbitrar/arbitrar collect /home/aspire/arbitrar/my-arbitrar-database/openssl/libssl.so.bc
查看当前数据库的bc文件有哪些
/home/aspire/arbitrar/arbitrar occurrence
分析openssl里的malloc函数的误用情况
/home/aspire/arbitrar/arbitrar analyze --include-fn malloc
由图上结果可知,生成0个符号执行路径。
进入analysis文件下,查看生成的各种中间和结果文件
slices are stored in the slices
folder, traces are stored in the traces
folder, and features are stored in features
folder.
换个函数,查看zalloc函数,如下图还是没有结果。
根据论文的结果,我们查看已经验证的CRYPTO_zalloc函数。
/home/aspire/arbitrar/arbitrar analyze --include-fn CRYPTO_zalloc
发现有很多中间结果,接下来使用用户互动的主动学习去的分析这些。
/home/aspire/arbitrar/arbitrar learn active CRYPTO_zalloc
用户互动的结果如下图所示,用户根据右边提供的信息回答Y或N,反馈给主动学习算法
以上实验基本跑完一遍,后续结果还要自己分析。
有问题的地方欢迎指正。