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