pwntools学习笔记
from pwn import *
常用模块
asm : 汇编与反汇编,支持x86/x64/arm/mips/powerpc等基本上所有的主流平台
dynelf : 用于远程符号泄漏,需要提供leak方法
elf : 对elf文件进行操作
gdb : 配合gdb进行调试
memleak : 用于内存泄漏
shellcraft : shellcode的生成器
tubes : 包括tubes.sock, tubes.process, tubes.ssh, tubes.serialtube,分别适用于不同场景的PIPE
utils : 一些实用的小功能,例如CRC计算,cyclic pattern等
接受远端回传的数据
interactive()
: 在取得shell之后使用,直接进行交互,相当于回到shell的模式.
recv(numb=字节大小, timeout=default)
: 接收指定字节数.
recvall()
: 一直接收直到达到文件EOF.
recvline(keepends=True)
: 接收一行,keepends为是否保留行尾的\n.
recvuntil(delims, drop=False)
: 一直读到delims的pattern出现为止.
recvrepeat(timeout=default)
: 持续接受直到EOF或timeout.
向远端发送数据
send(data)
:发送数据;
sendline(data)
:send+\n .
判断回传的数据
stratwith
判断以何值开头.
示例
先转到python环境下,然后导入模块
from pwn import*
本地连接process(’./pwnpwn’)
recvline()
from pwn import *
用来导入pwntools模块
context(arch = 'i386', os = 'linux')
设置目标机的信息
r = remote('exploitme.example.com', 31337)
用来建立一个远程连接,url或者ip作为地址,然后指明端口
这里也可以仅仅使用本地文件,调试时方便:
r = process("./test")
test即为文件名,这使得改变远程和本地十分方便.
asm(shellcraft.sh())
asm()函数接收一个字符串作为参数,得到汇编码的机器代码。
比如
>>> asm(‘mov eax, 0’)
>’\xb8\x00\x00\x00\x00’
shellcraft模块是shellcode的模块,包含一些生成shellcode的函数。
其中的子模块声明架构,比如shellcraft.arm 是ARM架构的,shellcraft.amd64是AMD64架构,shellcraft.i386是Intel 80386架构的,以及有一个shellcraft.common是所有架构通用的。
而这里的shellcraft.sh()则是执行/bin/sh的shellcode了
r.send()
将shellcode发送到远程连接
最后,
r.interactive()
将控制权交给用户,这样就可以使用打开的shell了
ROPgadget
找binsh字符串的地址:ROPgadget --binary ./ret2libc1 --string "/bin/sh"
寻找pop的汇编片段:ROPgadget --binary ./ret2libc2 --only "pop|ret"