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 |