5

如何解包 Python 恶意可执行文件

 2 years ago
source link: https://netsecurity.51cto.com/article/708689.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何解包 Python 恶意可执行文件-51CTO.COM

如何解包 Python 恶意可执行文件
作者:Avenger 2022-05-11 14:50:34
使用 Python 编写的程序通常以源码的形式发布,也可以将所有依赖都打包到一个可执行文件中。那么如何解包 Python 恶意可执行文件呢?

使用 Python 编写的程序通常以源码的形式发布,也可以将所有依赖都打包到一个可执行文件中。那么如何解包 Python 恶意可执行文件呢?

打包与加壳不同,打包 Python 程序的目的是创建一个可以在操作系统上独立运行的可执行文件。使用例如 PyInstaller 这类打包工具时,会执行以下操作:

  • 将所有.py 源文件编译为 python 字节码文件(.pyc文件)
  • 整合所有 python 编译的源代码和 python 依赖,包括依赖于操作系统的 python 解释器(Linux 上的 libpython3.9.so.1.0 或 Windows 上的 python37.dll)
  • 将所有资源都打包在一起,执行时将这些资源都解压到内存中,然后使用解释器解释执行原始 python 代码

以 Windows 平台为例,将示例代码使用 PyInstaller 进行打包:

d5124e987f0d430ced11668ac1456111634c1b.jpg

直接运行脚本文件是很容易的:

43e03d26135c386d62e483564daec3b0a69e8e.jpg

打包如下所示:

12d108241185411bb0b005da13d45b7b74c6f7.jpg

打包得到的 evil_program.exe可以直接运行,可得到与脚本相同的运行结果。此时,程序可以移动到另一个完全没有 Python 环境的机器上一样可以执行。

78832b78559baadb56a1372567dc76e5e79a94.jpg

在 Windows 上解包 Python<3.9

如果样本中可以看到很多以 py 开头的字符串,基本可以断定是一个打包的 Python 程序。

2413ce81099a173065d2344b09b790e037a957.jpg

对于 PyInstaller 来说,还有独特字符串 MEIPASS。

监控运行程序时在临时文件夹中创建了哪些文件,就能够知道使用的 Python 版本。例如 python38.dll 意味着使用的是 Python 3.8 版本。

0831eb714bf0174bbfd3968715d9d75338c849.jpg

监控文件系统

想要恢复源代码,必须要保证:

  • 解压得到所有文件,特别是编译后的字节码文件(.pyc)
  • 反编译感兴趣的 .pyc 文件

解压可以使用 pyinstxtractor,使用相同版本的 Python 即可解压得到文件:

b6f182b9523e3f88570666270c92a617e70baa.jpg

pyinstxtractor 还额外提供了哪些是 Python 程序文件的信息,尽管存在误报但是也有很大的帮助。可以看到主文件是 evil_program.pyc:

18e36c826860c774890209677ed596aa0aff0e.jpg

接着使用 uncompyle6进行反编译,值得注意的是 uncompyle6 只支持到 Python 3.8。

62c828063c7ad3ee389279b6f75170c7284f06.jpg

在 Linux 上解包 Python>=3.9

再次使用 pyinstxtractor 解压样本文件。由于样本是 64 位 ELF 文件,不能直接使用 pyinstxtractor 需要将文件的 pydata 转存到一个单独的文件再执行 pyinstxtractor。

e92ac2994a7a6eb13aa6249e165324adea1b29.jpg

解包成功如下所示,也需要配合相应的 Python 版本:

a8e99fe843ba1e3b50980274904da72e8d6e79.jpg

解压后的数据中有一个 RansomWare.pyc,就是需要关注的内容。由于使用 Python 3.9,需要 Decompyle++进行反编译。该工具美中不足的就是没有文档讲解如何进行构建,如下所示:

133744531f8fd4a1436384657047b8523fe014.jpg

构建反编译工具

如果想要从任何地方调用 pycdc 命令,也可以运行 sudo make install。

pycdc 是反编译命令,使用它来恢复 RansomWare.pyc 的源代码:

21db97569029dce83399215c04bfebef88590b.jpg

当然,某些情况下也会遇到反编译失败的问题。但大部分代码还是可以正常进行反编译的:

e98a1f577f85a9b49d897262747903a6e35d1c.jpg

反编译失败

反编译失败时,可以使用 pycdas 命令来恢复“反汇编”的字节码。

092397a3470d11195d8120fd8d7102151aaded.jpg

write_key() 函数的字节码反汇编

本文介绍了如何解压和反编译使用 PyInstaller 打包的 Python 程序,在应对使用 Python 编写的恶意软件时可以在源码级进行分析,可以大大提高效率。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK