文章目录
- 前言
- 1、概述
- 2、安装与使用
- 2.1、源码安装
- 2.1.1、部署系统依赖组件
- 2.1.2、使用源码安装系统
- 2.2、使用方法
- 2.2.1、命令行界面操作方法
- 2.2.2、图形界面操作方法
- 3、测试用例
- 4、参考文献
- 总结
前言
本博客的主要内容为Polypyus的部署、使用与原理分析。本博文内容较长,因为涵盖了Polypyus的几乎全部内容,从部署的详细过程到如何使用Polypyus进行漏洞检测,以及对Polypyus进行漏洞检测的原理分析,相信认真读完本博文,各位读者一定会对Polypyus有更深的了解。以下就是本篇博客的全部内容了。
1、概述
Polypyus是一个用于固件分析和漏洞研究的工具,主要用于定位原始固件二进制文件中的函数。它通过从类似的二进制文件中提取已知函数来学习,而无需对这些文件进行反汇编。这种方法使得Polypyus能够在几秒钟内快速运行,并且对于那些难以反汇编并且常规工具容易错过函数的二进制文件尤其有用。
与现有工具如Ghidra、IDA、BinDiff和Diaphora集成,Polypyus可以导入先前注释过的函数并从中学习,并且可以将找到的函数导出以便导入到IDA中。通过与这些工具的集成,Polypyus可以帮助改善自动分析结果,并为进一步固件分析提供更准确的基础。
Polypyus主要解决了在固件分析过程中常见的问题,例如IDA自动分析错误地识别函数的起始位置,导致误报或遗漏。它还针对BinDiff等工具在寻找字节完全相同但由于不同的调用图而无法匹配的函数时的失败情况提供了解决方案。
该工具还提供了一种可选的功能,即从已注释的输入二进制文件中学习常见函数的起始位置,并将其应用于其它二进制文件以识别函数而无需匹配其名称。这可以帮助提高对那些没有明确函数标识的二进制文件的分析准确性。
总的来说,Polypyus是一个用于快速而准确地定位固件二进制文件中函数的工具,它的灵活性和集成能力使其成为固件分析和漏洞研究工作流程中的有力辅助。此外Polypyus工具基于Python语言、Html语言和Css语言开发。
2、安装与使用
软件环境 | 硬件环境 | 约束条件 |
---|---|---|
Ubuntu 20.04.1 LTS(内核版本5.4.0-42-generic) | 使用2个处理器,每个处理器3个内核,共分配6个内核 | 本文所讲解的Polypyus源代码于2024.04.23下载 |
具体的软件环境可见“2.1、源码安装”章节所示的软件环境 | 内存8GB | 本文所安装的Polypyus源代码于2024.04.23下载 |
硬盘200GB | 具体的约束条件可见“2.1、源码安装”章节所示的软件版本约束 | |
Polypyus部署在VMware Pro 17上的Ubuntu 20.04.1系统上(主机系统为Windows 11),硬件环境和软件环境也是对应的VMware Pro 17的硬件环境和软件环境 |
2.1、源码安装
2.1.1、部署系统依赖组件
Polypyus所依赖的组件较少,并且依赖的所有组件都可以通过命令直接安装,所以较简单。我们可以执行如下命令来下载安装Polypyus所依赖的一些基础组件。
$ sudo apt-get update
$ sudo apt-get install git -y
$ sudo apt-get install python3-pip -y
2.1.2、使用源码安装系统
- 首先来到当前用户的根目录,并下载Polypyus的源代码,最后进入其目录中:
$ cd ~
$ git clone https://github.com/seemoo-lab/polypyus.git
$ cd polypyus/
- 然后执行如下命令来安装Polypyus:
$ pip install .
- 然后执行如下命令查看Polypyus的命令行是否安装成功:
$ polypyus-cli --help
-
出现如下图所示的内容即代表Polypyus的命令行安装成功:
-
然后执行如下命令查看Polypyus的图形界面是否安装成功:
$ polypyus-gui --help
-
出现如下图所示的内容即代表Polypyus的图形界面安装成功:
-
然后我们执行如下命令来进入Polypyus的图形界面:
$ polypyus-gui
- 然后就会打开Polypyus的图形界面,此时我们就完成了关于Polypyus的部署:
注:实际执行中遇到的问题及解决方法
A 问题1:
-
在步骤2安装Polypyus的时候,出现如下图所示的问题:
-
出现该问题是因为pip版本较低,导致Pyqt5安装失败。为了解决该问题,我们只需要顺序执行如下命令来升级pip并手动安装Pyqt5:
$ sudo python3 -m pip install --upgrade pip
$ sudo python3 -m pip install pyqt5
- 此时我们就解决了该问题,我们只需要回到步骤3重新继续向下操作即可
B 问题2:
-
在步骤3对查看Polypyus是否安装成功的时候,出现如下图所示的问题:
-
出现该问题是因为我们没有添加环境变量。为了解决该问题,我们首先打开如下文件:
$ gedit ~/.bashrc
-
在打开的文件中,添加如下内容,最后保存修改后退出:
-
然后执行如下命令使修改生效:
$ source ~/.bashrc
- 此时我们就解决了该问题,我们只需要回到步骤4重新继续向下操作即可
C 问题3:
-
在步骤7进入Polypyus的图形界面的时候,出现如下图所示的问题:
-
出现该问题是因为缺少组件,我们只需要执行如下命令来安装缺少的组件即可:
$ sudo apt-get install libxcb-xinerama0 -y
- 此时我们就解决了该问题,我们只需要回到步骤6重新继续向下操作即可
2.2、使用方法
Polypyus为用户提供了两种使用方法,分别是命令行界面操作和图形界面操作。本章节将会介绍如何通过这两种方式来操作Polypyus。
2.2.1、命令行界面操作方法
我们可以使用如下命令来使用Polypyus。注意:该命令执行的是“/home/iie-iisd/.local/bin/polypyus-cli”二进制程序。
polypyus-cli [OPTIONS]
该命令用给定的历史(带注释的二进制文件)生成匹配器,进而分析目标。可以发现该命令可以添加选项以用作不同的操作,为了方便后续使用,将对于这些选项的具体使用方法以及含义总结为下表。
选项 | 含义 |
---|---|
-v, --verbose | 日志详细级别,默认显示警告。-v显示信息,-vv显示调试信息 [默认: 0] |
–history PATH | 将二进制文件添加到历史中 [默认: ] |
–annotation PATH | 为历史元素添加注释,每一个历史元素需要一个注释,反之亦然 [默认: ] |
–target PATH | 添加要分析的目标二进制文件 [默认: ] |
–parallelize/–no-parallelize | 使用多进程进行分析 [默认: False] |
–min-size INTEGER | 函数需要具有的最小字节数以进行匹配器创建 [默认: 28] |
–max-rel-fuzz FLOAT | 最大相对匹配器模糊度 [默认: 0.5] |
–project TEXT | 设置项目文件的位置,可以是文件路径或":memory:" [默认: :memory:] |
–list-history/–no-list-history | 列出项目中注册的带注释二进制文件 [默认: False] |
–list-targets/–no-list-targets | 列出项目中注册的目标 [默认: False] |
–install-completion [bash | zsh |
–show-completion [bash | zsh |
–help | 显示此帮助信息并退出。 |
2.2.2、图形界面操作方法
- 首先执行如下命令启动Polypyus的图形界面:
$ cd ~
$ polypyus-gui
-
然后会打开如下图所示的图形界面:
-
然后可按如下图所示添加历史文件:
-
添加历史文件后,可按如下图所示添加该历史文件对应的注释:
-
然后可以按如下图所示添加要分析的目标二进制文件:
-
然后可以按如下图所示来根据历史文件创建匹配器:
-
然后可以按如下图所示匹配目标二进制文件:
-
若要进行批目标二进制文件匹配,可以按如下图所示进行选择:
3、测试用例
在本章节中,我们将使用Polypyus自带的测试文件进行测试,这些测试文件位于“/polypyus/firmware/history”目录中。此外,使用Polypyus的图形界面进行整个测试。下面就是本章节使用Polypyus对测试文件进行测试的全部流程。
- 首先执行如下命令启动Polypyus的图形界面:
$ cd ~
$ polypyus-gui
-
然后会打开如下图所示的图形界面:
-
然后按如下图所示添加第一个历史文件:
-
在这里我们选择“/polypyus/firmware/history/20739B1.bin”作为第一个历史文件导入:
-
然后按如下图所示添加该历史文件对应的注释:
-
在这里我们选择“/polypyus/firmware/history/20739B1_patch.elf”作为该历史文件对应的注释:
-
将其导入:
-
然后按如下图所示添加第二个历史文件:
-
在这里我们选择“/polypyus/firmware/history/20819-A1.bin”作为第二个历史文件导入:
-
然后按如下图所示添加该历史文件对应的注释:
-
在这里我们选择“/polypyus/firmware/history/20819-A1_patch.elf”作为该历史文件对应的注释:
-
将其导入:
-
然后按如下图所示添加要分析的目标二进制文件:
-
在这里我们选择“/polypyus/firmware/history/20735B1.bin”作为要分析的目标二进制文件:
-
然后按如下图所示来根据历史文件创建匹配器:
-
然后按如下图所示匹配目标二进制文件:
-
当匹配完成后,会打印匹配的结果。可以发现,在该次测试中,共匹配到2344个函数,并且获取到了其起始位置和大小:
-
若要将此次测试结果保存,我们可以按如下图所示进行操作:
-
在这里,我们将其保存为“/home/iie-iisd/polypyus/firmware/history/output.csv”:
-
若想查看保存到本地的匹配结果,可使用下面的命令:
$ gedit /home/iie-iisd/polypyus/firmware/history/output.csv
- 可以发现,成功将我们刚刚测试得到的匹配结果保存到本地了:
4、参考文献
- Polypyus:一款功能强大的固件源码分析工具
- seemoo-lab/polypyus
- python - AttributeError: module ‘sipbuild.api’ has no attribute ‘prepare_metadata_for_build_wheel’ for PyQt5 5.15.0
总结
以上就是本篇博文的全部内容,可以发现,Polypyus的部署与使用过程并不复杂,我们本篇博客对其进行了详细的分析。相信读完本篇博客,各位读者一定对Polypyus有了更深的了解。