2

我过去曾针对用户级进程进行过缓冲区溢出攻击。但是,如果我尝试溢出易受攻击的内核模块的缓冲区,这似乎不起作用。这就是我所做的:

有一个易受攻击的内核模块,我可以将其作为文件打开并对其进行读/写。写操作是在没有边界检查的情况下完成的。所以我做了一个写操作并溢出缓冲区并将返回地址覆盖为具有我的 shellcode 的环境变量的地址。但是出了点问题。内核崩溃,重新启动后我打开 /var/log/messages 并发现 eip 正确指向我覆盖的地址。但是它仍然崩溃说“无法处理虚拟地址处的内核空指针取消引用”有什么原因会发生这种情况吗?为什么不将控件重定向到覆盖的返回地址?

注意:我在 Redhat Enterprise linux 上运行了这个,并关闭了 exec-shield 和 ASLR。

4

1 回答 1

4

内核不能在不执行内核退出的情况下跳转到用户地址,因为它在特权模式下运行,具有与用户空间不同的配置(例如不同的分页表、CPU 权限位等)。

因此,为了将 shellcode 放入内核,您必须将 shellcode 打包到写入驱动程序(并复制到内核)的缓冲区中,并以某种方式获取它的地址。如果您可以访问内核映射,这并不难,但最近 Linux 发行版已开始锁定对此类敏感信息的访问,以使利用内核错误变得更加困难。

于 2012-09-26T04:19:36.183 回答