我正在编写一个char设备,该设备将ioctl作为输入使用一个函数指针和一个缓冲区指针。
我想修改用户机器上下文,以便在用户模式下,使用该缓冲区指针指向的新堆栈执行该功能。
但是,如果在ASLR激活的情况下运行该程序,则分段错误将终止该程序,否则不会出现问题。
这是ioctl
内部代码的有趣部分:
struct pt_regs* regs = task_pt_regs(current);
regs->ip = a->func;// func is a function implemented in user space
regs->sp = a->stack;// stack is the buffer allocated in user space with malloc
我的问题是为什么会这样:ASLR每次执行时都会更改程序的虚拟地址空间,但是这种随机化如何在随后重新分配堆栈指针时造成问题?
内核版本为4.14.68