rendered paste body#include <sys/mman.h>#include <signal.h>#include <stdio.h>#define MKCASE(x) case x: \ return #x; \ break;char *sigcodelist(int scl) { static char def_str[30]; switch(scl) { MKCASE(SI_USER); MKCASE(SI_KERNEL); MKCASE(SI_QUEUE); MKCASE(SI_TKILL); default: snprintf(def_str, 30, "%d", scl); return(def_str); } return(NULL);}void sigsegv_handler(int sig, siginfo_t *sit, void *ptr) { void *mmapptr; unsigned int pagebitmask, pagesize; pagesize = getpagesize(); pagebitmask = ~ (pagesize - 1); printf("pagebitmask = %p\n", pagebitmask); printf("->si_code = %s\n", sigcodelist(sit->si_code)); printf("ptr -> %p\n", ptr); if (sit->si_signo == SIGSEGV) { printf("Sigsegv at :%p\n", sit->si_addr); mmapptr = (void *)((unsigned int)sit->si_addr & pagebitmask); printf("mmap(%p) at = %d\n", mmapptr, mmap(mmapptr, pagesize, PROT_READ|PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0) ); memset(mmapptr, -1, pagesize); }}void installsh() { struct sigaction n; memset(&n, 0, sizeof n); n.sa_sigaction = sigsegv_handler; n.sa_flags = SA_SIGINFO; printf("sigaction = %d\n", sigaction(SIGSEGV, &n, NULL));}int main() { installsh(); char *a = 0x123; printf("%p = %d\n", a, *a); return(0);}