pwntools 是一个Python库, 用于编写二进制漏洞利用(exploitation)脚本
功能:
- 远程连接和本地连接: 支持通过TCP/UDP连接远程服务或与本地进程进行交互。
- Shellcode和ROP链构造: 提供了便捷的工具来生成和利用shellcode(比如execve的shellcode)以及构造ROP(Return-Oriented Programming)链。
- 调试支持: 可以与调试器(如gdb)配合使用,进行调试、自动化调试等。
- 自动化交互: 支持自动化与程序交互,模拟用户输入,处理输入输出流。
- 格式化输出: 提供了丰富的格式化工具,帮助你以不同的方式展示数据。
语法:
1. 基础连接和交互
连接
from pwn import * #导入pwntools库
p = remote('example.com', 12345) #连接远程服务
p = process('./vulnerable_program') #连接本地程序
发送数据
p.sendline('Hello') #发送一行数据
p.send('Hello') #发送没有换行符的数据
p.send(b'Hello') #发送多个数据
接收数据
data = p.recvline() #接收一行数据
data = p.recv() #接收任意数据
data = p.recv(1024) #接收特定大小的数据
2. 调试
使用GDB调试
p = process('./vulnerable_program')
gdb.attach(p) #启动进程,并自动附加到gdb进行调试
p.interactive() #调试时,继续执行直到退出
p = process('./vulnerable_program')
gdb.attach(p, '''
break main
continue ''') #启动调试进程并设置断点 设置gdb断点并启动
3. 利用ROP链
创建ROP链
elf = ELF('./vulnerable_program') #加载二进制文件
system = elf.symbols['system'] #获取函数地址(比如system函数)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') system = libc.symbols['system']
system = libc.symbols['system'] #获取libc基地址
rop = ROP(elf)
rop.call(system, [next(elf.search(b'/bin/sh'))]) # 构造ROP链
print(rop.dump()) # 打印ROP链
4. 格式化输出
格式化为16进制
data = b'Hello'
print(hex(data)) # 打印数据的16进制
构造填充数据(Padding)
padding = b'A' * 64 # 构造填充数据
print(padding) # 格式化成16进制
5. Shellcode与生成
使用asm
来生成Shellcode
shellcode = asm(shellcraft.sh())
print(shellcode) #使用asm生成shellcode
执行Shellcode
p = process('./vulnerable_program') #创建一个进程并注入shellcode
p.send(shellcode) #注入shellcode
6. 脚本化交互
pwntools
提供了一个名为 interactive
的方法来帮助你与程序进行交互。
p.sendline('Hello') # 发送数据并启动交互模式
p.interactive() # 启动交互模式,进入交互式命令行
7. 利用context
进行设置
context
是用来设置当前进程/连接的环境的。可以设置架构、字节序等。
设置架构和字节序
context.arch = 'amd64'
context.os = 'linux'
context.endian = 'little' # 设置架构和字节序(x86_64,little-endian)
设置输入/输出编码
context.term = 'xterm-256color' # 设置输入输出编码为utf-8
8. 其它常见工具
ELF
类
ELF
类提供了对二进制文件的操作接口,能够帮助你提取符号、段、重定位等信息。
elf = ELF('./vulnerable_program') # 加载一个ELF文件
print(hex(elf.entry)) # 查看程序的入口地址
func_address = elf.symbols['main']
print(hex(func_address)) #获取函数地址
libc
类
libc
类帮助你进行 libc
漏洞利用时的操作,包括获取函数地址、计算基址等。
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') # 加载libc文件
system = libc.symbols['system']
print(hex(system)) # 获取libc中的system函数地址
9. pwn
命令行工具
除了作为一个Python库,pwntools
还提供了一些命令行工具,如 pwn cyclic
、pwn checksec
等,来帮助你分析二进制文件和漏洞。
$ pwn cyclic 100 # 生成一个包含100个字符的循环序列
$ pwn checksec --fortify-file=./vulnerable_program # 检查程序的安全设置