
原理适用条件:ubuntu16
偏有宸机:由于一般的系统调用如果想要向内核传递一些参数的话,为了保证用户态和内核态的数据隔离,往往需要把当前寄存器状态先保存好,然后再切换到内核态,当执行完后还需要在会恢复寄存器状态,而这中间就会产生大量的系统开销。因此为了解决这个问题,linux系统会将仅从内核里读取数据的syscall单独列出来进行优化,如 gettimeofday、time、getcpu。
vsyscall的地址是固定的,也就是0xffffffffff600000.
使用如果栈上有一个我们需要返回到的地址,我们只需要用vsyscall将他前面的栈数据填满,程序就会滑动到这个地址去执行函数。特别是system("/bin/sh").
或者在开启了pie情况下,该地址与后门函数地址只有后面1个字节不一样,那就在用vsyscall将他前面的栈数据填满的前提下,将后一个字节填充为后门函数绕过pie。
如果是两个字节不一样,这就需要爆破一位,有1/16几率成功(比较高。
例题❯ checksec pwn[*] '/home/za/pwn' ...