[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 |