0x00 链接

连接远程服务器:

r = remote('[ip]','[port]')

需要在本地进行测试:

r = process('./filename')
r = process("./demo",env = {'LD_PROLOAD':'./libc.so.6'}) #指定环境变量以运行文件

0x01 设置运行时的参数

通过设置目标架构和操作系统,来告诉Pwntools程序的运行环境。

context.arch = 'i386' #32位程序设置为'i386',64位程序设置为'amd64'。
context.os = 'linux'
context.log_level = 'debug' #可在屏幕上打印debug信息。
context.endian = 'big' #设置字节序为大端序,小端序设置为little。

比较推荐的是使用context.binary自动设置所有适当的值。

from pwn import *
context.binary = './filename'

0x02 接收远端回传的数据

r.interactive() #在取得shell之后使用,直接进行交互,相当于回到shell的模式。
r.recv(numb=字节大小, timeout=default) #接收数据。
r.recvline(keepends=True) #接收一行,keepends为是否保留行尾的\n。
r.recvall() #接收数据,直到达到EOF。
r.recvrepeat(timeout=default) #持续接受直到EOF或timeout。

0x03 向远端发送数据

r.send() #发送数据。
r.sendline() #发送一行数据。
r.sendafter('str',payload) #当接收到指定字符串时,发送payload。
r.sendlineafter('str',payload) #当接收到指定字符串时,发送payload和换行符。

0x04 获取函数地址

在进行elf文件逆向的时候,总是需要对各个符号的地址进行分析,elf模块提供了一种便捷的方法能够迅速的得到文件内函数的地址,plt位置以及got表的位置。

puts_addr = elf.address #获取文件装载的基地址。
puts_got_addr = elf.got['puts'] #获取puts函数got表地址。
puts_plt_addr = elf.plt['puts'] #获取puts函数plt表地址。
puts_sym_addr = elf.symbols['puts'] #获取puts函数符号表地址。

0x05 shellcraft

Pwntools已经为你准备好的shellcode。

print shellcraft.i386.linux.sh() #32位。
print shellcraft.amd64.linux.sh() #64位。

Pwntools 提供的 shellcraft 库中的 shellcode 是被asm()函数进行汇编的。

from pwn import *
shellcode = asm(shellcraft.amd64.linux.sh())

0x06 整数的打包解包

p32() #将数据打包成32位二进制格式,字节序由context.endian设置。
p64() #将数据打包成64位二进制格式,字节序由context.endian设置。
u32() #将32位二进制格式数据解包。
u64() #将64位二进制格式数据解包。

0x07 设置context

  • context.log_level:设置log级别。例如,当log_level位debug时会输出所有的交互数据。
  • context.arch:设置程序架构。设置完毕后,会自动全局设置,生成shellcode时shellcraftasm不用指定架构。
  • context.terminal:设置新起命令的格式。
  • context.endian:设置大小端。