[Pwnable] fd
Wargame/pwnable.kr

[Pwnable] fd

와! 슬라임!

오늘은 처음으로 pwnable.kr 문제를 풀어볼라 한다.

 

리눅스의 file descriptor와 관련된 문제인거 같다.

 

제시되어 있는 주소로 들어가보자

 

flag 파일이 있지만 당연하게도 읽히진 않는다.

 

c 파일을 열어보자

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
        if(argc<2){
                printf("pass argv[1] a number\n");
                return 0;
        }
        int fd = atoi( argv[1] ) - 0x1234;
        int len = 0;
        len = read(fd, buf, 32);
        if(!strcmp("LETMEWIN\n", buf)){
                printf("good job :)\n");
                system("/bin/cat flag");
                exit(0);
        }
        printf("learn about Linux file IO\n");
        return 0;
}

차례차례 이해를 해보면

 

1. 실행파일을 실행시킬때 인자값이 없다면 "pass argv[1] a number\n"를 출력해준다.

 

2. fd 변수에 argv[1]의 값에 0x1234를 뺴준 결과 대입

 

3. read함수의 첫번째 인자에는 파일 디스크립터 값 , 두번째 인자에는 버퍼 , 세번째 인자에는 버퍼의 크기가 들어간다.

 

4. buf에 입력한 값과 "LETMEWIN"이라는 문자열 비교

 

5. 만약 문자열이 같을 경우 flag 뿌려줌, 아니면 이상한 문자열 출력

 

그렇다면 우리는 이제 fd 값을 0으로 변환을 해줘야 합니다.

 

위 표에서 볼 수 있듯이 file descriptor가 0이면 input이므로 fd 값을 0으로 만들어야 한다.

 

그러면 우리는 fd 파일을 실행시킬떄 인자값으로 4660을 주면 될 것이다.

그리고 추가 입력을 기다릴때 LETMEWIN을 입력해주면 풀릴 거 같다.

 

바로 해보자😉

 

우왕

FLAG = mommy! I think I know what a file descriptor is!!