pwntools简介

pwntools用python编写的一个工具,为解pwn题提供出强大的功能,借助pwntools能让使用者快速编写出exp

pwntools的使用

导入pwntools

1
from pwn import*

context模块

用来设置pwntools的环境,有时候需要进行汇编,若不设置context会导致一些问题

1
2
3
4
5
6
context.os='linux' #设置系统
context.log_level='debug' #设置输出日志为debug,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误
context.arch='amd64' #设置架构为64位,32位对应‘i386'

#也可以这么设置
context(os='linux',arch='amd',log_levl='debug')

io模块

用来控制脚本的输入与输出,可控制发送payload的时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
p=process(./pwn) #括号里位文件路径,打开文件

#以下为接收
p.recv(numb) #接收指定字节数
p.recvline(keepends=True) #接收一行 keepends位是否保留结尾的\n
p.recvuntil(content)#一直接收,直到接收到content为止
p.recvall() #一直接收直到文件结束

#以下为发送
p.send(data) #发送数据
p.sendafter(content,data) #收到content后发送data
p.sendline(data) #发送data再加个\n
p.sendlineafter()#收到content后发送data再加个\n

打包,解包模块

对整数进行打包和解包,往往是对地址进行操作

1
2
3
4
5
p32(addr) #将addr打包为32位
p64(addr) #将addr打包为64位

u32(content)
u64(content)#解包一个字符串,得到整数

ELF模块

用于获取ELF文件的信息 ELF为linux下的可执行文件 同Windows下的PE

1
2
3
4
5
6
e=ELF(path) #打开文件
hex(x)#把x转化成十六进制
hex(e.address)#获取文件基地址
hex(e.symbols['函数名'])#获取函数地址
hex(e.got['函数名'])#获取函数got表的地址
hex(e.plt['函数名'])#获取函数plt的地址

调用gdb

利用pwntools调用gdb,配合gdb一起工作

1
2
gdb.attach() #启动gdb 附加到已存在的进程
gdb.debug() #在调试器下启动新的进程