Systemhacking/FTZ

[FTZ] level9

レ(゚∀゚;)ヘ=З=З=З 2021. 5. 6. 12:09
728x90

level 9

(password : apple)

 

'ls'을 통해 'hint' 파일이 존재하는 것을 확인한 후, 'cat'명령어를 통해 내용을 확인하였다.

'/user/bin'에 위치한 'bof' 파일의 소스코드가 출력되었고, 이 소스를 이용하여 level10의 권한을 얻는 문제이다.

여기서 나오는 'bof'는 시스템 해킹에서 가장 기초가 되는 취약점으로 버퍼가 넘쳤음을 의미하는 'buffer over flow' 의 준말이다. 공격자는 지정한 입력값 외에 원하는 값을 버퍼의 크기보다 많이 넣으면 공격자가 원하는 명령을 실행할 수 있다.

먼저 'bof' 소스를 해석해보았다.


#include <stdio.h>

#include <stdlib.h>
#include <unistd.h>
main(){
   char buf2[10];                                      (1)
   char buf[10];

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

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


(1) buf와 buf2에 10바이트씩 공간 할당
(2) buf에 40바이트 크기만큼 입력 받음
(3) strncmp를 통해 buf2의 문자열이 go인지 확인 (일치하면 if문 내부)

(4) uid를 설정(다음 레벨의 uid)
(5) 쉘 실행(다음 레벨 권한 얻음)

 

'/usr/bin/bof' 파일을 실행시켜 위에 나와있던 'go'을 포함한 총 12바이트를 입력해주었다. (원래 'buf'는 10바이트)

예상했던 결과가 안나왔기 때문에 내부로 들어가서 확인해보았다.

'vim'을 통해 'bof.c' 소스코드를 입력해준 다음에 'bof'이름으로 컴파일을 해주었다.

'ls'을 통해 확인해보니 파일이 생성된 것을 확인할 수 있다.

'gdb -q bof'를 통해 'bof'를 디버깅하였다. 그리고 'set disassembly-flavor intel'을 통해 'intel 문법'으로 확인할 수 있게 하고, 'disas main'을 통해 'main() 함수'부분을 확인하였다.

확인하였더니, [ebp-40] 에 입력받은 'buf' 값이 들어가고, [ebp-24]에서 비교를 하고 있는 것을 확인할 수 있다. 즉, [ebp-24] 에는 'buf2'가 있는 것이다.

'buf'에서 값을 입력하는데, 입력한 값이 넘쳐서 'buf2'가 있는 곳까지 와야한다.

그러기 위해서는 'buf'와 'buf2'의 거리인 16바이트(40 - 24 = 16)만큼 채워야지 'buf2'에서 "go"와 비교를 할 수 있게 된다.

다시 '/usr/bin/bof'을 실행시킨다음, 'aaaaaaaaaaaaaaaago' (a:16글자)를 입력해주었더니 성공 문자열인 "Good Skill!" 이 나왔다. 성공을 통해 'level10'의 실행 권한을 얻었으므로 [level10@ftz tmp] 에 접속이 되었고, 'my-pass'를 통해 'level10'의 password인 "interesting to hack!" 을 얻었다.

 

'Systemhacking > FTZ' 카테고리의 다른 글

[FTZ] level 11  (0) 2021.05.17
[FTZ] level10  (0) 2021.05.17
[FTZ] level6  (0) 2021.03.30
[FTZ] level5  (0) 2021.03.30
[FTZ] level4  (0) 2021.03.30