pwntools使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pwntools使用相关的知识,希望对你有一定的参考价值。

参考技术A

安装可以参考我写的另一篇文章,不过也就几条命令。 链接

使用 from pwn import * 将所有的模块导入到当前namespace,这条语句还会帮你把os,sys等常用的系统库导入。

常用模块如下:

汇编:

可以使用context来指定cpu类型以及操作系统

使用disasm进行反汇编

注意,asm需要binutils中的as工具辅助,如果是不同于本机平台的其他平台的汇编,例如在我的x86机器上进行mips的汇编就会出现as工具未找到的情况,这时候需要安装其他平台的cross-binutils。

结合asm可以可以得到最终的pyaload。

除了直接执行sh之外,还可以进行其它的一些常用操作例如提权、反向连接等等。

pack:p32,p64
unpack:u32,u64

使用ROP(elf)来产生一个rop的对象,这时rop链还是空的,需要在其中添加函数。

因为ROP对象实现了 getattr 的功能,可以直接通过func call的形式来添加函数,rop.read(0, elf.bss(0x80))实际相当于rop.call(\'read\', (0, elf.bss(0x80)))。
通过多次添加函数调用,最后使用str将整个rop chain dump出来就可以了。

Exploit利器——Pwntools
pwntools官网

pwntools各使用模块简介

pwntools

pwntools 是一款专门用于CTF Exploit的python库,能够很方便的进行本地与远程利用的切换,并且里面包含多个模块,使利用变得简单。
可以在github上直接搜索pwntools 进行安装。

基本模块

asm : 汇编与反汇编,支持x86/x64/arm/mips/powerpc等基本上所有的主流平台
dynelf : 用于远程符号泄漏,需要提供leak方法
elf : 对elf文件进行操作,可以获取elf文件中的PLT条目和GOT条目信息
gdb : 配合gdb进行调试,设置断点之后便能够在运行过程中直接调用GDB断下,类似于设置为即使调试JIT
memleak : 用于内存泄漏
shellcraft : shellcode的生成器

asm 汇编模块

这个模块提供一些基本的汇编与反汇编操作,一般可以用linux的objdump以及IDA Pro能够完成基本的需求。

dynelf 模块

DynELF是leak信息的神器。前提条件是要提供一个输入地址,输出此地址最少1byte数的函数。官网给出的说明是:Given a function which can leak data at an arbitrary address, any symbol in any loaded library can be resolved.

# Assume a process or remote connection
p = process(./pwnme)

# Declare a function that takes a single address, and
# leaks at least one byte at that address.
def leak(address):
    data = p.read(address, 4)
    log.debug("%#x => %s" % (address, (data or ‘‘).encode(hex)))
    return data

# For the sake of this example, let‘s say that we
# have any of these pointers.  One is a pointer into
# the target binary, the other two are pointers into libc
main   = 0xfeedf4ce
libc   = 0xdeadb000
system = 0xdeadbeef

# With our leaker, and a pointer into our target binary,
# we can resolve the address of anything.
#
# We do not actually need to have a copy of the target
# binary for this to work.
d = DynELF(leak, main)
assert d.lookup(None,     libc) == libc
assert d.lookup(system, libc) == system

# However, if we *do* have a copy of the target binary,
# we can speed up some of the steps.
d = DynELF(leak, main, elf=ELF(./pwnme))
assert d.lookup(None,     libc) == libc
assert d.lookup(system, libc) == system

# Alternately, we can resolve symbols inside another library,
# given a pointer into it.
d = DynELF(leak, libc + 0x1234)
assert d.lookup(system)      == system

 

elf 模块

这是一个静态模块,即静态加载ELF文件,然后通过相关接口获取一些信息,常用接口有:
got 获取指定函数的GOT条目
plt 获取指定函数的PLT条目
address 获取ELF的基址
symbols 获取函数的实际地址(待确定)

gdb 模块

该模块用于调用gdb调试
在python文件中直接设置断点,当运行到该位置之后就会断下

import pwnlib
from pwn import *
p = process(./c)
pwnlib.gdb.attach(p)

rop 模块

用于自动产生ROP链 还不支持X64?

elf = ELF(ropasaurusrex)
rop = ROP(elf)
rop.call(read, (0, elf.bss(0x80)))
rop.dump() ## 展示当前的ROP chain
### 搜索指定指令 rop.search(move=0, regs=None, order=‘size‘)
‘‘‘
move(int),栈指针调整的字节数
regs(list),搜索的寄存器list
order(str),多个gadgets的排序方式,可选值=[‘size‘, ‘regs‘]
‘‘‘
rop.r13_r14_r15_rbp == rop.search(regs=[r13,r14,r15,rbp], order = regs)

rop.call, 两个参数,第一个是需要call的函数或者一个地址,第二个是函数参数,为list,只有一个参数需要在后面加上一个’,’使其变为list
也可以使用ROPgadget进行gadget搜索

shellcraft 模块

shellcraft模块是shellcode的模块,包含一些生成shellcode的函数。

其中的子模块声明架构,比如shellcraft.arm 是ARM架构的,shellcraft.amd64是AMD64架构,shellcraft.i386是Intel 80386架构的,以及有一个shellcraft.common是所有架构通用的。

有的时候我们需要在写exp的时候用到简单的shellcode,pwntools提供了对简单的shellcode的支持。 
首先,常用的,也是最简单的shellcode,即调用/bin/sh可以通过shellcraft得到:

注意,由于各个平台,特别是32位和64位的shellcode不一样,所以最好先设置context。

print(shellcraft.sh()) # 打印出shellcode
print(asm(shellcraft.sh())) # 打印出汇编后的shellcod

asm可以对汇编代码进行汇编,不过pwntools目前的asm实现还有一些缺陷,比如不能支持相对跳转等等,只可以进行简单的汇编操作。如果需要更复杂一些的汇编功能,可以使用keystone-engine项目,这里就不再赘述了。

asm也是架构相关,所以一定要先设置context,避免一些意想不到的错误。

 

以上是关于pwntools使用的主要内容,如果未能解决你的问题,请参考以下文章

pwntools各使用模块简介

pwntools使用最详细教程

pwntools使用

安装pwntools

kali安装pwntools遇到的一些问题

64位下pwntools中dynELF函数的使用