为什么不能使用System.map中的system_wq的地址派生sys_call_table的地址?

问题描述 投票:1回答:1

[在尝试了有关在此主题上得出a previous question上的KASLR偏移量的建议解决方案后,我意识到无论是否启用了KASLR,system_wq的运行时地址都与/boot/System.map-$(uname -r)中的运行时地址不同(尽管在不同的已禁用KASLR的靴子上保持相同,显然在相反的情况下不会发生)。

以下代码段应使用sys_call_table的运行时地址以及system_wqsystem_wq的System.map地址来计算sys_call_table地址(假设sysmap_*包含相应的System.map地址) 。 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

Boot 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

Boot 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

Boot 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

Boot 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。为什么在禁用KASLR而不是sys_call_table时,system_wq的运行时地址与System.map的运行时地址匹配(我知道这是因为成功调用了系统调用)?

2

。为什么无论是否启用了KASLR,该代码段为何都无法计算sys_call_table的运行时地址?

3

。如果情况确实是system_wq的运行时地址与System.map的运行时地址不同,那么可以使用哪些其他导出的符号来派生sys_call_table

在尝试了有关此主题的上一个问题的派生KASLR偏移量的建议解决方案后,我意识到system_wq的运行时地址与/ boot / System中的运行时地址不同。...

c linux-kernel system-calls kernel-module rootkit
1个回答
0
投票
Ian Abbott的评论解决了我的问题,使所有问题都过时了。为了澄清起见,我感到困惑的是,system_wq是指向struct workqueue_struct的简单指针,这使我认为它已经包含了我想要的地址;然后,我以为我只需要像使用sys_call_table一样强制转换它,它实际上是一个指针数组,使(unsigned long)sys_call_table成为sys_call_table的正确地址,就像(unsigned long)&system_wq代表system_wq一样。
© www.soinside.com 2019 - 2024. All rights reserved.