在内核模式下修改用户堆栈指针

时间:2018-09-06 17:30:21

标签: c linux-kernel cpu-registers stack-pointer

我正在编写一个char设备,该设备将ioctl作为输入使用一个函数指针和一个缓冲区指针。
我想修改用户机器上下文,以便在用户模式下,使用该缓冲区指针指向的新堆栈执行该功能。

我所做的是:

    long ioctl_funcs(struct file *filp,unsigned int cmd, unsigned long arg)
    {
        int ret = 0;
        switch(cmd) {
        case IOCTL_SET_FUN:

            printk(KERN_INFO "start\n");
            struct myarg* a;
            a = (struct myarg*) arg;
            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
            break;
         }
       return ret;
      }

好消息是该功能已激活,坏消息是堆栈是相同的(我已经使用gdb对其进行了测试)。
特别是即使:regs->sp = 0;也会由于没有堆栈而在新函数崩溃时执行。
看来以这种方式分配堆栈指针是无效的。

为什么?我应该如何正确分配堆栈指针?

Linux内核版本为:3.18.16,在Virtual Box上执行。

0 个答案:

没有答案