模拟内核空间中的函数返回

时间:2015-06-06 20:28:09

标签: c linux-kernel return stack-overflow stack-smash

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

0 个答案:

没有答案