BOF/ ftz-level03

 

FTZ란 Free Training Zone의 약자로 hackerschool에서 배포하는 워게임입니다.
총 20문제로 구성되어 있으며 각 문제를 격파하여 다음 레벨의 패스워드를 얻는 형식입니다.
문제를 격파하고 다음 레벨의 bash를 획득하였다면 my-pass로 패스워드를 확인할 수 있습니다.

사용 linux 명령어
ls - 파일 내역 출력 cat - 파일 내용 확인
find - file search 명령
ex) find / -user level2 2>/dev/null
/(root)디렉터리부터 level2 유저소유의 파일을 탐색하고 오류는 출력하지 않음

send me email if you have any questions.


FTZ Level 3

ID : level3
PASSWD : can you fly?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  
#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 );

}

level3의 힌트로 제공되는 소스.
추가 힌트

  1. 동시에 여러 명령어를 사용하려면?
  2. 문자열 형태로 명령어를 전달하려면?


argc는 main에 전달되는 파라미터의 개수이고 argv는 main에 전달되는 파라미터이다.
인자의 개수가 2개가 아니라면 프로그램을 종료하도록 조건이 걸려있다.
argv[0]는 파일명, argv[1]부터 전달한 인자이므로 프로그램을 실행할 때, 1개의 인자를 전달하면 조건을 피할 수 있다.
strcpy? - 문자열 복사 함수로 cmd에 “dig @”를 복사.
strcat? - 문자열을 연결하는 함수로 cmd에 argv[1]을 이어붙임.
system? - linux의 명령을 실행하는 함수로 파라미터로 전달받은 명령을 실행.


그림1
힌트로 제공받은 소스의 바이너리 파일을 찾아 공격을 시도하자.
명령어를 문자열 형태로 전달하기 위해 ““로 감싸고 동시에 여러 명령어를 전달하기 위해 ;를 활용하자
;는 linux에서 여러 명령어를 동시에 실행하기 위해 사용된다.

level4의 passwd를 획득하였다.