在尝试了在关于该主题的上一个问题上推导 KASLR 偏移偏移的建议解决方案后,我意识到运行时地址与是否启用 KASLR 不同(尽管在不同的禁用 KASLR 时它确实保持相同system_wq
)/boot/System.map-$(uname -r)
靴子,这显然不会发生在相反的情况下)。
以下代码段应sys_call_table
使用 and 的运行时地址和两者的 System.map 地址来计算地址(system_wq
假设包含相应的 System.map 地址)。输出位于代码段下方。system_wq
sys_call_table
sysmap_*
dmesg
runtime_sys_call_table = (unsigned long *)
((unsigned long)system_wq - (sysmap_system_wq - sysmap_sys_call_table));
printk("System.map system_wq: 0x%lx\n", sysmap_system_wq);
printk("System.map sys_call_table: 0x%lx\n", sysmap_sys_call_table);
printk("Run time system_wq: 0x%lx\n", (unsigned long)system_wq);
printk("Expected run time sys_call_table: 0x%lx\n", (unsigned long)runtime_sys_call_table);
启用 KASLR
引导 1:
[ 126.922753] [lkm] lkm_init: System.map system_wq: 0xffffffff821204b8
[ 127.230661] [lkm] lkm_init: System.map sys_call_table: 0xffffffff81c002a0
[ 127.230662] [lkm] lkm_init: Run time system_wq: 0xffff91fcbe40ae00
[ 127.230662] [lkm] lkm_init: Expected run time sys_call_table: 0xffff91fcbdeeabe8
引导 2:
[ 140.689652] [lkm] lkm_init: System.map system_wq: 0xffffffff821204b8
[ 140.993379] [lkm] lkm_init: System.map sys_call_table: 0xffffffff81c002a0
[ 140.993381] [lkm] lkm_init: Run time system_wq: 0xffff9a69be40ae00
[ 140.993382] [lkm] lkm_init: Expected run time sys_call_table: 0xffff9a69bdeeabe8
KASLR 已禁用
引导 1:
[ 143.699539] [lkm] lkm_init: System.map system_wq: 0xffffffff821204b8
[ 144.002094] [lkm] lkm_init: System.map sys_call_table: 0xffffffff81c002a0
[ 144.002095] [lkm] lkm_init: Run time system_wq: 0xffff88803e40ae00
[ 144.002096] [lkm] lkm_init: Expected run time sys_call_table: 0xffff88803deeabe8
引导 2:
[ 133.828917] [lkm] lkm_init: System.map system_wq: 0xffffffff821204b8
[ 134.132394] [lkm] lkm_init: System.map sys_call_table: 0xffffffff81c002a0
[ 134.132395] [lkm] lkm_init: Run time system_wq: 0xffff88803e40ae00
[ 134.132395] [lkm] lkm_init: Expected run time sys_call_table: 0xffff88803deeabe8
问题
1 . 为什么sys_call_table
当 KASLR 被禁用时,运行时地址与 System.map 的运行时地址匹配(我知道是因为系统调用已成功挂接)而system_wq
没有?
2 . 为什么代码片段无法计算sys_call_table
是否启用了 KASLR 的运行时地址?
3 . 如果它的运行时地址system_wq
与 System.map 的运行时地址不同,那么还有哪些其他导出符号可用于派生sys_call_table
?