关于 vsyscall

vsyscall 简介

vsyscall 的全称是虚拟系统调用 (virtual system call)。

vsyscll 的出现是为了避免在进行一些常用的系统调用时,频繁由用户态切换到内核态而浪费过多的时间,其加速原理是使用函数调用代替特定的系统调用。

vsyscall 采用固定地址映射的方式,起始地址固定为 0xffffffffff600000。因此即使程序开启了 PIE 保护,vsyscall 段的地址也不会发生变化。

调用 vsyscall 时会进行检查,如果不从对应函数起始处开始执行的话,程序会报错。

dump 分析

使用 gdb 命令把 vsyscall 段的内存 dump 下来,使用 IDA 进行分析,可以看到 vsyscall 段中存在三个系统调用,分别是 gettimeofday (系统调用号 0x60),time (系统调用号 0xC9),getcpu (系统调用号 0x135)。

dump memory ./vsyscall 0xffffffffff600000 0xffffffffff601000

image-20200828134847282

参考资料

2019-2020 @lukbash