我在Linux上运行x86-64进行一些内核攻击,用于研究项目。从内核例程我需要跳转到用户模式代码页并立即返回到内核代码。换句话说,我需要在内核中执行时对用户代码进行蹦床。
我想知道这是否完全可能。如果可能的话,有人可以知道如何实现这一目标吗?
答案 0 :(得分:3)
不太可能“轻松”。
在不知道您的应用程序的情况下,并且没有建议您重新考虑您的内核< - >应用程序界面,可能的黑客攻击可能是这样的:让应用程序通过传递内容组件来注册一段trampoline代码与您的内核组件该代码的地址。 trampoline代码将执行你的“真实”用户模式函数,然后发出另一个系统调用或异常以返回内核。
虽然这不完全是用户模式子程序,但它会合理地接近:当你的应用程序调用任何内核函数需要进行回调时,内核函数可以保存实际的返回地址,将其更改为已注册的蹦床地址并返回用户模式。蹦床将调用该函数,其后的系统调用/异常会将您带回内核,您可以继续执行任何操作。
你可能不需要担心安全问题,但是如果你这样做,你可能必须确保“从蹦床返回”系统调用只能从你仍然有开放蹦床黑客的进程中接受。
您还可以了解信号的工作原理;它们是关于让内核中断应用程序并让应用程序调用信号处理程序;类似信号的实现甚至可以在你的应用程序没有活动的系统调用的情况下工作(但它也会有信号处理程序的所有限制)。
事实上,也许你可以只使用一个信号?再次,看一下信号在内核中的工作方式,并发出用户代码的信号。在应用程序中安装适当的信号处理程序,并让信号处理程序调用“从用户空间trampoline返回”系统调用。
无论哪种方式,它听起来有点...... hackish。在没有完成任何内核工作的情况下,我会假设通过设备节点,套接字或类似机制与您的应用程序连接可能是一种更好的方式......或者只是让您的系统调用将“待办事项”结果项返回给应用程序告诉它调用siome用户空间代码并使用另一个系统调用报告。