命令ポイント ( 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()
(ところで、私は印刷物で見ることができます)。