3

最近我正在研究linux中的vdso。我试图修改vvar部分中的数据,但失败了。以下是我尝试过的。

根据lwn描述,有两个地址vvar

第一个是常规内核空间地址,其值大于 PAGE_OFFSET。如果您查看 System.map 文件,您会发现该符号的地址类似于 ffffffff81c76080。

第二个地址位于称为“vvar 页面”的区域中。该页面的基地址(VVAR_ADDRESS)在内核中定义为 0xffffffffff5ff000,接近 64 位地址空间的末尾。此页面对用户空间代码只读。

通过首地址修改:通过查看_vdso_datain的地址很容易找到首地址/boot/System.map-kernel-version。获得地址后,我在内核模块中修改了它的成员(__unused)(因此,没有权限问题)。然后,我检查了__unused来自用户空间的程序,它仍然存在0,这意味着我未能从内核空间修改它。

通过第二地址修改:第二地址可以通过辅助向量找到。得到 的地址后vdso,就可以找到vvarsection。我将此地址传递给内核模块并修改其成员__unused。发生错误,显示权限错误问题。(原因应该vvar是只读内存,检查通过cat /proc/pid/maps

我认为第一种方法几乎是解决方案,但似乎vvar该地址并未映射到所有进程vvar部分。有什么想法吗?提前致谢。

[编辑]:第一种方法更接近解决方案。我修改了cr0位,从而允许写入。即使我成功编写它,它仍然无法从 linux 内核中读取(通过获取 vdso_data__arch_get_k_vdso_data并访问我之前在用户空间 + 内核模块中修改的成员)

4

0 回答 0