考虑Ubuntu 20.10 (Groovy Gorilla) 上/boot/System.map-5.8.0-50-generic
的输出:/proc/kallsyms
$ sudo cat /boot/System.map-5.8.0-50-generic | grep sys_call_table
ffffffff820002e0 D sys_call_table
ffffffff82001360 D ia32_sys_call_table
ffffffff82002120 D x32_sys_call_table
$ sudo cat /proc/kallsyms | grep sys_call_table
ffffffff978002e0 D sys_call_table
ffffffff97801360 D ia32_sys_call_table
ffffffff97802120 D x32_sys_call_table
AFAIK,这些文件应该包含内核符号的当前加载地址,那么为什么它们不匹配呢?
是因为只/proc/kallsyms
受KASLR影响吗?如果是这样,如何验证 KASLR 是否启用?
答案1
对,这就是由KASLR引起。请注意,所有地址的偏移量相同。内核不知道,System.map
所以它不会更新它。
我不知道有什么方法可以检测 KASLR 是否在运行时从用户空间启用,缺少比较/proc/kallsyms
和System.map
,或者可能导致 x86 上的恐慌(内核在恐慌时转储其偏移量)。