2.4以降(またはそれ以降?)では、sys_call_table
シンボルはエクスポートされなくなり、システムコールのフックが困難になりました。
IDTから、または/boot/System.map-<kernel-version>
を読み取ることでこの情報を取得できることを無視して、なぜこのアドレスが再起動とマシン(同じカーネルバージョン)で一定であるように見えるのか疑問に思いました。動的にするだけの価値はありませんか?静的である必要がある理由はありますか?
私が目指しているのはこれです:
sys_call_table
は、syscallのフックを少し難しくするためにモジュールにエクスポートされなくなりましたが、モジュール(つまり、カーネル空間プログラム)は、System.map
を読み取るか、カーネルに基づいて推測することで、この情報を簡単に取得できます。同じバージョンのカーネルを実行しているすべてのマシンでアドレスが同じであるように見えるため、リリース情報。
少なくともカーネルのバージョン4.8以降、少なくともx86では、カーネルアドレス空間は、システムコールテーブルのアドレスを含めてランダム化されます。基本的な詳細については、 カーネル構成のRANDOMIZE_BASE
を参照してください。
これは、System.map
で指定されたアドレスが役に立たず、システムコールテーブルのアドレスが起動のたびに変更されることを意味します。何かをデバッグする必要があり、System.map
を使用する場合は、nokaslr
カーネルコマンドラインパラメーターを使用して起動してKASLRを無効にする必要があります。