前言
PWN tools是 python2 平台上十分好用的二进制分析解决CTFpwn问题的工具。 package中集成的功能十分强大,包含程序交互,socket交互,进程调试,和ELF二进制文件分析等内容。
正文
安装pwntools
$ apt-get update
$ apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev
$ pip install –upgrade pwntools
如果已经安装过python2.7 和git 可直接:
$ pip install –upgrade pwntools
加包
from pwn import *
log打印信息
context.log_level='debug'
在程序开头添加上述指令之后可清楚的看到发送和接收到的数据 同样log模块可以被用来打印一定的信息
>>> log.info("Hello world")
[*] Hello world
>>> log.success("Hello world")
[+] Hello world
本地交互运行
该方法实际是使用process函数创建了一个进程对象c。
简单的使用方式如下:
c = process(['filename', 'argv_1', 'argv_2', …], cwd="working_directory")
创建进程对象c之后可以使用它进行一系列的输入输出交互。
远程交互
该方法实际是使用remote函数创建了一个进程对象c进行socket通信。
c = remote('ip_address', port_num)
Ip_address
也可以是某一个域名比如“pwnable.kr”或者可以是本地 0
数据接收
实现数据的接收需要首先建立起一个具备交互的对象,
建立本地交互对象时可通过调用process()
函数模块实现;
建立远程交互对象可使用remote()
函数模块实现。
c = process('file_path')
msg = c.recv(256) #接收到缓冲区中的256bytes的信息
msg = c.recvline() #接收数据到换行符'\n'
msg = c.recvuntil('string') #接收数据直到'string'出现才会执行下一行代码
数据发送
与接收数据过程相似同样需要建立一个本地或者远程的交互对象。
c = process('file_path')
c.send(data) #发送data数据
c.sendline(line) #与send()函数不同之处在于会在line数据后自动添加一个'\n'换行符
ssh登陆并执行命令行
s = ssh(host='host', user='username', password='password', port=portnumber)
ssh连接之后可使用c = s.process('command')
创建一个进程,并且可以和正常的本地进程交互一样使用c.send()
发送数据,c.recv()
接收数据。
可使用nc = s.run('nc 127.0.0.1 8888')
打开另外一个连接管道,同样run()函数也具有process的功能
s.interactive()
可用来在通过ssh进行交互输入和输出
ELF处理
ELF函数可以用来创建elf文件对象,并使用其进行文件的分析。
`elf = ELF('file_path')`
main_func_address = elf.symbols['main'] #返回main函数的其实地址
p32(0x64636261) #返回32bit下小端的byte string 'abcd'
#等同于 struct.pack('I', 0x64636261)
p64(0x6867666564636261) #返回64bit下小端的byte string 'abcdefgh'
u32('abcd') #返回int(0x64636261)
#等同于struct.pack('I', 0x64636261)
结语
- pwntools 的功能十分强大,可以近一步挖掘,更多的信息可见参考。