C 如果堆栈指针被重新分配,为什么ASLR会生成SIGSEV

C 如果堆栈指针被重新分配,为什么ASLR会生成SIGSEV,c,kernel-module,ioctl,aslr,stack-pointer,C,Kernel Module,Ioctl,Aslr,Stack Pointer,我正在编写一个char设备,它使用ioctl函数指针和缓冲区指针作为输入。 我想修改用户机器上下文,以便在返回用户模式时,使用缓冲区指针指向的新堆栈执行该函数。 但是,如果在ASLR激活的情况下运行程序,则分段故障会终止程序,否则不会出现问题。 这是ioctl中代码的有趣部分: struct pt_regs* regs = task_pt_regs(current); regs->ip = a->func;// func is a function i

我正在编写一个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

何时何地崩溃?更改后从kernelspace返回时是否立即执行?或者稍后,比如当函数返回时,它当然不会工作,因为(在基本上所有的真实体系结构上)堆栈向下增长。一旦函数被输入并开始将内容推到堆栈上,它就会从底部运行并冲击其他内存,或者碰到未映射的页面并出错。而且,
100*sizeof(int)
对于堆栈来说太小了。最小可行量约为2k,如果可能,在该堆栈上运行时会发送信号,则需要大得多。它不能“在禁用ASLR的情况下工作”。内存恰好以另一种方式布局,它会撞击其他内容,而不是命中无效地址和错误。
malloc(4000,sixeof(int))
不是有效的C。我认为您需要显示实际的代码。