このトピックに関する以前の質問でKASLR オフセット シフトを導出するための提案された解決策を試した後、のランタイム アドレスは、KASLR が有効かどうかsystem_wq
によって異なることに気付きました (ただし、KASLR が無効になっていても同じままです)。/boot/System.map-$(uname -r)
反対のケースでは明らかに発生しません)。
次のスニペットはsys_call_table
、 のランタイムsystem_wq
アドレスと両方の System.map アドレスを使用してアドレスを計算する必要がsystem_wq
ありますsys_call_table
(対応する System.map アドレスが含まれていると仮定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
か?