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后面输入任何内容都会当作参数