Skip to content

ret2vdso 说明

复制本地路径 | 在线编辑

vDSO(virtual Dynamic Shared Object):是内核在每个进程地址空间里自动映射的一段代码,作用是:让用户态快速、安全地调用某些内核功能,而不必真的陷入内核。比如 gettimeofday,这种常用函数,就不需要反复用户内核态切换了。

内存中的位置通常是 7ffff7ffd000-7ffff7fff000 r-xp [vdso] 这种高地址,检测命令:

info auxv

ret2vdso 就是利用 VDSO 中的一些片段,通常是:

mov rax, SYS_clock_gettime
syscall
ret

这样我们可以有 syscall; ret 这样的组合可以利用。

注意点一:是 syscall 而不是 system

注意,vDSO 里面没有 system 给我们用,而是 syscall 系统调用,所以 ret2vdso 通常是需要构造:

rax = syscall_number
rdi = arg1
rsi = arg2
rdx = arg3

比如可以构造出 execve("/bin/sh", NULL, NULL);或者 openread 等指令;或者 mprotect 给内存某段加 RX 权限。

注意点二:没有 libc 不代表没有 VDSO 段

一般而言,都会有 VDSO 段的,所以如果没有 libc 不意味没有 VDSO 段。

Comments