Pwntools使用介绍

具体内容可以参考pwntools官方文档(Google关键词搜索)

一、环境变量设置

pwntools的许多设置都是通过全局变量context进行控制的,例如系统、架构、字节序等都可以通过如下的方法更改:

1
2
3
4
5
6
context.clear()
#清空context
context.update(arch='amd64')
#设置架构类型
context.os=='linux'
#设置os类型

二、连接及信息传输类API

要进行漏洞利用,首先就要与程序进行通信,pwntools提供的函数能够与本地或远程进行通信。
本地程序通过process函数运行,远程通过remote函数进行连接,示例如下:

1
2
sh=process('./pwn')
sh=remote('127.0.0.1',4444)

通过process函数运行了当前路径下的二进制pwn程序,通过remote函数与127.0.0.1:4444建立连接

1
2
3
4
5
6
7
8
9
10
11
p=process('./pwn')
p.send(payload)
#发送信息
p.sendline(payload)
#发送一行信息(自动添加换行符)
data=p.recv(count)
#接受count长度信息
data=p.recvuntil(string,drop=True or False)
#返回直到接收到用户指定的字符串的信息
sh.clear()
#清空消息缓存

三、编码类API

在漏洞利用的过程中,需要将输入的payload转化为8位、16位、32位或64位、大端或小端所对应的格式。
pwntools提供了一组函数用来对给定的数据按照一定的格式进行解码和编码。
如:

1
2
3
4
>>> p32(0x08040000)
'\x00\x00\x04\x08'
>>>hex(u32('\x00\x00\x04\x08'))
'0x08040000'

pwntools还提供了asm和disasm两个函数进行汇编和反汇编的转换。

四、文件信息获取类API

在漏洞利用脚本的编写过程中,经常需要使用got表地址、plt表地址或system函数在libc中的偏移,pwntools能够快速的帮助你找到相应的地址。

1
2
3
4
5
6
7
8
9
10
elf=ELF('./pwn')
#加载二进制文件
elf.got['fun_name']
#获取对应函数的got表地址
elf.plt['fun_name']
#获取对应函数的plt表地址
libc=ELF('./libc.so.6'
#加载libc函数库
libc.symbols['system']
#获取函数地址

五、libc地址计算类API

1
2
3
4
5
6
7
8
9
10
sh=process('./pwn')
elf=ELF('./pwn')
#声明一个只包含一个地址参数的函数
#并且这个函数能够泄露至少位于这个地址的一个字节的数据
def leak(address):
data=sh.read(address,4)
log.debug('%#x=>%s'%(address,(data or ').encode('hex')))
return data
d=DynELF(leak,elf=elf)
system_addr=d.lookup('system','libc')

六、格式化字符串类API

在格式化字符串利用中,攻击者往往需要通过漏洞实现任意内存地址写,但构造合适的payload往往需要占用大量的时间。
pwntools中的fmtstr模块中实现了和格式化字符串漏洞利用相关的多个函数,极大地加速了漏洞利用脚本的开发速度。

1
2
>>>fmt_payload(5,{0x8041337:0xdeadbeef},write_size='short')
7\x13\x04\x089\x13\x04\x08%48871c%5$hn%8126c%6$hn

如上代码,通过fmtstr模块中的fmtstr_payload函数,生成一段payload实现修改0x8041337地址内容为0xdeadbeef。

七、调试类API

如在进行漏洞利用的过程中,调试几乎是必不可少的一个环节,需要通过调试来查看漏洞利用脚本是否达到了预期摸底或者得到一些关键的信息。
pwntools提供了用于在程序运行中调用gdb的函数

1
2
3
4
5
使用gdb.attach(target,gdbscript=None,exe=None,arch=None)函数来启动gdb调试。
#target为所要调试的进程
gdbscript为gdb脚本字符串,在启动gdb时,会先执行该脚本
exe为所调试进程的二进制文件路径
arch为架构。一般情况下,只需要使用前两个参数即可。

八、其他漏洞利用类API

用户可以使用shellcraft.arch.os生成相应架构、系统的shellcode。
例如64位linux的shellcraft.amd64.linux,以下为官方文档的示例,通过shellcraft.amd64.linux.sh()可以生成一段Linux64位系统下执行shell的汇编代码。

1
2
3
4
>>>p=run_assembly(shellcraft.amd64.linux.sh())
>>>p=sendline('echo Hello')
>>>p.recv()
'Hello\n'

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!