シンプルなsys_call_table書き換えを使用して、 システム内のすべてのexecve呼び出しをログに記録します。sys_call_tableは4.8カーネルで読み取り保護されていますか?
4.8カーネルでUbuntu 16.10に移動すると、この 機構が突然動作を停止しました。 16.04では で4.6カーネルが動作していました。
1: write_cr0 (read_cr0() & (~ 0x10000));
2: original_execve = (void *)syscall_table[__NR_execve];
3: syscall_table[__NR_execve] = (unsigned long)&new_execve;
4: write_cr0 (read_cr0() | 0x10000);
ページフォールトがすでに古いエントリを読んだときに起こる、それは私が使用しsys_call_tableアドレスをretriveするライン2 です:
sudo cat /boot/System.map-`uname -r` | grep -e '\ssys_call_table' | awk '{ print $1}')"
コードからです:https://github.com/eiselekd/shinterposer/tree/master/mod
誰もい何が起こったのか知っている?たぶん一部の 保護機構が導入されましたか?
今まで解決策が見つかりました:4.8カーネルを再コンパイルし、シンボルsys_call_tableをエクスポートしました。 はconst指定子を削除しました。そうすれば、sys_call_tableをモジュールから直接参照することができます。それでも、なぜそれが4.6のために働いたバージョンで墜落したのかまだ分からない。読み取り専用セクションのリンクは変更されていますか? –
[this](https://outflux.net/slides/2016/lss/kspp.pdf)プレゼンテーションで、Linuxが実装したすべての緩和策(いずれにしても、4.2まで)の良いサマリーを見つけることができます。 –
ありがとうございます。質問:kaslrが存在する場合、実際にsyscallテーブルのアドレスを取得する方法はありますか?とにかくそれは悪用と見なされるだろうと思う... –