如何在给定 vDSO 地址的情况下查找 vDSO 中的符号地址?

问题描述 投票:0回答:1

我正在学校开展一项有关脏牛漏洞的研究。在我的研究过程中,我发现了一些解决方案(例如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 进行虚拟系统调用期间,系统如何获取符号地址?

android c++ linux-kernel shared-libraries vdso
1个回答
0
投票

参见 https://www.kernel.org/doc/Documentation/ABI/stable/vdso

“动态链接到glibc的程序将自动使用vDSO。否则,您可以使用tools/testing/selftests/vDSO/parse_vdso.c中的参考解析器”

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/vDSO/parse_vdso.c

© www.soinside.com 2019 - 2024. All rights reserved.