学习使用pwntools

参考了pwn.college中的教学内容和题目
image
这是 pwntools 的简介。pwntools 是一个专门为 CTF(夺旗赛)和漏洞利用(exploitation)设计的 Python 库和工具集。它的目标是尽可能简化漏洞利用脚本的编写过程,同时提高 exp 代码的可读性。

下面逐项解释它列出的功能:


1. send, recv —— 收发数据

用于和远程或本地进程进行交互。

  • send(data):发送数据
  • recv(n):接收最多 n 个字节
  • recvuntil(s):一直接收直到遇到某个字符串
  • sendline(data):发送数据并追加换行符

在 pwn 题里,你经常需要和程序“对话”:先读提示,再发送 payload,再读输出。pwntools 把这些操作封装得很方便。


2. pack, unpack —— 打包/解包整数

在写 exploit 时,经常需要把整数转换成小端序(little-endian)的字节串,或者反过来。

  • p32(0xdeadbeef):把 32 位整数打包成 4 字节小端序
  • p64(0xdeadbeefcafebabe):打包成 8 字节小端序
  • u32(b'\xef\xbe\xad\xde'):把 4 字节解包成 32 位整数
  • u64(...):8 字节版本

这比手动用 struct.pack 方便得多。


3. Assembly & Disassembly —— 汇编与反汇编

pwntools 内置了汇编器和反汇编器:

asm('mov rax, 0x3b')      # 汇编成机器码
disasm(b'\x48\xc7\xc0...') # 反汇编成人类可读的汇编

在写 shellcode 时,你可以直接用汇编写,再让 pwntools 生成机器码。


4. ELF parsing —— ELF 文件解析

可以方便地读取 ELF 文件的信息:

elf = ELF('./challenge')
elf.symbols['main']      # 获取 main 函数地址
elf.plt['puts']          # 获取 puts 的 PLT 地址
elf.got['puts']          # 获取 puts 的 GOT 地址
elf.address              # 获取基址(配合 ASLR 泄漏使用)

在做 ROP、ret2libc 等利用时非常常用。


5. cyclic —— 循环模式字符串

用来确定缓冲区溢出时覆盖返回地址的偏移量。

cyclic(100)              # 生成 100 字节的循环模式字符串
cyclic_find(0x61616168)  # 查找某个 4 字节值在模式中的偏移

你在 GDB 里看到崩溃时 $rip = 0x61616168,就可以用 cyclic_find 反推出偏移量。


6. ShellCode & ROP —— shellcode 与 ROP 链

pwntools 内置了一些现成的 shellcode 和 ROP 构造工具:

shellcraft.sh()          # 生成一个 execve("/bin/sh") 的 shellcode
ROP(elf)                 # 创建 ROP 对象,自动搜索 gadget
rop.call('puts', [elf.got['puts']])
rop.chain()              # 生成最终的 ROP 链

可以大大简化 ROP 利用的编写。


7. from pwn import * —— 导入库

这行代码把 pwntools 的所有常用功能一次性导入你的 Python 脚本,之后就可以直接用 send、recv、p64、ELF、cyclic 等函数,不需要再加前缀。

from pwn import *

posted on 2026-09-26 22:26  d0ubleU0x00  阅读(15)  评论(0)    收藏  举报

导航