为什么 sys_call_table 是可预测的?

为什么 sys_call_table 是可预测的?

在(或之后?)2.4 中,sys_call_table符号不再被导出,从而使挂钩系统调用变得更加困难。

忽略您仍然可以从 IDT 或通过阅读 获取此信息/boot/System.map-<kernel-version>,我想知道为什么此地址在重新启动和机器(具有相同内核版本)之间似乎是恒定的?难道不值得让它变得动态吗?是否有理由要求它是静态的?

我的目标是这样的:

sys_call_table不再导出到模块以使挂钩系统调用更加困难,但模块(即内核空间程序)仍然可以轻松地通过读取System.map或简单地根据内核版本信息进行猜测来获取此信息,因为地址似乎与所有机器都运行相同版本的内核。

答案1

从内核版本 4.8 开始,至少在 x86 上,内核地址空间是随机的,包括系统调用表的地址。看RANDOMIZE_BASE在内核配置中了解基本细节。

这意味着给出的地址System.map是无用的,系统调用表的地址在每次启动时都会改变。如果您需要调试某些东西并想使用System.map,则需要使用nokaslr内核命令行参数启动以禁用 KASLR。

相关内容