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);或者 open、read 等指令;或者 mprotect 给内存某段加 RX 权限。
注意点二:没有 libc 不代表没有 VDSO 段
一般而言,都会有 VDSO 段的,所以如果没有 libc 不意味没有 VDSO 段。