/* * How to dereference a null pointer and get away with it. * * G. Back, CS 3214 */ #include #include #include #include #define __USE_GNU 1 #include static void install_signal_handler(int signal, void (*handler)(int, siginfo_t *, void *)) { struct sigaction act; act.sa_sigaction = handler; act.sa_flags = SA_SIGINFO; sigemptyset (&act.sa_mask); int status = sigaction (signal, &act, NULL); if (status) { perror ("sigaction"); exit (1); } } static void catch_segfault(int signo, siginfo_t *info, void * _ctxt) { ucontext_t * ctxt = _ctxt; printf("Catching Segfault at sig=%d fault addr is %p eip was at %x\n", signo, info->si_addr, ctxt->uc_mcontext.gregs[REG_RIP]); ctxt->uc_mcontext.gregs[REG_RIP] += 2; ctxt->uc_mcontext.gregs[REG_RSI] = 42; } int main() { install_signal_handler(SIGSEGV, catch_segfault); printf("Dereferencing NULL -> %d ...\n", *(int *)NULL); return 0; }