最近我正在研究linux中的vdso。我试图修改vvar
部分中的数据,但失败了。以下是我尝试过的。
根据lwn描述,有两个地址vvar
:
第一个是常规内核空间地址,其值大于 PAGE_OFFSET。如果您查看 System.map 文件,您会发现该符号的地址类似于 ffffffff81c76080。
第二个地址位于称为“vvar 页面”的区域中。该页面的基地址(VVAR_ADDRESS)在内核中定义为 0xffffffffff5ff000,接近 64 位地址空间的末尾。此页面对用户空间代码只读。
通过首地址修改:通过查看_vdso_data
in的地址很容易找到首地址/boot/System.map-kernel-version
。获得地址后,我在内核模块中修改了它的成员(__unused
)(因此,没有权限问题)。然后,我检查了__unused
来自用户空间的程序,它仍然存在0
,这意味着我未能从内核空间修改它。
通过第二地址修改:第二地址可以通过辅助向量找到。得到 的地址后vdso
,就可以找到vvar
section。我将此地址传递给内核模块并修改其成员__unused
。发生错误,显示权限错误问题。(原因应该vvar
是只读内存,检查通过cat /proc/pid/maps
)
我认为第一种方法几乎是解决方案,但似乎vvar
该地址并未映射到所有进程vvar
部分。有什么想法吗?提前致谢。
[编辑]:第一种方法更接近解决方案。我修改了cr0位,从而允许写入。即使我成功编写它,它仍然无法从 linux 内核中读取(通过获取 vdso_data__arch_get_k_vdso_data
并访问我之前在用户空间 + 内核模块中修改的成员)