[view source] |
/* The Lord of the BOF : The Fellowship of the BOF - xavius - arg */ #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); } |
♧ 사용 할 수 있는 공간이 별루 없다. |
[ summary ] | ||||
① strace ./사본으로 내용을 보면 fgets()는 내부 시스템콜 read()를 호출하는데
② gdb로 fgets를 호출 후 바로 확인해 보면 입력한 "DDDD~"가 0x40015000부터 들어가는 것을 볼 수 있다.
|
[ Attack ] | ||
※(0x40015000은 마지막 "00"이 널로 취급 때문에 NOP썰매가 있는 곳으로 수정)
성공!!! |
nightmare : "beg for me"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL20] xavis -> death_knight (remote BOF) (0) | 2011.06.18 |
---|---|
[LEVEL18] succubus -> nightmare (plt) (0) | 2011.06.15 |
[LEVEL17] zombie_assassin -> succubus (function calls) (0) | 2011.06.12 |
[LEVEL16] assassin -> zombie_assassin (fake ebp) (0) | 2011.06.11 |
[LEVEL15] giant -> assassin (no stack, no RTL) (0) | 2011.06.10 |