下载

python3版本

这个就去看我写的pwn基础配置吧,一般而言不做老题目的话python3适配的pwntools完全够用了。不过我为了测试和学习一些老东西留下的宝贵信息,还是会用到适配python2的pwntools的。

pwn基础配置

python2版本

pwntools 从 4.0 版本开始完全移除了 Python 2 支持,依赖现代 Python 特性(如 asyncio)。

现在想用pwntools的python2版本只能用pwntools 3.14.1

检查python2和pip2

1
2
python2 --version  # 应输出 Python 2.7.18
pip2 --version # 应输出 pip 20.3.4 或类似版本

一般而言,可能没有python2.可以去看我写的另外一个工具笔记:

python2环境

如果上面ok了

1
2
pip2 install --user pyelftools==0.27
pip2 install --user --upgrade 'pwntools<3.15'

使用

pwntools的使用非常简单,记住一些简单的函数就可以用起来了:

这边写一个简单的脚本,主要是看函数的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from pwn import *

# ===== 基础设置 =====
context(arch='amd64', log_level='debug', os='linux') # 设置架构为64位
# context(arch='i386', log_level='debug', os='linux') # 设置架构为32位(取消注释使用)

# ===== 连接方式 =====
# p = remote('host', 1234) # 远程连接
p = process('./binary') # 本地进程
# p = gdb.debug('./binary') # 带GDB调试

# ===== 数据发送 =====
p.send(b'data') # 直接发送数据
p.sendline(b'data\n') # 发送数据并添加换行
p.sendafter(b'prompt: ', b'data') # 等待提示后发送
p.sendlineafter(b'prompt: ', b'data') # 等待提示后发送并换行

# ===== 数据接收 =====
data = p.recv() # 接收所有数据
data = p.recv(1024) # 接收指定字节数
data = p.recvline() # 接收一行数据
data = p.recvuntil(b'delim') # 接收直到遇到分隔符
data = p.recvregex(b'pattern') # 接收直到匹配正则表达式

# ===== 内存操作 =====
# 64位
addr = 0x123456789ABCDEF0
payload = b'A'*40 + p64(addr) # 64位地址填充
value = u64(b'\xef\xcd\xab\x89\x67\x45\x23\x01') # 字节转64位整数

# 32位(取消注释使用)
# addr = 0x12345678
# payload = b'A'*40 + p32(addr) # 32位地址填充
# value = u32(b'\x78\x56\x34\x12') # 字节转32位整数

# ===== 高级功能 =====
# 格式化字符串漏洞利用
payload = fmtstr_payload(6, {elf.got.puts: elf.plt.system})

# ROP链构建
elf = ELF('./binary')
rop = ROP(elf)
rop.call(elf.plt.puts, [elf.got.puts]) # 泄露puts地址
rop.call(elf.symbols.main) # 返回main
p.sendline(rop.chain())

# Libc地址计算
libc = ELF('./libc.so.6')
puts_leak = u64(p.recv(6).ljust(8, b'\x00'))
libc.address = puts_leak - libc.symbols.puts

# 执行系统命令
rop = ROP(libc)
rop.system(next(libc.search(b'/bin/sh')))
p.sendline(rop.chain())

# ===== 其他功能 =====
shellcode = asm(shellcraft.sh()) # 生成shellcode
p.sendline(shellcode)

p.interactive() # 进入交互式shell
p.close() # 关闭连接