我正在对 Dirty Cow 漏洞进行学校研究。在我的研究中,我发现了一些解决方案(例如这个),它们将一些 shellcode 注入到 vDSO(到函数中__vdso_clock_gettime
)。
此解决方案及其所有衍生方案使用硬编码常量作为__vdso_clock_gettime
vDSO 中符号的偏移量。然而,此常量并非对所有版本的内核和 vDSO 都有效(至少不适用于 Android 设备)。
有没有更好的方法在 C/C++ 中找到 vDSO 中符号的地址(偏移量)?我试过了
handle = dlopen("[vdso]", RTLD_LAZY);
作为的[vdso]
输出
dladdr((void*)vdso_addr, &dlinfo);
LOG("dladdr: %s", dlinfo.dli_fname);
vdso_addr
找到了,/proc/self/auxv
但我得到了dlopen failed: library "[vdso]" not found
。
我知道 vDSO 是一个系统问题,普通程序不应该决定是否从中调用函数,但是有没有一些通用的方法可以在 C/C++ 中找到符号的地址,而无需反汇编 vDSO 的每个可能版本并制作地址数据库?
在对 vDSO 的虚拟系统调用期间,系统如何获取符号地址?