[LOB] nightmare -> xavious
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46  | #include <stdio.h> #include <stdlib.h> #include <dumpcode.h> main() {     char buffer[40];     char *ret_addr;     // overflow!     fgets(buffer, 256, stdin);     printf("%s\n", buffer);     if(*(buffer+47) == '\xbf')     {         printf("stack retbayed you!\n");         exit(0);     }     if(*(buffer+47) == '\x08')         {                 printf("binary image retbayed you, too!!\n");                 exit(0);         }     // check if the ret_addr is library function or not     memcpy(&ret_addr, buffer+44, 4);     while(memcmp(ret_addr, "\x90\x90", 2) != 0)    // end point of function     {         if(*ret_addr == '\xc9'){        // leave             if(*(ret_addr+1) == '\xc3'){    // ret                 printf("You cannot use library function!\n");                 exit(0);             }         }         ret_addr++;      }         // stack destroyer         memset(buffer, 0, 44);     memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));     // LD_* eraser     // 40 : extra space for memset function     memset(buffer-3000, 0, 3000-40); }  | cs | 
쓸수 있는게 별로없다.
스택사용불가, leave ret사용불가, 라이브러리사용불가, LD_PRELOAD 사용불가
뭘쓰라는거야 
stdin 임시입력버퍼 찾으면됨
strace ./xavius로 찾아보면 mmap으로 메모리 공간 확보하고 read()로 입력받는다
-> fets()는 read()를 사용한다.
-> 확보된 메모리공간 찾아가보면 입력받은 string이 남아있을 것.
페이로드와 Password
'System > LOB' 카테고리의 다른 글
| [LOB] succubus -> nightmare (0) | 2015.06.01 | 
|---|---|
| [LOB] zombie_assassin -> succubus (0) | 2015.04.30 | 
| [LOB] assassin -> zombie_assassin (0) | 2015.04.18 | 
| [LOB] giant -> assassin (0) | 2015.04.14 | 
| [LOB] bugbear -> giant (2) | 2015.04.14 |