跳转至

Pwntools使用

pwntools使用

用过或者查到的一些功能汇总一下,官方文档有些也没看给个实例,不知道咋用Orz...

安装

安装的话直接 pip install pwntools 就可以了

虽然 Pwntools 大部分的功能都是纯 python 实现的可以直接使用,其还是依赖一些外部的 python 库例如 capstone 等,如果使用 pip 安装的话可以发现安装了不少依赖的库。而如果需要使用其 ROP 链的构建功能的话,则需要安装libcapstone 这个非 Python 的库,这个可以到 capstone-download 去下载,不过需要注意的一点就是要保持 python 的 capstone 与这个 libcapstone 的版本一致否则可能出现 API Version 冲突的问题,在 pip 安装时可以指定其版本pip install capstone==3.0.4

基本使用

首先需要 from pwn import * 把 pwntools 导入进来,它同时会把一些系统库给导入进来

本地打的话 p=process('./filename'),远程的话 p=remote('192.168.1.103',10001)

p.close()  关闭

发送 payload

p.send(payload)   发送 payload

p.sendline(payload)   发送 payload,并进行换行(末尾\n)

p.sendafter(some_string, payload)   接收到 some_string 后, 发送你的 payload

p.sendlineafter(some_string, payload)   接收到 some_string 后, 发送你的 payload,加个换行

接收返回内容

p.recvn(N)   接受 N(数字) 字符

p.recvline()  接收一行输出

p.recvlines(N)   接收 N(数字) 行输出

p.recvuntil(some_string)   接收到 some_string 为止

p.interactive()    直接进行交互,相当于回到shell的模式,一般在取得shell之后使用

生成 shellcode

asm(shellcraft.sh())

ELF

首先需要 elf=ELF('./filename') 来产生一个对象

elf.symbols['a_function']  找到 a_function 的地址

elf.got['a_function']  找到 a_function的 got

elf.plt['a_function']  找到 a_function 的 plt

elf.next(e.search("some_characters"))  找到包含 some_characters 可以是字符串,汇编代码或者某个数值的地址

ROP

rop = ROP('./filename') 还是要先创建一个对象

rop.raw('a'*32)   在构造的 rop 链里面写 32 个 a

rop.call('read', (0, elf.bss(0x80)))  调用一个函数,可以简写成:rop.read(0, elf.bss(0x80))

rop.chain()   就是整个 rop 链,发送的 payload

rop.dump()  直观地展示当前的 rop 链

rop.migrate(base_stage)   将程序流程转移到 base_stage(地址)

rop.unresolve(value)  给出一个地址,反解析出符号

rop.search(regs=['ecx','ebx'])   搜索对 eax 进行操作的 gadgets

rop.find_gadget(['pop eax','ret'])   搜索 pop eax ret 这样的 gadgets

1583645719544-d599cb73-5c7b-45da-80f8-3fac37f0c026.png

shellcraft

https://www.zerocre.com/pwn/pwntools%20shellcraft%20%E6%B7%B1%E5%85%A5%E6%8E%A2%E7%B4%A2.html

https://blog.betamao.me/2017/12/25/shellcode/

DynELF

使用的话要先定义一个 leak 函数用来泄漏地址,然后就能找一个函数的地址了例如:

def leak(address):
    ...
    return data
d = DynELF(leak,'./file')
sys_addr = d.lookup('system','libc')

所以主要问题还是在构造 leak 函数上面

参考:

http://brieflyx.me/2015/python-module/pwntools-intro/

https://icepng.github.io/2017/04/18/pwntools/

原文: https://www.yuque.com/hxfqg9/bin/yxegb6