PANDA:下一代动态分析平台 - APT防御产品

PANDA:下一代动态分析平台

PANDA简介:

PANDA是构建于顶级QEMU系统上的新一代动态分析平台[1],这使得他可以访问所有正在执行的代码并且可在客户虚拟机操作所有数据,PANDA支持所有基于Qemu体系的模拟器,所以在LLVM IR中每一条指令都能被有效执行。

PANDA提供了许多用于有效分析软件的特性!

记录和回放:提供记录功能,记录下系统所有的指令方便后面的回放以及后续的分析工作,这个功能独特且十分强大,目前支持i386, x86_64 以及 ARM架构。
插件体系:可以简单轻松的写一个插件,这样你就可以随着自己的需求扩展PANDA。
执行LLVM:提供了一种将客户虚拟机中的执行代码转换为LLVM的解决方案,将LLVM的优势发挥到极致,包括分析LLVM代码示例。提供了简化代码分析,我们只需要一个插件来分析LLVM而不是用不同的插件去分析本机代码。

安装PANDA

在使用PANDA之前,我们需要考虑的是:使用预构建好的镜像呢还是自己进行编译?镜像下载地址参考文尾[2]

从源代码编译PANDA,我们首先就要克隆PANDA的repo,使用“git clone” 命令就行

在生成PANDA之前,需要先看下依赖关系:

G++ : C++ 编译器.
Qemu : 模拟器.
Nasm : 汇编程序.
SSL Library : 实现 SSL.
LLVM : 底层虚拟机.
Clang : LLVM的C前端.
Distorm : 反汇编程序库.

这里不会详细介绍如何安装PANDA,详情可以参考[3],这里我们会详细讲解下其中的安装过程。

必须按照指令手动安装distorm和llvm,以保证其安装不会出现任何问题。随后我们生成PANDA的qemu部分,因为默认是不能识别LLVM的,同时这也是为什么我们会在build.sh脚本中提供–with-llvm参数的原因。编译LLVM时,需要启用恰当的目标,可以像下面展示的一样指定–enable-targets参数。为了开启所有的目标,我们需要从编译参数中删除这个选项

当我们希望打开LLVM,我们必须了解make命令是用来生成“Debug+Asserts”模式的,但是如果我们使用–enable-optimized配置选项则会安装“Release”模式。这会直接影响到–with-llvm路径(在build.sh脚本中我们必须指定)。接下来我们来看看build.sh脚本,指定的“Release”目录相应路径在LLVM中;如果没有使用–enable-optimized配置选项,我们便需要提供“Debug+Asserts”目录的路径。使用这个选项,使用PANDA时也就可以识别LLVM了。在下面的脚本中,我们能够看到启用的架构PANDA也是可以使用的,这些框架包括:x86_64, i386 以及 ARM.如何手动生成LLVM,可以参考[4]

注意build.sh只是一个使用“./configure && make”命令进行自动化安装的脚本,所以我们不用提供必须的配置参数。

这并不是什么神奇的事情,打开脚本我们来看看;这些都是每位Linux爱好者都熟悉的基本命令。差不多我们就是通过源码在编译一个修改版的Qemu

准备虚拟机

编译完PANDA之后,这里有3个可用的Qemu二进制文件(用于开启虚拟机):

i386-softmmu/qemu-system-i386
arm-softmmu/qemu-system-arm
x86_64-softmmu/qemu-system-x86_64

提供的3个二进制文件分别作用于3个不同的架构,也就是x86_64, i386 以及 ARM。与Qemu二进制文件的使用方法相同,我们现在就可以将Windows XP SP3安装到虚拟机中并使用它来分析恶意样本。可以使用下面的命令来创建一个Windows XP SP3镜像来进行操作系统的安装。

注意,最好的做法是使用QCOW2格式(支持快照)

# ./qemu-img create -f qcow2 /srv/vms/windowsxpsp3.qcow2 40G

紧接着,我们可以使用下面的命令调用编译好的/srv/panda/qemu/x86_64-softmmu/qemu-system-x86_64加上其他一些参数来打开虚拟机。 -drive参数定义了一个新的IDE接口类型的磁盘镜像,并重置缓存机制。-m参数给虚拟机分配了256MB RAM,而 -cdrom参数指定第一个cdrom镜像为VM所需要的镜像,最后-vnc选项指定打开VNC服务的端口为5901(可用于远程操作虚拟机)

# /srv/panda/qemu/x86_64-softmmu/qemu-system-x86_64 -drive file=/srv/vms/windowsxpsp3.qcow2,if=ide,cache=writeback -m 256M -cdrom /srv/isos/Windows_XPSP3.iso -vnc :5901

接着,使用vncviewer命令远程连接到VNC服务

# vncviewer 192.169.1.2:5901

下面显示的是成功连接,这时正在安装操作系统。

随后,我将Windows XP SP3(恶意样本分析习惯使用这系统)安装进虚拟机中。

使用下面的命令行启动虚拟机,当我们成功安装操作系统之后,将-cdrom参数删除。此外,还需要添加“–monitor stdio”使得我们能够进入QEMU管理协议。当我们键入并执行QMP命令,就可以看到“(qemu)”行了。如果你想了解QMP在 不同的环境下是如何进行交互的,可以参考[5]

# /srv/panda/qemu/x86_64-softmmu/qemu-system-x86_64 -drive file=/srv/vms/windowsxpsp3.qcow2,if=ide,cache=writeback -m 256M -vnc :1 --monitor stdio QEMU 1.0,1 monitor - type 'help' for more information (qemu)

如果执行help命令,我们可以看到PANDA提供(不属于Qemu)的其他命令:

begin_record: 开启记录会话, 保存的名字作为唯一参数. 每一个记录会话都有两个文件, <name>-rr-snp, 用来记录快照 <name>-rr.nondet.log, 用来记录日志. 注意:如果在命令中使用相同的命名那么已经保存的记录会被重写.

end_record: 结束记录会话, 这回暂停客户虚拟机, 但之后是可以从这个点进行恢复的.

begin_replay: 将记录会话作为参数开始回放. 同时也可以使用Qemu支持的providing -replay命令行进行打开.

end_replay: 结束回放会话(一般不需要),一旦所有命令都已经执行它自己就会结束回放会话.

load_plugin: 将插件加载到Qemu.

unload_plugin: 从Qemu卸载插件,

list_plugins: 列出PANDA加载的插件.

plugin_cmd: 向已经加载的插件发送命令.

配置虚拟机中的网络连接

为了开启虚拟机中的网络连接,我们需要下载virtio驱动并使用“-net nic,model=virtio”参数,而不是使用“-net nic” 参数进行开启。下载地址参考[6]

# wget https://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/virtio-win-0.1-94.iso

使用额外的一些参数来引导虚拟机加载iso镜像作为插入计算机中的光盘。如果无法使用最新的virtio驱动,你可以试试早前的版本,在Windows XP SP3下“virtio-win-0.1-52.iso”是能正常工作的。如果你无法启动和运行virtio驱动,你可以尝试使用 “-net nic,model=e1000” 或者 “-net nic,model=rtl8139”进行驱动。

通过使用virtio驱动来引导虚拟机进行网络连接,需要发出如下命令:

# /srv/panda/qemu/x86_64-softmmu/qemu-system-x86_64 -drive file=/srv/vms/windowsxpsp3.qcow2,if=ide,cache=writeback -256M -vnc :1 --monitor stdio -net nic,model=virtio -cdrom /srv/panda/virtio-win-0.1-94.iso

使用“-net”指令进行引导的话,使用如下命令:

# /srv/panda/qemu/x86_64-softmmu/qemu-system-x86_64 -drive file=/srv/vms/windowsxpsp3.qcow2,if=ide,cache=writeback -256M -vnc :1 --monitor stdio -net nic,model=rtl8139 -net user

需要打印支持的网卡模块,使用“-net nic,model=MODEL”命令行参数。也可以执行下面命令:

# /srv/panda/qemu/x86_64-softmmu/qemu-system-x86_64 -net nic,model=? qemu: Supported NIC
models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

使用最新的“-netdev”指令引导虚拟机进行网络连接,需要发出以下命令。下面的命令额外的增加了smb参数选项,这使得guest用户也可以使用网络

# /srv/panda/qemu/x86_64-softmmu/qemu-system-x86_64 -drive file=/srv/vms/windowsxpsp3.qcow2,if=ide,cache=writeback -256M -vnc :1 --monitor stdio -device rtl8139,netdev=net0 -netdev
user,id=net0,smb=/srv/share/

PANDA记录

PANDA拥有大量的插件,你可以通过-panda或者Qemu命令行参数-panda-plugin进行调用。其插件的命名方式为“panda_*.so” 并存在于每一个架构目录之中。 x86_64-softmmu/panda_plugins/ 目录中包含了如下插件:

tapindex
stringsearch
osi
correlatetaps
taint
llvm_trace
textfinder
scissors
tainted_branch
bigrams
network
printstack
replaymovie
useafterfree
bir
memsnap
callstack_instr
textprinter
textprinter_fast
taint_compute_numbers
win7x86intro
bufmon
memsavep
memdump
memstats
keyfind
tstringsearch
sample
tralign

接下来我们会演示使用Pafish进行记录和回放操作(Windows XP)

首先,我们将pafish.exe文件复制到虚拟机中。接着使用begin_record命令开始进行记录:

(qemu) begin_record wget (qemu) writing snapshot: ./wget-rr-snp

begin_record命令将创建一个名为pafish-rr-snp的快照以及一个名为pafish-rr-nondet.log日志文件。开始记录之后,我们运行pafish.exe程序,当pafish.exe程序运行完之后我们可以发出end_record命令来结束记录。

(qemu) end_record
(qemu) Time taken
was: 14 seconds.

在下面截图中我们可以看到事实上pafish.exe程序就在桌面上,注意我们要使用–no-check-certificate从HTTPS站点上下载一个文件来跳过证书检验。

下一步,我们可以通过样本名字使用begin_replay命令在虚拟机中进行回放捕获的指令。

当所有指令都已经执行完,会显示回放所使用的时间,以及回放是否成功。

尾声

在本教程中我们了解了PANDA动态分析平台的一些基础知识。虽然没能对PANDA进行深层次的探究,但我们将安装过程,配置,以及使用中会出现的差错进行了详细描述。

由于其不支持最新版本的Qemu以及还有各种BUG需要修复,PANDA未来的路还很长。

参考资料

[1] PANDA Github

[2] 镜像下载地址 

[3] 安装PANDA

[4] 手动生成LLVM

[5] QMP在不同环境下交互差别

[6] virtio驱动下载


转载请注明出处 APT防御产品 » PANDA:下一代动态分析平台

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址