pwntools

pwntools是解决pwn题最重要的一个工具包,下面是我的exp编写的一个模板

#导入所需库
#--------------------------------------------------------------------------------
from pwn import*
from LibcSearcher import*
from ctypes import*
from struct import*
import time

#设置context
#--------------------------------------------------------------------------------
context(arch='', os='linux', log_level='debug', terminal=['tmux', 'splitw', '-h'])

#设置是否本地还是远程,并操作、解析相应文件
#--------------------------------------------------------------------------------
pwn_file=''
libc_file=''
elf=ELF(pwn_file)
libc=ELF(libc_file)
rop=ROP(libc)

flag=1
if flag:
io=process(pwn_file)
else:
ip=''
port=
io=remote(ip,port)

#设置自定义函数
#--------------------------------------------------------------------------------
#gdb调试
def debug():
#gdb.attach(io)
#gdb.attach(io,'b *$rebase(0x1234)')
#gdb.attach(io,'b main')
pause()
#lambda表达式
s = lambda data : io.send(data)
sa = lambda delim,data : io.sendafter(str(delim), data)
sl = lambda data : io.sendline(data)
sla = lambda delim,data : io.sendlineafter(str(delim), data)
r = lambda num : io.recv(num)
rl = lambda : io.recvline()
ru = lambda delims, drop = True : io.recvuntil(delims, drop)
leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr))
ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00'))
ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00'))
uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))
uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
uu64 = lambda data : u64(data.ljust(8,b'\x00'))
i32 = lambda data : int(io.recv(data), 16)
i64 = lambda data : int(io.recv(data), 16)
ioi = lambda : io.interactive()
#获取libc函数地址
def libc_func_addr(base,func):
return base+libc.sym['func']
#简单的shellcode+orw
def shell():
return asm(shellcraft.sh())
def orw(flag_file_name,addr,count):
return asm(shellcraft.open(str(flag_file_name)) + shellcraft.read(3,addr,count) + shellcraft.write(1,addr,count))

#连接
#--------------------------------------------------------------------------------
ioi()

010 Editor

010Editor是一款功能强大的十六进制编辑器

IDA pro

IDA pro是一个强大的反编译工具

Frontline

Binwalk

Ghidra

Ropper

Patchelf

在做pwn题的过程中,有时候本地调试的环境会和远程不一样,从而导致本地通了而远程没通的情况,此时可以使用patchelf或者docker解决相应问题。因为patchelf比较简单,在这里先记录该方法。

└─$ cd ~/glibc-all-in-one/debs
└─$ wget http://launchpadlibrarian.net/293727477/libc6_2.23-0ubuntu5_i386.deb
└─$ mkdir ~/glibc-all-in-one/libs/2.23-0ubuntu5_i386
└─$ cd ~/glibc-all-in-one/
└─$ ./extract debs/libc6_2.23-0ubuntu5_i386.deb libs/2.23-0ubuntu5_i386
└─$ cd ~/glibc-all-in-one/libs/2.23-0ubuntu5_i386
strings ./libc-x.xx | grep ubuntu    //查看版本
./download xxxx //在glibc-all-in-one中下载相应版本
patchelf --set-interpreter 文件夹名/ld.so ./pwn //换掉ld
patchelf --set-rpath 文件夹名 ./pwn //换掉path

这样一来就patch好了。当然这种方法不是万能的,glibc-all-in-one有些版本没有,有些难题对环境的要求很高,因此后续会记录docker的方法,只要知道了远程的环境,我们就能使用docker部署一个一样的环境在本地调试。

objdump

一个常用的反汇编工具,使用objdump -d就可以反汇编可执行部分,加上-M intel可以变为Intel语法。

strace

系统调用追踪器

GDB

一个调试器

starti名从程序的第一条指令开始运行

disassemble命令帮助进行反汇编

stepi命令,也可以缩写成si,执行单挑指令

print命令用于显示一个表达式的值,在gdb中寄存器名前会加$

set命令用于给寄存器赋新值

x(examine)命令可以查看内存内容,默认以十六进制显示数值,可以通过加/来改变显示格式,/a告诉x将值显示为内存地址,/s告诉x以字符串形式显示值

使用int3指令(一条汇编指令)表示程序希望被调用,如果如果执行int3时有调试器附加,它会停止程序,这叫程序断点。

run命令(缩写r)会启动程序并让它自由执行,可以在run后面输入任何内容都会当作参数