我正在研究关于Dirty Cow漏洞的学校研究。在我的研究过程中,我发现了一些解决方案(例如this one)将一些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期间,系统如何获取符号地址?