pwntools的安装及基本使用
安装sudo apt updatesudo apt install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential -ypython3 -m pip install --upgrade pippip3 install --upgrade pwntoolspwntools使用基本模块asm 汇编与反汇
·
项目地址:https://github.com/Gallopsled/pwntools
官方文档:http://docs.pwntools.com/en/latest/
安装
sudo apt update
sudo apt install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential -y
python3 -m pip install --upgrade pip
pip3 install --upgrade pwntools
pwntools使用
基本模块
- 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等
导入
from pwn import *
# 本地
p = process('')
# 远程
p = remote('8.8.8.8', 8888)
汇编与反汇编
asm('nop', arch='arm')
disaasm('')
shellcode
shellcraft.sh()
shellcraft.i386.linux.sh()
shellcraft.amd64.linux.sh()
ELF
elf = ELF('')
# 或者
p = process('')
elf = p.elf
# 文件装载地址
elf.address
# 符号表
elf.symbols
# GOT表
elf.got
# PLT表
elf.plt
pack与unpack
# 将数据解包
u32()
u64()
# 将数据打包
p32()
p64()
Cyclic
在栈溢出的时候可以方便计算偏移
# 生成一个0x100大小的字符串
cyclic(0x100)
cyclic_find(0x12345678)
cyclic_find('abcd')
这里因为当存在栈溢出,而我们输入的数据比较大时,就会覆盖栈底指针以及返回地址,所以当使用这个工具进行计算时,因为覆盖了返回地址导致程序跳转失败,所以跳转的地址就是字符串对应的位置,这就是cyclic_find(0x12345678)的原理。
Context
# 环境设置
context(os='linux', arch='amd64', log_level='debug')
# 或者
context.log_level = 'debug'
context.arch = 'i386'
...
- os设置系统为linux
- arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
- log_level设置日志输出的等级为debug,这样pwntools会将完整的io过程都打印下来,使得调试更加方便
gdb
from pwnlib import *
# 打开调试进程,并设置断点
pwnlib.gdb.debug('./human', 'b *main')
# 附加调试进程p
pwnlib.gdb.attach(p)
IO交互
send(payload) # 发送payload
sendline(payload) # payload + 换行\n
sendafter(string, payload) # 接收到指定string后发送payload
recvn(n) # 接收n个字符
recvline() # 接收一行输出
recvlines(n) # 接收n行输出
recvuntil(string) # 接收到指定string为止
interactive() # shell式交互
FmtStr
也是计算偏移的
rop
elf = ELF('./proc')
rop = ROP(elf)
# 第一个参数是需要call的函数或地址,第二个为函数参数
rop.call('read', (0, elf.bss(0x80)))
rop.dump()
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献7条内容
所有评论(0)