动态分析是计算机安全中的一项基本技术,在处理真实程序时,动态分析通常必须在整个系统上运行,而不是仅仅在一个二进制文件上运行,在受控环境中执行样本,然后监视该环境以了解软件的行为。
Panda(Platform for Architecture-Neutral Dynamic Analysis)是目前基于QEMU 2.9.1的全系统动态分析引擎,是一个用于架构中性动态分析的开源平台。优势在于软件的快速逆向工程。
包括一个用于记录和回放执行的系统、一个用于在执行代码上运行 LLVM 分析的框架,以及一个易于扩展的插件架构。
优势:可以收集一段感兴趣的执行记录,然后一遍又一遍地分析该记录。记录/重放能够一遍又一遍地重复执行跟踪,所有数据完全相同。然后,可以分析执行情况并慢慢了解事物的存储位置、正在运行的进程、关键执行事件何时发生等。
PANDA 还具有将 QEMU 的中间表示 TCG 转换为 LLVM 代码的功能,这使得通过 LLVM 通道编写全系统动态分析工具成为可能。这是一个强大的功能,它将两个程序分析框架 QEMU 和 LLVM 连接在一起,以利用两者之间的协同作用。
- 项目地址
https://github.com/panda-re/panda
- 用户使用文档:
panda/manual.md at dev · panda-re/panda
插件系统
Panda插件通过两种主要方式(插件接口)与 QEMU 交互:
- 通过检测回调
- 通过公开客户系统状态的检查 API,例如内存状态
常见的一些回调在:https://github.com/panda-re/panda/blob/dev/panda/docs/manual.md#callback-and-plugin-management
使用回调来hook程序的执行并执行分析代码
安装
环境:Ubuntu20.04
编译安装(采用)
./install_ubuntu.sh
panda/install_ubuntu.sh at dev · panda-re/panda
编译完成后,QEMU二进制文件位于build文件夹下;
还需要创建一个用于PANDA的Qcow(磁盘映像)
PIP安装Python接口:PyPanda
安装一些依赖:
apt install libvdeplug-dev libpng16-16 libsdl2-2.0-0
pip3 install pandare
这将安装基于 python 的 PANDA 分析所需的一切,但不会安装独立的 PANDA 二进制文件。 这个包不会自动更新,所以它可能落后于 PANDA 的 master 分支。
Docker安装
panda
容器:安装了 Panda 和 PyPANDA 以及它们的运行时依赖项的容器,但没有构建工件或源代码以减小容器的大小。
pandadev
容器:安装了 Panda和 PyPANDA 以及它们的运行时依赖项的容器,所有构建工件和源代码以及目录中此存储库的内容。(适合开发者)
$ docker pull pandare/pandadev |
记录Record和重放Replay
确定性记录和重放是一种用于捕获系统的 非确定性输入的技术(如果系统使用相同的输入从同一点重新启动,会导致系统行为不同的事物。)
- Panda记录的非确定性输入是对 CPU 状态和内存所做的更改——DMA、中断、in指令等等
- Panda不记录设备的输入
- 想象在CPU与RAM外画个圈,记录从外部世界跨过这条线的东西
记录Record
可以使用 QEMU 监视器中的 begin_record
和 end_record
命令来记录执行情况。
- begin_record
- 开始录制会话,另存为
,会覆盖之前的记录 - 会生成两个文件:
- VM 快照
<name>-rr-snp
- 所有非确定性输入的日志
<name>-rr-nondet.log
- VM 快照
- 开始录制会话,另存为
- end_record
- 结束活动的录制会话,guest将被暂停,但可以恢复,并且一旦恢复guest,就可以进行另一次录制。
监视器,使用 -monitor stdio
运行 QEMU(也有更复杂的设置)。 输入 begin_record "replay_name"
开始录制过程,并使用 end_record
结束它。
重放Replay
重放记录(replay recording):可以使用 (这两个文件)panda-system-$arch -replay replay_name
。确保将相同的内存大小传递给 VM,就像记录所做的那样。否则 QEMU 将失败并出现无法理解的错误。
仅仅运行重放本身并不是很有用,可以启用一些插件,对重放的执行进行分析。
分享记录
Pande支持打包和解压记录
- 打包记录(这将捆绑
<name>-rr-snp
与<name>-rr-nondet.log
放入<name>.rr
):scripts/rrpack.py <name>
- 解压记录
scripts/rrunpack.py <name>.rr
分析
捕获重放(Replay)后,可以多次播放它。通常首先使用标准分析来尝试了解正在发生的事情的基本情况,然后使用自定义插件(panda_plugins
目录)来进行更具体的分析。
常用于开始分析的插件:asidstory
、 stringsearch
和 file_taint