pwntools使用入门教程

pwntools常用模块和函数

Posted by Weizhou on February 6, 2019

前言

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 的功能十分强大,可以近一步挖掘,更多的信息可见参考

参考