pwntools工具介绍

前言

学习二进制的过程中不仅仅是知识体系复杂,除了各种基础知识,漏洞利用技巧,保护机制绕过技巧之外,利用时的payload构造也十分麻烦,手工构造payload需要我们一个字节一个字节的去完成,十分耗费精力,所以需要一个好的工具来辅助我们完成。

pwntools

Pwntools是一个CTF框架和漏洞利用开发库。它是用Python编写的,旨在用于快速原型开发和开发,旨在使漏洞利用程序编写尽可能简单。

看到了吗,他是一个python库,所以我们不费吹灰之力就可以安装好它

1
pip install pwntools

如果通过此方式安装失败,也可以直接使用github下载源码安装

1
2
3
4
5
6
7
8
9
#安装capstone
git clone https://github.com/aquynh/capstone
cd capstone
make
make install
#安装pwntools
git clone https://github.com/Gallopsled/pwntools
cd pwntools
python setup.py install

网络上有很多pwntools模块功能介绍的教程,都写得很全面,我就只拿出其中最常用的一些模块介绍,后面用到其他模块时再慢慢补充。

连接

1
2
3
本地 :sh = porcess("./level0")
远程:sh = remote("127.0.0.1",12345)
关闭连接:sh.close()

IO模块

1
2
3
4
5
6
7
8
sh.send(data)  发送数据
sh.sendline(data) 发送一行数据,相当于在数据后面加\n
sh.recv(numb = 2048, timeout = dufault) 接受数据,numb指定接收的字节,timeout指定超时
sh.recvline(keepends=True) 接受一行数据,keepends为是否保留行尾的\n
sh.recvuntil("Hello,World\n",drop=fasle) 接受数据直到我们设置的标志出现
sh.recvall() 一直接收直到EOF
sh.recvrepeat(timeout = default) 持续接受直到EOF或timeout
sh.interactive() 直接进行交互,相当于回到shell的模式,在取得shell之后使用

此模块中最常用的就是sh.sendline()函数和sh.interactive()函数,用于发送payload和获取shell后交互

汇编和反汇编

汇编

1
2
3
4
>>> asm('nop')
'\x90'
>>> asm('nop', arch='arm')
'\x00\xf0 \xe3'

context指定cpu类型以及操作系统

1
2
3
4
>>> context.arch      = 'i386'
>>> context.os = 'linux'
>>> context.endian = 'little'
>>> context.word_size = 32

反汇编

1
2
3
4
5
>>> print disasm('6a0258cd80ebf9'.decode('hex'))
0: 6a 02 push 0x2
2: 58 pop eax
3: cd 80 int 0x80
5: eb f9 jmp 0x0

shellcode生成器

此模块经常用于可在内存中执行代码时生成shellcode,如ret2shellcode场景

1
2
shellcode = asm(shellcraft.i386.linux.sh())
shellcode = asm(shellcraft.amd64.linux.sh())

数据pack与unpack

pack:p32,p64
unpack:u32,u64
此模块经常用于将地址值转换二进制数据

1
2
p32(0x401128)
p64(0x402248)

待补充

fork me on github