1

在尝试了在关于该主题的上一个问题上推导 KASLR 偏移偏移的建议解决方案后,我意识到运行时地址与是否启用 KASLR 不同(尽管在不同的禁用 KASLR 时它确实保持相同system_wq/boot/System.map-$(uname -r)靴子,这显然不会发生在相反的情况下)。

以下代码段应sys_call_table使用 and 的运行时地址和两者的 System.map 地址来计算地址(system_wq假设包含相应的 System.map 地址)。输出位于代码段下方。system_wqsys_call_tablesysmap_*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

4

1 回答 1

0

Ian Abbott 的评论解决了我的问题并使所有问题都过时了。为了澄清起见,我的困惑是它system_wq是一个简单的指针struct workqueue_struct,这让我认为它已经包含了我想要的地址;然后我想我只需要像我一样转换它sys_call_table,它实际上是一个指针数组,为 while生成(unsigned long)sys_call_table一个正确的地址。sys_call_table(unsigned long)&system_wqsystem_wq

于 2019-11-28T13:27:37.510 回答