[pwnable.kr] fd

File descriptor [fd]


Mommy! what is a file descriptor in Linux?

ssh [email protected] -p2222 (pw:guest)


SSH를 통해 접근하면 위와 같은 창이 나온다.

fd

ls -al명령을 입력하면,
fd, fd.c, flag파일이 보인다.

fd 파일 : 실행 시킬 수만 있다.
fd.c 파일 : 읽을 수 있다.
flag 파일 : 암것도 할 수 없다.

fd.c파일을 보면, (cmd: cat fd.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;

}

위 코드가 나오게 된다.

위 코드를 보면 
fd 변수에 인자로 받은 값을 atoi()[1]함수 에 넣어 0x1234를 빼고,
len에 read()[2] 함수에 fd와 buf를 넣어 그 결과를 len에 넣는다.

그 후 if문에서 buf의든 내용과 “LETMEWIN\n”문자열을 비교해 같으면 flag를 출력해 준다.

여기서 중요한건 인자로 받는 내용을 넣는 fd,
즉, fd = atoi(input) - 0x1234;에서 fd에 0(stdin)을 넣게 되면 read()함수는 사용자에 입력을 buf에 넣게 된다.

이를 위해 0x1234를 16진수 에서 10진수로 변환해 준다. > 4660

이를 fd 실행 파일에 인자로 넣어주면 ./fd 4660
사용자 입력을 기다리면서 커서가 깜빡인다.
이제 LETMEWIN을 입력하고 엔터를 치면,

flag가 나오게 된다.


[1]atoi() : 문자열을 정수로 반환

[2]read() : file descriptor(fd)를 받아 지정한 버퍼(buf)에 저장해,
                       지정한(32)데이터의 크기로 byte(:12) 단위로 읽어들임