我正在学校开展一项有关脏牛漏洞的研究。在我的研究过程中,我发现了一些解决方案(例如thisone),它们将一些shellcode注入vDSO(到函数
__vdso_clock_gettime
中)。
此解决方案及其所有衍生方案使用硬编码常量作为 vDSO 中符号
__vdso_clock_gettime
的偏移量。然而,该常量并非对所有版本的内核和 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 进行虚拟系统调用期间,系统如何获取符号地址?
参见 https://www.kernel.org/doc/Documentation/ABI/stable/vdso
“动态链接到glibc的程序将自动使用vDSO。否则,您可以使用tools/testing/selftests/vDSO/parse_vdso.c中的参考解析器”
和