sasha-999/pwninit.py

GitHub: sasha-999/pwninit.py

用于自动初始化 CTF pwn 题目环境,自动匹配下载正确版本的 glibc 及依赖库、恢复调试符号、修补二进制文件并生成解题脚本模板。

Stars: 13 | Forks: 5

# pwninit.py 一个用于初始化 ctf pwn 题目的工具,基于 https://github.com/io12/pwninit。 ## 特性 * 下载正确的解释器以运行二进制文件。 * 下载二进制文件所需的其他标准 glibc 库,例如 `libpthread` 或 `libm`。 * 下载调试符号并恢复所有库(包括 `libc.so.*`、`ld-linux.so.*` 及其他库)的符号信息。 * 修补二进制文件以使用正确的解释器和库,可选择手动或使用 `patchelf`。 * 从一系列可自定义的模板中编写一个解题脚本到当前目录。 * 获取 glibc 源代码以实现更好调试的脚本。 * 支持 Ubuntu/Debian glibc。 ## 安装依赖 运行 ``` ./install_dependencies.sh pip3 install -r requirements.txt ``` 注意:需要 python 3.6+ ## 用法 ### `pwninit.py` 在包含二进制文件(以及提供的库,如果有的话)的文件夹内运行 `pwninit.py`,它会自动查找二进制文件和库。 你也可以使用 `-b/--bin`、`--libc` 和 `--ld` 来指定二进制文件、libc 或解释器。 ### `pwnsrc.py` 这是一个附加脚本,它使用 `libc` 来下载 glibc 源代码文件。 这在结合调试符号和像 `gdb` 这样的调试器时非常有用,它可以列出与程序当前执行点相关的源代码,并且在你需要调试 glibc 某些部分(如 `malloc`、`printf`、`dl-runtime` 等)的内部工作原理时非常有帮助。 首次运行 `pwnsrc.py` 将下载一个包含 glibc 源代码的 `.tar.xz` 归档文件,并使用 libc 获取正确的版本。 与 `pwninit.py` 类似,`pwnsrc.py` 会自动查找 libc,也可以通过 `--libc` 指定。 一旦归档文件下载完成,你就可以开始从中提取文件,可以手动提取,也可以使用 `--files` 提取。 可以使用 `--files` 指定任意数量的文件,可以是基本名称(例如 `malloc.c`)或完整路径(例如 `glibc-2.31/malloc/malloc.c`)。 如果归档文件存在,`pwnsrc.py` 会自动查找它,也可以通过 `-s/--source` 指定。 ### 自定义 `solve.py` 模板 你可以使用 `-t/--template` 指定要使用的模板。 默认提供了两个模板,但你可以通过在 `templates` 文件夹中添加或编辑文件来更改它们,当你运行 `-h/--help` 时也会提供该文件夹的路径。 模板中的字符串 `{bindings}` 用于替换二进制文件、libc 和解释器的 `ELF("")` 初始化内容。 ### `config.py` 该文件包含一些可以通过编辑文件来更改的配置选项。 这些选项包括: * `solve.py` 模板中 `binary`、`libc`、`ld` 的名称。 * 默认的 `solve.py` 模板。 * 是否默认使用 `patchelf`。 当你运行 `-h/--help` 时会提供该文件的路径。 ### 修补 与原版 [pwninit](https://github.com/io12/pwninit) 的一个主要区别是,默认情况下手动修补二进制文件。 这样做的主要原因是,尽管 `patchelf` 更通用,但它的修补方法可能会对二进制文件产生副作用。 这是因为它必须调整大小并移动数据段,因此二进制文件加载到内存中的方式与未修补时不同。 虽然这通常不会影响二进制文件的预期行为,但有时会影响漏洞利用,这是一个问题,因为 `pwninit` 的核心意义在于模拟远程环境。 这不是一个很常见的问题,所以在大多数情况下 `patchelf` 是没问题的,但我个人过去曾遇到过 `patchelf` 的问题。 这种手动修补的方式实际上是 `patchelf --replace-needed` 和 `patchelf --set-interpreter` 的简化版本,但它使用了比目标字符串更短的符号链接相对路径。 可以使用 `--use-patchelf` 禁用此功能。 ## 示例 ### `pwninit.py` ``` $ ls chall libc.so.6 $ readelf -Wd ./chall | grep NEEDED 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0] $ pwninit.py [*] bin: chall (arch = 'amd64') [*] libraries: {'libc': 'libc.so.6'} [*] libc: libc.so.6 [*] libc version: (Ubuntu GLIBC 2.31-0ubuntu9.2) stable release version 2.31. [*] Fetching 'libpthread.so.0', 'ld-linux-x86-64.so.2' from https://launchpad.net/ubuntu/+archive/primary/+files/libc6_2.31-0ubuntu9.2_amd64.deb [+] Successfully fetched 'libpthread.so.0' [+] Successfully fetched 'ld-linux-x86-64.so.2' [*] Finding stripped libraries to unstrip [*] Unstripping 'libc.so.6', 'libpthread.so.0', 'ld-linux-x86-64.so.2' [*] Fetching debug symbols from https://launchpad.net/ubuntu/+archive/primary/+files/libc6-dbg_2.31-0ubuntu9.2_amd64.deb [+] Successfully unstripped 'libc.so.6' [+] Successfully unstripped 'libpthread.so.0' [+] Successfully unstripped 'ld-linux-x86-64.so.2' [*] Patching binary manually [*] Symlinking './ld' -> 'ld-linux-x86-64.so.2' [*] Symlinking './libc' -> 'libc.so.6' [*] Symlinking './libpthread' -> 'libpthread.so.0' [+] Successfully wrote patched binary to 'chall_patched' [*] Writing solve.py [+] Successfully written solve.py $ ls chall chall_patched ld ld-linux-x86-64.so.2 libc libc.so.6 libpthread libpthread.so.0 solve.py ``` ### `pwnsrc.py` ``` $ ls dd1 libc-2.23.so $ pwnsrc.py [*] libc: libc-2.23.so [*] libc version: (Ubuntu GLIBC 2.23-0ubuntu10) stable release version 2.23, by Roland McGrath et al. [*] Fetching glibc source from https://launchpad.net/ubuntu/+archive/primary/+files/glibc-source_2.23-0ubuntu10_all.deb [+] Successfully written glibc-source to 'glibc-source-2.23.tar.xz' $ ls dd1 glibc-source-2.23.tar.xz libc-2.23.so $ pwnsrc.py --files malloc.c [*] libc: libc-2.23.so [*] libc version: (Ubuntu GLIBC 2.23-0ubuntu10) stable release version 2.23, by Roland McGrath et al. [*] glibc source: glibc-source-2.23.tar.xz [*] Finding source code files [+] Successfully extracted 'malloc.c' $ ls dd1 glibc-source-2.23.tar.xz libc-2.23.so malloc.c ``` ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/647b078e49063407.png)
标签:Patchelf, Python, 二进制漏洞利用, 域名收集, 无后门, 自动化初始化, 逆向工具