⊙ 문제의 소스를 보자) |
[orc@localhost orc]$ cat wolfman.c /* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */
#include <stdio.h> #include <stdlib.h>
extern char **environ;
main(int argc, char *argv[]) { char buffer[40]; int i;
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); } strcpy(buffer, argv[1]); printf("%s\n", buffer);
// buffer hunter memset(buffer, 0, 40); } + [LEVEL4]와 틀려진 곳은 맨 마지막 줄에 memset(buffer, 0, 40)으로 buffer를 40Byte 초기화 |
1) 셸코드는 어디에? | ||||||||||||
* 우리가 흔히 공격문으로 인자값을 넘겨 줄때 인자 배열 안에 들어가게 됩니다. [ 참조 ]
*그러므로 memset()으로 buffer가 초기화 되더라도 실행 인자로 넘겨준 공격문은 스택안에 남아 있게 됩니다. |
* 그럼 argv[1]에 들어있는 문자열의 주소(공격문)을 찾아야 겠네요.
2) 리턴 주소 값을 찾아 보자! | ||||
※ [ LEVEL 4 ]에서 공격문을 그대로 가져다가 테스트 하였습니다. ① wolfman.c 사본을 만들어 주소값을 확인해 봅시다.
② 리턴 주소를 찾았으니 변경 후 다시 확인.
|
3) 원본 공격 확인. | |
*바뀐 공격문
완료!!! |
orc : "cantata"
'워게임(WarGame) > BOF원정대(LOF)' 카테고리의 다른 글
[LEVEL7] darkelf -> orge (check argv[0]) (0) | 2011.06.02 |
---|---|
[LEVEL6] wolfman -> darkelf (check length of argv[1] + egghunter + bufferhunter) (0) | 2011.06.02 |
[LEVEL4] goblin -> orc (egghunter) (1) | 2011.06.02 |
[LEVEL3] cobolt -> goblin (small buffer + stdin) (0) | 2011.06.02 |
[LEVEL2] gremlin -> cobolt (small buffer) (0) | 2011.06.02 |