[LOB] vampire -> skeleton
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 47 48 49 50 | /* 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])); } | cs |
1) egghunter 환경변수를 못씀
2) argv[1][47] 에 \xbf가 없으면 종료(ret 주소) -> 스택 내에 쉘코드를 써야한다는 것을 뜻합
3) buffer hunter 버퍼를 비움 -> 버퍼내에 쉘코드 쓰기불가
4) argv[1](첫번째 인자) 길이를 48로 제한
5) ultra argv hunter! argv 모두 초기화
버퍼에 인자도 모두 못써서 난감했는데 스택의 끝에 프로그램경로가 저장된다고 한다
argv가 모두 초기화 된 후main+368에 브포를 걸고
경로가 나올때까지 계속찾아본다
.....(엄청난 노가다)
메모리의 맨 끝, 스택으로 보면 맨 처음에 경로가 있는걸 확인할 수 있다
전레벨처럼 쉘코드를 이름으로 한 심볼릭링크를 생성한다
\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3
여기서 쉘코드앞에 경로 "/home/vampire/"부분을 빼야하는데 간단하게 0xbfffffd2에서 14를 더하면
0xbfffffe5+14=0xbffffff3 을 ret에 덮어주면 된다
?? 분명 제대로했는데;; 주소가 바뀐건가
심볼릭링크 원본을 skeleto1로 바꿔 core를 떨어트린 후 분석해보자
역시 주소가 바뀌었다. 그런데 왜 아까 절대경로이던게 상대경로가 된건지는 잘 모르겠다
"./"를 빼기 위해 2바이트를 더한 0xbfffffd4 를 ret에 덮어주고 페이로드를 다시 짜보자
페이로드와 Password
'System > LOB' 카테고리의 다른 글
함수의 프롤로그(prologue) 및 에필로그(epilogue) (0) | 2015.04.10 |
---|---|
[LOB] skeleton -> golem (0) | 2015.04.07 |
[LOB] troll -> vampire (0) | 2015.04.01 |
[LOB] orge -> troll (0) | 2015.04.01 |
[LOB] darkelf -> orge (0) | 2015.03.31 |