我试图将指令点(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()
。