本文章会持续更新,用于记录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部署一个一样的环境在本地调试。