给个三连球球了
pwntools原文[点击]
目录
3. 数据打包与解包 (pwnlib.util.packing)
5. 循环模式生成 (pwnlib.util.cyclic)
7. Shellcode 生成 (pwnlib.shellcraft)
pwntools
python中使用pwntools
from pwn import *
pwntools
核心功能总结
pwntools
是一个专为二进制漏洞利用开发设计的强大 Python 库。以下是其核心功能的简要总结:
1. 环境配置 (pwnlib.context
)
- 功能:设置目标架构、操作系统、字节序等。
- 示例:
from pwn import * context.arch = 'amd64'#i386 context.os = 'linux' context.log_level = 'debug'
- 用途:确保你的利用代码能够在目标系统上正确运行。
2. 通信通道 (pwnlib.tubes
)
- 功能:统一接口处理远程连接、本地进程、监听器等。
- 常用方法:
recvline()
: 接收一行数据。recvuntil(delimiter)
: 接收到指定的分隔符。clean()
: 清理缓冲区。interactive()
: 与应用进行交互。
- 示例:
from pwn import * p = remote('example.com', 1234) p.recvuntil(b': ') p.sendline(b'password') p.interactive()
3. 数据打包与解包 (pwnlib.util.packing
)
- 功能:提供
p32
,u32
,p64
,u64
等函数,简化字节序转换。 - 示例:
from pwn import * addr = p32(0xdeadbeef) print(addr) # 输出: b'\xef\xbe\xad\xde'
4. 日志记录 (pwnlib.log
)
- 功能:控制输出信息,使调试更加方便。
- 示例:
from pwn import * log.info("This is an info message") log.debug("This is a debug message")
5. 循环模式生成 (pwnlib.util.cyclic
)
- 功能:生成循环模式字符串,帮助确定缓冲区溢出中的偏移量。
- 示例:
from pwn import * pattern = cyclic(100) print(pattern) offset = cyclic_find(0x61616171) print(offset) # 输出: 64
6. 汇编与反汇编 (pwnlib.asm
)
- 功能:将汇编代码转换为机器码,反之亦然。
- 示例:
from pwn import * shellcode = asm(shellcraft.sh()) print(hexdump(shellcode))
7. Shellcode 生成 (pwnlib.shellcraft
)
- 功能:内置大量 Shellcode 模板,方便生成自定义 Shellcode。
- 示例:
from pwn import * shellcode = shellcraft.sh() print(shellcode)
8. ELF 文件操作 (pwnlib.elf
)
- 功能:解析符号、内存映射,修改并保存二进制文件。
- 示例:
from pwn import * elf = ELF('./vulnerable_binary') print(elf.symbols['main'])
9. 动态解析函数地址 (pwnlib.dynelf
)
- 功能:动态解析任意函数地址,适用于 ASLR 环境。
- 示例:
from pwn import * dynelf = DynELF(leak_function, ptr_to_libc) system_addr = dynelf.lookup('system', 'libc') print(hex(system_addr))
10. ROP 链生成 (pwnlib.rop
)
- 功能:自动生成 ROP 链,绕过 NX/DEP 保护机制。
- 示例:
from pwn import * rop = ROP(elf) rop.system(next(elf.search(b'/bin/sh'))) print(rop.dump())
11. GDB 集成 (pwnlib.gdb
)
- 功能:启动和调试二进制程序,设置断点,加速漏洞开发。
- 示例:
from pwn import * p = process('./vulnerable_binary') gdb.attach(p, gdbscript='break main\ncontinue')
12. 命令行参数处理 (args
)
- 功能:快速访问和处理命令行参数,支持日志等级和终端偏好设置。
- 示例:
from pwn import * if args.REMOTE: p = remote('example.com', 1234) else: p = process('./vulnerable_binary')
13. 其他实用工具
- 网络操作 (
pwnlib.util.net
):查询网络接口。 - 进程操作 (
pwnlib.util.proc
):查询进程信息。 - 安全评估 (
pwnlib.util.safeeval
):安全执行 Python 表达式。 - 字符串处理:
hexdump
,enhex
,unhex
,urlencode
,urldecode
等。 - 文件操作:
read
,write
,which
,wget
等。
详细解释
pwn asm
子命令
pwn asm
用于将汇编语言代码转换成机器码,生成 shellcode。
基本用法
pwn asm <line> [options]
<line>
: 需要被汇编的代码。如果没有提供,将从标准输入流中读取。
选项
[-h]
或[--help]
: 显示帮助信息并退出。[-f {raw,hex,string,elf}]
或[--format {raw,hex,string,elf}]
: 格式化输出。默认为十六进制。[-o <file>]
或[--output <file>]
: 指定输出文件。默认为标准输出。[-c {16,32,64,android,cgc,freebsd,linux,windows,...}]
或[--context {16,32,64,android,cgc,freebsd,linux,windows,...}]
: 指定目标平台的上下文。默认为linux/i386
。[-v <avoid>]
或[--avoid <avoid>]
: 编码 shellcode 以避免指定的字符(以十六进制提供)。默认为000a
。[-n]
或[--newline]
: 编码 shellcode 以避免换行符。[-z]
或[--zero]
: 编码 shellcode 以避免空字节。[-d]
或[--debug]
: 使用 GDB 调试 shellcode。[-e <encoder>]
或[--encoder <encoder>]
: 指定编码器。[-i <infile>]
或[--infile <infile>]
: 指定输入文件。[-r]
或[--run]
: 运行输出。
示例
-
将汇编代码转换为十六进制机器码
pwn asm "mov eax, 0x1; mov ebx, 0x0; int 0x80" -f hex
-
生成避免空字节的 shellcode
pwn asm "mov eax, 0x1; mov ebx, 0x0; int 0x80" -z
-
将汇编代码保存到文件
pwn asm "mov eax, 0x1; mov ebx, 0x0; int 0x80" -o output.bin
pwn checksec
子命令
pwn checksec
用于检查 ELF 文件的安全性特性,如栈保护、地址空间布局随机化(ASLR)、NX 位等。
基本用法
pwn checksec <elf> [options]
<elf>
: 需要检查的 ELF 文件。
选项
[-h]
或[--help]
: 显示帮助信息并退出。[--file <elf>]
: 指定要检查的文件。这个选项是为了兼容checksec.sh
脚本而提供的。
示例
-
检查一个 ELF 文件的安全性特性
pwn checksec /path/to/binary
-
使用
--file
选项检查pwn checksec --file /path/to/binary
pwn constgrep
子命令
pwn constgrep
用于搜索特定的常量值或正则表达式匹配的常量值。这对于在代码中查找特定的数值或符号非常有用。
基本用法
pwn constgrep <regex> [options]
<regex>
: 用于匹配常量的正则表达式。<constant>
: 需要查找的具体常量值。
选项
[-h]
或[--help]
: 显示帮助信息并退出。[-e <constant>]
或[--exact <constant>]
: 执行精确匹配而不是正则表达式搜索。[-i]
或[--case-insensitive]
: 忽略大小写进行搜索。[-m]
或[--mask-mode]
: 搜索值中不包含严格少于给定值的位数。[-c {16,32,64,android,cgc,freebsd,linux,windows,...}]
或[--context {16,32,64,android,cgc,freebsd,linux,windows,...}]
: 指定目标平台的上下文。默认为linux/i386
。
示例
-
搜索特定的常量值
pwn constgrep 0x12345678
-
使用正则表达式搜索常量
pwn constgrep "0x[1234][5678]"
-
忽略大小写进行搜索
pwn constgrep "0x12345678" -i
-
执行精确匹配
pwn constgrep -e 0x12345678
-
指定目标平台
pwn constgrep 0x12345678 -c linux/amd64
pwn cyclic
子命令
pwn cyclic
用于生成循环模式(cyclic pattern),这些模式在缓冲区溢出攻击中非常有用,因为它们可以帮助确定溢出点的位置。
基本用法
pwn cyclic <count> [options]
<count>
: 要生成的字符数。
选项
[-h]
或[--help]
: 显示帮助信息并退出。[-a <alphabet>]
或[--alphabet <alphabet>]
: 用于生成循环模式的字符集。默认为所有小写字母。[-n <length>]
或[--length <length>]
: 唯一子序列的大小。默认为 4。[-c {16,32,64,android,cgc,freebsd,linux,windows,...}]
或[--context {16,32,64,android,cgc,freebsd,linux,windows,...}]
: 指定目标平台的上下文。默认为linux/i386
。[-l <lookup_value>]
或[-o <lookup_value>]
或[--offset <lookup_value>]
或[--lookup <lookup_value>]
: 查找特定值在循环模式中的位置,而不是打印整个模式。
示例
-
生成 100 个字符的循环模式
pwn cyclic 100
-
使用自定义字符集生成循环模式
pwn cyclic 100 -a "abc"
-
生成唯一子序列长度为 8 的循环模式
pwn cyclic 100 -n 8
-
查找特定值在循环模式中的位置
pwn cyclic 100 -l "aaaa"
-
指定目标平台
pwn cyclic 100 -c linux/amd64
pwn debug
使用指南
pwn debug
是 pwntools
提供的一个强大功能,用于调试二进制文件或进程。它通过整合 GDB(GNU Debugger)的强大功能,使得安全研究人员和开发者能够对程序的内部运作进行深入的探索和分析。以下是 pwn debug
的主要用法和选项的详细解释:
基本用法
-
命令结构:
pwn debug [options]
-
选项:
-
-h, --help
: 显示帮助信息并退出。如果您不确定某个选项的具体用法,可以随时使用此选项获取更多信息。 -
-x <gdbscript>
: 从指定的文件中执行 GDB 命令。这非常适合自动化调试流程,比如自动设置断点、打印变量值等。 -
--pid <pid>
: 指定要附加的进程ID。当您需要调试一个已经在运行的进程时,这个选项非常有用。 -
--context {16,32,64,...}
: 设置调试环境的上下文。这包括操作系统、架构、字节序(大端或小端)、位宽等。例如,如果您正在调试一个 64 位的 Linux 程序,可以使用--context amd64
。 -
--exec <executable>
: 指定要调试的可执行文件。这是最常用的选项之一,用于启动一个新的调试会话。 -
--process <process_name>
: 通过进程名称指定要附加的进程。如果已知进程名称但不知道确切的 PID,可以使用此选项。 -
--sysroot <sysroot>
: 设置 GDB 的系统根路径。这在跨平台调试或使用特定环境时非常有用。
-
示例
1.假设我们有一个名为 example_program
的可执行文件,我们想对其进行调试,并且我们知道它是一个 32 位的 Linux 应用程序。以下是如何使用 pwn debug
启动调试会话:
pwn debug --context i386 --exec ./example_program
这条命令将启动 GDB,并加载 example_program
文件,同时设置调试上下文为 32 位的 Linux 环境。
2.如果您有一个 GDB 脚本文件 gdb_commands.txt
,其中包含了一些预设的调试命令,您可以这样使用:
pwn debug -x gdb_commands.txt --exec ./example_program
pwn disablenx
使用指南
pwn disablenx
是一个用于禁用可执行文件的 NX(No-eXecute)保护的工具。NX 保护是一种安全机制,它防止数据区域(如堆栈)上的代码执行,从而减少缓冲区溢出攻击的可能性。然而,在某些情况下,比如在研究或开发特定的漏洞利用时,可能需要禁用这种保护。
基本用法
-
命令结构:
pwn disablenx [options] elf
-
选项:
-h, --help
: 显示帮助信息并退出。如果您不确定某个选项的具体用法,可以随时使用此选项获取更多信息。
-
elf
: 指定要检查或修改的 ELF 文件。这是您想要禁用 NX 保护的二进制文件。
示例
假设我们有一个名为 vulnerable_binary
的可执行文件,我们想禁用它的 NX 保护,可以使用以下命令:
pwn disablenx ./vulnerable_binary
这条命令将会修改 vulnerable_binary
文件,使其不再具有 NX 保护。请注意,这样做可能会降低程序的安全性,因此只应在受控环境中使用。
pwn hex
子命令
pwn hex
用于将数据转换为十六进制表示形式。这对于处理二进制数据和调试非常有用。
基本用法
pwn hex <data> [options]
<data>
: 需要转换为十六进制的数据。可以是字符串或二进制数据。- 选项:
-h
或--help
: 显示帮助信息并退出。
示例
-
将字符串转换为十六进制:
pwn hex "Hello, World!"
输出:
48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21
-
将文件内容转换为十六进制:
cat data.bin | pwn hex
pwn phd
子命令
pwn phd
用于生成文件的十六进制转储(hexdump)。这对于查看和分析二进制文件的内容非常有用。
基本用法
pwn phd <file> [options]
<file>
: 需要进行十六进制转储的文件。如果未指定文件,则从标准输入读取数据。- 选项:
-h
或--help
: 显示帮助信息并退出。-w <width>, --width <width>
: 每行显示的字节数。默认值通常是 16。-l <highlight>, --highlight <highlight>
: 高亮显示特定的字节。-s <skip>, --skip <skip>
: 跳过初始的字节数。-c <count>, --count <count>
: 只显示指定数量的字节。-o <offset>, --offset <offset>
: 左侧列的地址从指定的偏移量开始。--color {always,never,auto}
: 控制输出是否带有颜色。默认值是auto
,即仅当标准输出是终端时才启用颜色。
示例
-
生成文件的十六进制转储:
pwn phd data.bin
输出:
00000000: 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a Hello, World!.
-
生成文件的十六进制转储,并指定每行显示 5 个字节:
pwn phd -w 5 data.bin
输出:
00000000: 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a
-
生成文件的十六进制转储,并跳过前 5 个字节:
pwn phd -s 5 data.bin
输出:
00000005: 2c 20 57 6f 72 6c 64 21 0a
-
生成文件的十六进制转储,并只显示前 10 个字节:
pwn phd -c 10 data.bin
输出:
00000000: 48 65 6c 6c 6f 2c 20 57 6f 72
-
生成文件的十六进制转储,并从地址 0x100 开始显示:
pwn phd -o 100 data.bin
输出:
00000100: 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a
-
生成文件的十六进制转储,并高亮显示字节
6f
:pwn phd -l 6f data.bin
输出(假设高亮显示为红色):
00000000: 48 65 \033[31m6c\033[0m 6c 6f 2c 20 57 6f 72 6c 64 21 0a
pwn pwnstrip
子命令
pwn pwnstrip
用于剥离 ELF 文件中的调试信息和其他不必要的元数据,以减小文件大小并提高安全性。这对于发布最终版本的二进制文件非常有用。
基本用法
pwn pwnstrip <file> [options]
<file>
: 需要剥离的 ELF 文件。- 选项:
-h
或--help
: 显示帮助信息并退出。-b
或--build-id
: 剥离构建 ID。-p <function>
或--patch <function>
: 修补指定的函数。-o <output>
或--output <output>
: 指定输出文件的路径。
示例
-
剥离 ELF 文件的调试信息:
pwn pwnstrip /path/to/binary
-
剥离构建 ID:
pwn pwnstrip -b /path/to/binary
-
修补指定的函数:
pwn pwnstrip -p main /path/to/binary
-
指定输出文件:
pwn pwnstrip -o /path/to/output /path/to/binary
pwn scramble
子命令
pwn scramble
用于生成混淆的 shellcode,以避免特定的字符或字节。这对于绕过某些安全机制(如 ASLR 和 NX 位)非常有用。
基本用法
pwn scramble [options]
- 选项:
-h
或--help
: 显示帮助信息并退出。-f {raw,hex,string,elf}
或--format {raw,hex,string,elf}
: 输出格式,默认为hex
(对于终端)或raw
。-o <file>
或--output <file>
: 指定输出文件的路径,默认为标准输出。-c {16,32,64,...}
或--context {16,32,64,...}
: 设置目标上下文,包括操作系统、架构、字节序和位宽。-p
或--alphanumeric
: 使用字母数字编码器对 shellcode 进行编码。-v <avoid>
或--avoid <avoid>
: 编码 shellcode 以避免列出的字节。-n
或--newline
: 编码 shellcode 以避免换行符。-z
或--zero
: 编码 shellcode 以避免空字节。-d
或--debug
: 使用 GDB 调试 shellcode。
示例
-
生成十六进制格式的 shellcode:
pwn scramble -f hex -c amd64 -o output.hex "shellcode"
-
生成避免特定字节的 shellcode:
pwn scramble -v 00,0a -c amd64 "shellcode"
-
生成避免空字节和换行符的 shellcode:
pwn scramble -z -n -c amd64 "shellcode"
-
使用 GDB 调试生成的 shellcode:
pwn scramble -d -c amd64 "shellcode"
pwn shellcraft
子命令
pwn shellcraft
用于生成各种类型的 shellcode。这对于开发漏洞利用和进行安全研究非常有用。
基本用法
pwn shellcraft <shellcode> [arg] [options]
<shellcode>
: 您想要生成的 shellcode 类型。[arg]
: 传递给 shellcode 的参数。- 选项:
-h
或--help
: 显示帮助信息并退出。-?
或--show
: 显示 shellcode 文档。-o <file>
或--out <file>
: 指定输出文件的路径。-f {r,raw,s,str,string,c,h,hex,a,asm,assembly,p,i,hexii,e,elf,d,escaped,default}
或--format {r,raw,s,str,string,c,h,hex,a,asm,assembly,p,i,hexii,e,elf,d,escaped,default}
: 输出格式,默认为hex
。-d
或--debug
: 使用 GDB 调试 shellcode。-b
或--before
: 在代码前插入调试陷阱。-a
或--after
: 在代码后插入调试陷阱。-v <avoid>
或--avoid <avoid>
: 编码 shellcode 以避免列出的字节。-n
或--newline
: 编码 shellcode 以避免换行符。-z
或--zero
: 编码 shellcode 以避免空字节。-r
或--run
: 运行输出。--color
: 启用彩色输出。--no-color
: 禁用彩色输出。--syscalls
: 列出系统调用。--address <address>
: 加载地址。-l
或--list
: 列出可用的 shellcode,可选提供过滤器。-s
或--shared
: 生成的 ELF 是共享库。
示例
-
生成简单的 execve("/bin/sh") shellcode:
pwn shellcraft execve('/bin/sh')
-
生成避免特定字节的 shellcode:
pwn shellcraft -v 00,0a execve('/bin/sh')
-
生成避免空字节和换行符的 shellcode:
pwn shellcraft -z -n execve('/bin/sh')
-
使用 GDB 调试生成的 shellcode:
pwn shellcraft -d execve('/bin/sh')
-
生成 ELF 格式的 shellcode 并保存到文件:
pwn shellcraft -f elf -o shellcode.elf execve('/bin/sh')
-
列出所有可用的 shellcode:
pwn shellcraft -l
pwn template
子命令
pwn template
用于生成一个模板脚本,该脚本可以帮助您快速开始编写针对特定二进制文件的漏洞利用代码。这个模板脚本包含了连接远程服务器、本地调试和基本的漏洞利用框架。
基本用法
pwn template <exe> [options]
<exe>
: 目标二进制文件。- 选项:
-h
或--help
: 显示帮助信息并退出。--host <host>
: 远程主机或 SSH 服务器的地址。--port <port>
: 远程主机或 SSH 服务器的端口。--user <user>
: SSH 用户名。--pass <password>
: SSH 密码。--path <path>
: 远程服务器上文件的路径。--quiet
: 减少模板注释的详细程度。
示例
-
生成针对本地二进制文件的模板脚本:
pwn template /path/to/binary
-
生成针对远程服务器上二进制文件的模板脚本:
pwn template --host example.com --port 22 --user user --pass password --path /remote/path/to/binary
-
生成简洁注释的模板脚本:
pwn template --quiet /path/to/binary
pwn unhex
子命令
pwn unhex
用于将十六进制字符串解码为原始字节。这对于处理二进制数据和调试非常有用。
基本用法
pwn unhex <hex> [options]
<hex>
: 需要解码的十六进制字符串。- 选项:
-h
或--help
: 显示帮助信息并退出。
示例
-
将十六进制字符串解码为原始字节:
pwn unhex 48 65 6c 6c 6f 20 57 6f 72 6c 64 21
输出:
Hello World!
-
从文件中读取十六进制字符串并解码:
cat hex_data.txt | pwn unhex
pwn update
子命令
pwn update
用于更新 pwntools
到最新版本。这对于保持工具的最新性和安全性非常重要。
基本用法
pwn update [options]
- 选项:
-h
或--help
: 显示帮助信息并退出。--install
: 自动安装更新。--pre
: 检查预发布版本。
示例
-
检查并手动安装更新:
pwn update
-
自动安装最新版本:
pwn update --install
-
检查并安装预发布版本:
pwn update --pre --install