PANDA安装及使用记录

接上一篇,PANDA同样是一个开源的基于qemu的动态二进制分析平台,提供指令记录和回放、执行LLVM等强大功能,方便编写各种插件。记录一下安装PANDA的过程。

PANDA安装

我是手动按照官方文档安装的。

1
2
3
4
5
6
7
8
sudo add-apt-repository ppa:phulin/panda
sudo apt-get update
sudo apt-get build-dep qemu
sudo apt-get install git python-pip libc++-dev libelf-dev libdwarf-dev
sudo apt-get install libelf-dev libdwarf-dev libwiretap-dev wireshark-dev python-pycparser
sudo apt-get install llvm-3.3 clang-3.3
sudo apt-get install protobuf-compiler protobuf-c-compiler python-protobuf
sudo apt-get install libprotoc-dev libprotobuf-dev libprotobuf-c-dev

然后下载和安装panda:

1
2
3
4
git clone https://github.com/panda-re/panda
mkdir -p build-panda
cd build-panda
../panda/build.sh

或者直接使用install_ubuntu.sh这个脚本安装。我的情况是使用git clone服务器的网速太慢了,一直下载不下来,十几kb也是很醉啊,手动下载会出现错误2,但能找到解决方法。

遇到的错误

错误1:

1
2
3
4
5
chen@ubuntu:~$ sudo apt-get install libprotobuf-c-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package libprotobuf-c-dev

可以手动下载libprotobuf-c-dev,64位安装包下载地址在这里。安装命令:

1
sudo dpkg -i libprotobuf-c1_1.2.1-1_amd64.deb

错误2:

1
2
3
4
5
6
7
8
9
chen@ubuntu:~/build-panda$ ../panda/build.sh
build.sh: Older gcc/g++ found. Enforcing gnu11 mode.
build.sh: Using protobuf 2.5.0.
build.sh: Found LLVM on /usr/lib/llvm-3.3 -- LLVM SUPPORT IS ENABLED
build.sh: Configuring PANDA...
ERROR: DTC (libfdt) version >= 1.4.2 not present. Your options:
(1) Preferred: Install the DTC (libfdt) devel package
(2) Fetch the DTC submodule, using:
git submodule update --init dtc

这是因为我的libfdt版本是1.4.0,手动安装高版本的libfdt,由于高版本的libfdt还要高版本的libfdt1,下载libfdt-1.4.5libfdt1-1.4.5,然后安装:

1
2
sudo dpkg -i libfdt-dev_1.4.5-3_amd64.deb
sudo dpkg -i libfdt1_1.4.5-3_amd64.deb

PANDA使用

首先制作虚拟磁盘文件:

1
qemu-img create -f qcow2 win7_64.qcow2 60G

然后安装操作系统,这里我用64位的win7,还是在另外一台机器上安装,然后再返回PANDA所在的系统中启动镜像,但是我64位的win7可能是因为操作系统镜像的问题,无法安装,还是记录一下命令。

1
2
qemu-system-x86_64 -m 2048 win7_64.qcow2 -cdrom Win7_64.iso -show-cursor -usbdevice tablet
qemu-img amend -f qcow2 -o compat=0.10 win7_64.qcow2

因此我选择直接在PANDA里启动和安装操作系统,可以启动成功,安装时间比较久,应该不会出什么问题。

1
2
cd build-panda/x86_64_softmmu/
./panda-system-x86_64 -drive file=../../image/x64/win7_64.qcow2,if=ide,cache=writeback -m 2048M -cdrom ../../image/x64/win7_64.iso -show-cursor -usbdevice tablet

安装好之后,再次启动就可以去掉iso镜像文件,启动命令如下:

1
2
cd build-panda/x86_64_softmmu/
./panda-system-x86_64 -monitor stdio -m 1024 -show-cursor -usbdevice tablet ­netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/x64/win7_64.qcow2

32位的镜像可以用之前decaf做好的镜像,启动命令类似decaf:

1
2
cd build-panda/i386_softmmu/
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet ­netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/x86/win7_full.qcow2

同样,可以先使用vmware制作镜像,然后转换为qemu支持的格式。命令如下:

1
2
qemu-img convert win7_64.vmdk -O qcow win7_64.img
./panda-system-x86_64 -monitor stdio -m 1024 -show-cursor -usbdevice tablet ­netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/x64/win7_64.img

使用感受就是PANDA比DECAF在qemu里的响应时间要短。但两个平台的功能侧重点不同,有时间再去读一下这两个工具的论文。

panda快照和插件

快照存储和重放

首选启动panda:

1
2
cd /home/chen/build-panda/i386-softmmu
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet ../../image/x64/win7_64.qcow2

在qemu终端中开始,快照命名为calc,启动和结束快照记录:

1
2
begin_record calc
end_record

生成两个文件,快照和日志记录文件,分别命名为 -rr-snp和-rr-nondet.log。本例中生成的文件如下:

1
calc-rr-snp   calc-rr-nondet.log

快照重放是在panda启动命令中加 -replay 的参数,本例如下:

1
2
cd /home/chen/build-panda/i386-softmmu
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet -replay calc

执行后进行指令重放,当重放完成后,会显示是否重放是否成功。

osi、osi_test和win7x86intro

利用这三个可以识别操作系统,列出在快照重放过程中的系统上执行的所有进程、当前运行进程、内核模块以及它们加载的动态链接库,对于Windows系统只支持32位,创建32位系统的快照,重放快照并加载插件:

1
2
cd /home/chen/build-panda/i386-softmmu
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet -replay /home/chen/project/calc -panda osi -panda osi_test -panda win7x86intro -os windows-32-7

这样运行后输出文件很大,因为每次进行进程的上下文切换时状态都会发生变化,至少当前运行进程和加载的动态链接库会发生变化。

增加新的插件

在panda的plugins目录下,我的是/home/chen/panda/panda/plugins/创建新的文件夹,以插件的名字命名,例如创建一个ins_test的文件夹,ins_test是我自己的插件。然后在plugins目录下的config.panda文件中转增加ins_test。可以使用c/c++来编写插件,插件要创建一个Makefile文件,最简单形式的Makefile文件如下:

1
2
3
4
5
6
7
8
PLUGIN_NAME = ins_test
# If you need custom CFLAGS or LIBS, set them up here
# CFLAGS+=
# LIBS+=

# The main rule for your plugin. List all object-file dependencies.
$(PLUGIN_TARGET_DIR)/panda_$(PLUGIN_NAME).so: \
$(PLUGIN_OBJ_DIR)/$(PLUGIN_NAME).o

编写完成后,panda支持的平台很多,如果想要节省时间,只编译某个平台,因为到了自己写插件这一步,我们目标平台是已经确定了的,可以修改panda根目录下的build.sh文件,第128行有target-list,比如我只想编译适用于Windows 32位的插件,那么target-list就只保留i386-softmmu。

1
--target-list=x86_64-softmmu,i386-softmmu,arm-softmmu,ppc-softmmu \

返回build-panda目录下,我的是/home/chen/build-panda,执行build.sh脚本:

1
2
cd /home/chen/build-panda
../panda/build.sh

之前已经编译好的,在重新build时不会重复编译,所以这次只会编译我们自己的插件,所以时间很快。开始我是把build-panda清空再编译的,还到处找单独编译插件的方法….

参考

[手动安装官方文档]https://github.com/panda-re/panda/blob/master/panda/docs/build_ubuntu.md
https://www.freebuf.com/sectool/76665.html