命令ポイント ( regs->ip) をロード可能なカーネル モジュール (Linux 3.13 用) の関数の戻りアドレスに設定しようとしています。ただし、stack smashing検出をスローします。私の質問は、それを回避する方法です。
より具体的には、カーネル モジュールに命令ポイントを設定する前のユーザー ランド プロセスのスタックは次のようになります。
+--------+
| foo |
+--------+
| bar |
+--------+
| bottom |
+--------+
カーネル モジュールはip(命令ポイント) を の戻りアドレスに設定しbarます。これは明らかにスタック オーバーフローです...
fooそこで、カーネルモジュールでのリターンをシミュレートできれば、エラーが発生ipしないように設定できるかどうかを考えていsmashing detectedます。
まず、この推測は正しいですか?つまりfoo、カーネル空間での復帰をシミュレートすることで、barスマッシングを検出せずに復帰できますか?
第二に、それが正しければ、それをカーネル空間に実装する方法は?
更新: 言及すべき興味深い (または未定義の) 動作:bar関数は次のようになります。
foo(){
call_into_kernel_module();
printf("end of foo()");
}
bar(){
...
char a[4];
...
foo();
printf("end of bar()");
}
aデータが入力されたり、後で参照されたりすることはありません。宣言を削除するsmashingと、なくなります。それ以外の場合はそのままです。end of bar()(ところで、私は印刷物で見ることができます)。