Я пишу символьное устройство, которое принимает в качестве входных данных с 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