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
```

标签:Patchelf, Python, 二进制漏洞利用, 域名收集, 无后门, 自动化初始化, 逆向工具