У кого какие идеи, как сделать в rip неканонический адрес при сисколле?
Через ptrace() никак наверно. Сделать mmap в зоне неканонических адресов естественно не разрешает.
Пришла идея, что можно заммапить последнюю страницу 0x7ffffffff000 в юзерленде, занопить ее, а в самый конец поставить вызов сисколла, тогда по идее при его вызове rip выйдет за зону канонических адресов и станет 0x800000000000.
У меня на фре 9.0 в виртуалке подобный ход конем завешивает ее, в /var/crash пусто.
Какие мысли, это оно?
Код:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
char sc[]=
"\x90\x48\xb8\xb7\x00\x00\x00\x00\x00\x00\x00" // mov 123, rax
"\x48\x31\xff" // xor rdi, rdi
"\x0f\x05"; // syscall
void main(){
void (*addr)();
addr = mmap(0x00007ffffffff000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
if (addr == MAP_FAILED) {
printf("mmap fault\n");
exit(1);
}
memset(addr, 0x90,4096);
memcpy(addr+4080, sc, 16);
addr();
// 0x0000000000000000-0x00007fffffffffff 0xffff800000000000-0xffffffffffffffff
}