pwntools:简单来说就以一整套pwn工具集,涵盖了pwn题利用脚本所需要的各种工具。包括方便的IO交互函数,ROP、格式化字符串等利用的自动化工具,shellcode生成器等等。pwntools是目前最好用也是仅有的大型pwn利用框架。能节省大量编写脚本的时间。
Pwntools模块总览
Pwnlib.asm
Asm模块主要通过capstone进行汇编的编译和反编译。通常用来编译各种平台构架的shellcode。
Pwnlib.constants
头文件宏定义的封装,通过此模块,可以直接获取一下系统宏定义对应的整数数据。
Pwnlib.context
上下文管理器,通过他来控制一些全局的信息。比如目标计算机体系结构,log等级等。控制生成shellcode,log时候的默认行为。
Pwnlib.dynelf
通过内存leak数据来自动化定位程序中函数位置。及其实用。
Pwnlib.encoders
Shellcode编码工具,通过编码排除shellcode中的特殊字符,防止无法转化。
Pwnlib.elf
读写elf文件结构中的各种信息。非常方便实用。
Pwnlib.fmtstr
格式化字符串自动化利用工具。有缺陷,只能使用少数情况。
Pwnlib.gdb
可以在脚本中直接使用此模块attach进程或者启动gdb
Pwnlib.libcdb
Libc的database,可以通过一些信息查找对应libc
Pwnlib.log
通常是pwntools内部代码使用
Pwnlib.memleak
内存泄漏管理工具,方便拼接多次泄露出来的内存。
Pwnlib.shellcraft
Shellcode生成工具
Pwnlib.tubes
主要的io工具
Pwnlib.util
包含一些列有效的小工具
Pwnlib.rop
rop生成工具,可以直接生成32位rop
Pwntools主要模块及其使用
Tubes模块包含remote和process子模块
from pwn import *
io = remote("127.0.0.1", 32152)
# 与互联网主机交互
io.sendline("hello")
io.send("hello")
# sendline发送数据会在最后多添加一个回车
io.recv(1024)
io.revuntil()
io.recvline("hello")
# recv()读取1024个字节,recvline()会读取一直到回车,recvline()读取到指定数据
io.interactive()
io = process("./bin", shell=True)
#启动本地程序进行交互,用于gdb调试
io.p32(0xdeadbeef)
io.p64(0xdeadbeefdeadbeef)
io.u32("1234")
io.u64("12345678")
# 将字节数组与数组进行以小端对齐的方式相互转化,32负责转化dword,64负责转化qword
shellcraft&asm
pwntools的shellcraft主要用来生成汇编代码形式的shellcode,而asm的作用是根据汇编代码编译出二进制shellcode。
# 生成执行sh的shellcode并编译
asm(pwnlib.shellcraft.thumb.linux.sh(), arch="thumb")
# 可以将thumb换成对应cpu
# 读取flag并输出到标准输出
pwnlib.shellcraft.i386.linux.cat("flag", fd=1)
# 使用forkbomb破坏系统(慎用)
pwnlib.shellcraft.i386.linux.forkbomb()
context
context.log_level = "debug"
context.arch = "amd64"
# 设置成debug,pwntools会将所有io数据等输出,方便编写poc的时候进行调试,而arch可以设置攻击目标的指令构架。
ELF
用于读取elf文件中的各种结构数据。例如plt,got,函数地址等等。