本文章会持续更新,用于记录pwn过程中,本人觉得值得记录的东西0v0
pwn的exp简化模板 该部分记录使用lambda表达式与自定义函数简化exp,便于未来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')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) #获取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)) #连接 #-------------------------------------------------------------------------------- io.interactive()
其中需要注意的是,如果设置terminal为tmux时gdb,需要在tmux下运行exp,且tmux的操作一般先是先输入CTRL+b,再接着输入命令。
patchelf 在做pwn题的过程中,有时候本地调试的环境会和远程不一样,从而导致本地通了而远程没通的情况,此时可以使用patchelf或者docker解决相应问题。因为patchelf比较简单,在这里先记录该方法。
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好了。当然这种方法不是万能的,有些难题对环境的要求很高,因此后续会记录docker的方法,只要知道了远程的环境,我们就能使用docker部署一个一样的环境在本地调试。