vampire --- music world
우선 vampire의 디렉터리를 확인한다.
skeleton이라는 의심스러운 파일이 존재한다. skeleton은 skeleton의 권한을 가지고 있고, setuid가 걸려있는 파일이다.
skeleton.c를 가지고 skeleton 파일을 만들었을 가능성이 있기 때문에, skeleton.c 파일을 본 뒤 어떤 취약점을 가지고 있는지 확인해보자.
환경변수 리스트의 포인터를 선언한다.
1 | extern char **environ; | cs |
지역 변수를 선언한다.
1 2 | char buffer[40]; int i, saved_argc; | cs |
인자 전달이 없으면 "argv error\n"를 출력하고 종료한다.
1 2 3 4 5 | if(argc < 2) { printf("argv error\n"); exit(0); } | cs |
모든 환경변수를 0으로 초기화한다.
1 2 | for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); | cs |
첫 번째 인자의 48번째 문자가 '\xbf' 가 아니면 "stack is still your friend!\n"를 출력하고 종료한다.
1 2 3 4 5 | if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } | cs |
첫 번째 인자의 길이가 48 byte 이상이면 "argument is too long"을 출력하고 종료한다.
1 2 3 4 5 | if(strlen(argv[1]) > 48) { printf("argument is too long!\n"); exit(0); } | cs |
argc를 지역변수에 저장한다.
1 | saved_argc = argc; | cs |
첫 번째 인자를 buffer에 저장하고 출력한다.
1 2 | strcpy(buffer, argv[1]); printf("%s\n", buffer); | cs |
buffer를 0으로 초기화한다.
1 | memset(buffer, 0, 40); | cs |
인자(argv)를 초기화한다.
1 2 | for(i=0; i<saved_argc; i++) memset(argv[i], 0, strlen(argv[i])); | cs |
skeleton의 메모리 구조를 예상해보면 아래와 같이 그릴 수 있다.
실제 배열과 변수가 할당될 때 gcc가 최적화를 위해 자동적으로 dummy를 생성할 수 있다.
gdb를 이용해서 skeleton을 분석해보자. skeleton을 gdb로 실행하는 도중 permission denied가 발생하면 cp 명령을 이용해 파일을 복사하면 된다. 현재 user의 권한으로 똑같은 파일을 가질 수 있기 때문이다.
위와 같이 skeletoncp가 vampire의 권한으로 복사된것을 확인할 수 있다.
dummy가 생성되었는지 gdb를 통해 확인해보자.
dummy가 추가적으로 생성되지 않고 정확히 48(0x30) byte가 생성된 것을 확인할 수 있다.
환경변수, 버퍼, 스택의 RET이 저장된 뒷부분, 인자 를 이용하여 공격할 수 없다.
모든 공간이 초기화 되기 때문이다.
그렇다면 어떤 방식으로 공격을 진행해야할까????
정답은 아래와 같다.
"argv를 초기화 하더라도 argv[0]의 주소는 초기화 되지 않는다."
gdb를 통해 확인해보자.
다음과 같이 argv가 초기화 된 상태에서 스택영역을 살펴봤더니 argv[0]에 대한 정보가 남아있다.
이를 이용하여 쉘 코드가 스택영역에 계속 남아있도록 수정할 것이다.
argv[0]을 심볼릭 링크를 이용해 쉘코드로 수정하자.
제대로 실행이 되지 않는다. core dumped를 이용해 분석해보자.
0xbfffff01 ~ 0xbfffffc9까지 쉘코드가 있는 주소이다. 쉘 코드의 앞뒤로 NOP padding을 하였으니 공격주소를 0xbfffff10으로 잡고 공격하자.
이제 공격 대상의 skeleton으로 바꾸어 진행해보자.
'Wargame > LOB' 카테고리의 다른 글
해커스쿨 LOB golem 풀이, write-up (0) | 2018.08.30 |
---|---|
해커스쿨 LOB skeleton 풀이, write-up (0) | 2018.08.16 |
해커스쿨 LOB troll 풀이, write-up (0) | 2018.08.14 |
해커스쿨 LOB orge 풀이, write-up (0) | 2018.08.14 |
해커스쿨 LOB darkelf 풀이, write-up (0) | 2018.08.13 |