我正在尝试将指令点 ( 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()
在打印输出中看到)。