#define __USE_GNU 
#include <stdio.h>
#include <signal.h>
#include <ucontext.h>
#include <sys/ucontext.h>

void sig_handler(int signo, siginfo_t * info, ucontext_t * context)
{
 int i=0; 
 printf("\n\nSegmentation Fault Handler=================================\n");
 printf("Address: %x\nEIP: %x\nEAX: %x\n\n", info->si_addr,context->uc_mcontext.gregs[14], 				context->uc_mcontext.gregs[11]);
 
 for(i=0; i< 20; i++) { //display program bytes at faukkt location
	 printf("%02x ", 0xff & *(char *)(context->uc_mcontext.gregs[14]+i));
 }
 printf("\n\n");
 
 context->uc_mcontext.gregs[14]+=10; //skip over fault
// exit(0);
}

int func()
{
 return 0x12;
}


int main(int argc, char **argv)
{

 struct sigaction act;
 struct sigaction oact;
 sigset_t sset;

 sigemptyset(&sset);
 sigaddset(&sset, SIGSEGV); 


 act.sa_flags = SA_SIGINFO ;
 act.sa_mask = sset;
 act.sa_sigaction = sig_handler;

 sigaction(SIGSEGV, (const struct sigaction *) &act, NULL); 

 func(); //test eax's return value
 
 *(long*)0x12345678 = 0x11223344;
 

 printf("Done here!\n");

 return 0;
}
