1

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

4

0 回答 0