Guest User

Untitled

a guest
Apr 21st, 2014
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <pthread.h>
  4. #include <signal.h>
  5. #include <sys/ucontext.h>
  6. #include <sys/mman.h>
  7.  
  8. struct my_thread
  9. {
  10.     void *stack;
  11.     ssize_t stack_size;
  12.     void* (*init_func) ();
  13. };
  14.  
  15. __thread struct my_thread *curthr;
  16.  
  17. void segfault_handler (int sig, siginfo_t *info, ucontext_t *ctx)
  18. {
  19.     ssize_t stack_boundary = (ssize_t)curthr->stack - curthr->stack_size;
  20.     size_t rsp = ctx->uc_mcontext.mc_rsp;
  21.     if (rsp < stack_boundary)
  22.     {
  23.         fprintf (stderr, "Stack overflow\n");
  24.         printf ("Stack boundary: 0x%08lx, RSP: 0x%08lx\n", stack_boundary, rsp);
  25.     }
  26. }
  27.  
  28. void* new_thread_trampoline (struct my_thread *th)
  29. {
  30.     curthr = th;
  31.     stack_t sigstack;
  32.     sigstack.ss_sp = malloc (SIGSTKSZ);
  33.     sigstack.ss_size = SIGSTKSZ;
  34.     sigstack.ss_flags = 0;
  35.     sigaltstack (&sigstack, NULL);
  36.  
  37.     return th->init_func();
  38. }
  39.  
  40. void* stack_over()
  41. {
  42. /*    int *iknowthepath = 0x477777777f;
  43.     iknowthepath[0] = 445;
  44.     printf ("Here\n");*/
  45.    int arr[10000000];
  46.    arr[9] = 0;
  47.    arr[0] = 0;
  48.    printf ("%i\n", arr[0]);
  49.     return NULL;
  50. }
  51.  
  52. int main ()
  53. {
  54.     pthread_t new_thr;
  55.     struct my_thread *my_new_thr = malloc (sizeof (struct my_thread));
  56.     my_new_thr->stack_size = 2000000;
  57.     my_new_thr->stack = mmap (NULL, my_new_thr->stack_size,
  58.                               PROT_READ|PROT_WRITE,
  59.                               MAP_ANON|MAP_PRIVATE, -1, 0);
  60.     my_new_thr->init_func = stack_over;
  61.  
  62.     struct sigaction sa;
  63.     sa.sa_sigaction = segfault_handler;
  64.     sa.sa_flags = SA_SIGINFO | SA_RESETHAND | SA_ONSTACK;
  65.     sigemptyset (&sa.sa_mask);
  66.     sigaction (SIGSEGV, &sa, NULL);
  67.  
  68.     pthread_attr_t attr;
  69.     pthread_attr_init (&attr);
  70.     pthread_attr_setstack (&attr, my_new_thr->stack, my_new_thr->stack_size);
  71.     pthread_create (&new_thr, &attr, (void * (*) (void*))new_thread_trampoline, my_new_thr);
  72.     pthread_join (new_thr, NULL);
  73.  
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment