[在尝试了有关在此主题上得出a previous question上的KASLR偏移量的建议解决方案后,我意识到无论是否启用了KASLR,system_wq
的运行时地址都与/boot/System.map-$(uname -r)
中的运行时地址不同(尽管在不同的已禁用KASLR的靴子上保持相同,显然在相反的情况下不会发生)。
以下代码段应使用sys_call_table
的运行时地址以及system_wq
和system_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);
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
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中的运行时地址不同。...
system_wq
是指向struct workqueue_struct
的简单指针,这使我认为它已经包含了我想要的地址;然后,我以为我只需要像使用sys_call_table
一样强制转换它,它实际上是一个指针数组,使(unsigned long)sys_call_table
成为sys_call_table
的正确地址,就像(unsigned long)&system_wq
代表system_wq
一样。