ID: level9
Password: apple
find / -user level10 -perm -4000

level10 유저의 SetUID 권한을 가진 파일을 검색하면 /usr/bin/bof 파일을 찾을 수 있다.
/usr/bin/bof

해당 파일을 실행하면 'It can be overflow:' 문구와 함께 입력창이 뜨는 걸로 보아 버퍼 오버플로우를 이용해 문제를 푸는 것 같다.
cat hint
힌트를 보면, /usr/bin/bof의 소스 코드를 제공한다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(){
char buf2[10]; //10 크기의 char 배열 buf2 선언
char buf[10]; //10 크기의 char 배열 buf 선언
printf("It can be overflow : ");
fgets(buf,40,stdin); //buf 배열에 최대 40만큼 저장
if ( strncmp(buf2, "go", 2) == 0 ) //buf2와 "go"를 2만큼 비교하여 일치하면
{
printf("Good Skill!\n");
setreuid( 3010, 3010 ); //UID를 level10의 값으로 변경
system("/bin/bash"); //쉘 실행
}
}
buf 배열의 크기는 10인데, fgets 함수로 buf 배열에 최대 40만큼 입력을 받는다. 이런 경우 배열의 크기를 초과하여 입력 받을 수 있으므로 버퍼 오버플로우의 위험이 있다.
버퍼 오버플로우
버퍼에 데이터를 쓰는 소프트웨어가 버퍼의 용량을 초과하여 인접한 메모리 위치를 덮어쓸 때 발생하는 취약점
if문을 보면 buf2와 "go"를 비교하여 그 값이 일치할 경우 level10의 권한을 얻고 쉘이 실행된다. 따라서, level10 권한을 얻으려면 버퍼 오버플로우를 이용해 buf2 배열에 "go"를 집어넣어야 한다.

buf 배열과 buf2 배열의 메모리 위치를 정확히 모르기 때문에 일단 buf 배열을 꽉 채우도록 "go"를 5번 입력한 다음, "go"를 하나씩 늘려가며 /usr/bin/bof를 실행했다.
"go"를 9번 반복 입력하니 if문이 실행되어 level10의 권한을 얻었다. buf 배열과 buf2 배열의 시작 주소가 16byte 차이임을 유추할 수 있다.
my-pass

비밀번호 획득 성공!