web-dev-qa-db-ja.com

sys_call_tableが予測可能であるのはなぜですか?

2.4以降(またはそれ以降?)では、sys_call_tableシンボルはエクスポートされなくなり、システムコールのフックが困難になりました。

IDTから、または/boot/System.map-<kernel-version>を読み取ることでこの情報を取得できることを無視して、なぜこのアドレスが再起動とマシン(同じカーネルバージョン)で一定であるように見えるのか疑問に思いました。動的にするだけの価値はありませんか?静的である必要がある理由はありますか?

私が目指しているのはこれです:

sys_call_tableは、syscallのフックを少し難しくするためにモジュールにエクスポートされなくなりましたが、モジュール(つまり、カーネル空間プログラム)は、System.mapを読み取るか、カーネルに基づいて推測することで、この情報を簡単に取得できます。同じバージョンのカーネルを実行しているすべてのマシンでアドレスが同じであるように見えるため、リリース情報。

1
geekonaut

少なくともカーネルのバージョン4.8以降、少なくともx86では、カーネルアドレス空間は、システムコールテーブルのアドレスを含めてランダム化されます。基本的な詳細については、 カーネル構成のRANDOMIZE_BASE を参照してください。

これは、System.mapで指定されたアドレスが役に立たず、システムコールテーブルのアドレスが起動のたびに変更されることを意味します。何かをデバッグする必要があり、System.mapを使用する場合は、nokaslrカーネルコマンドラインパラメーターを使用して起動してKASLRを無効にする必要があります。

1
Stephen Kitt