[pwnable.kr] fd(1 pt) :: Write-Up

두비니

·

2019. 11. 8. 20:04

 

 

Mommy! what is a file descriptor in Linux?

- try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link:
https://youtu.be/971eZhMHQQw

ssh fd@pwnable.kr -p2222 (pw:guest)

 

 

fd@prowl:~$ ls
fd  fd.c  flag
fd@prowl:~$ cat flag
cat: flag: Permission denied

 

 

fd, fd.c, flag파일이 있네요.

보아하니 flag파일이 있는데 당연히도 권한이 없구요.

그래서 fd.c파일을 열어보았습니다.

fd@prowl:~$ nl fd.c
     1    #include <stdio.h>
     2    #include <stdlib.h>
     3    #include <string.h>
     4    char buf[32];
     5    int main(int argc, char* argv[], char* envp[]){
     6        if(argc<2){
     7            printf("pass argv[1] a number\n");
     8            return 0;
     9        }
    10        int fd = atoi( argv[1] ) - 0x1234;
    11        int len = 0;
    12        len = read(fd, buf, 32);
    13        if(!strcmp("LETMEWIN\n", buf)){
    14            printf("good job :)\n");
    15            system("/bin/cat flag");
    16            exit(0);
    17        }
    18        printf("learn about Linux file IO\n");
    19        return 0;

    20    }

 

 

보면 argv[1]의 값으로 fd를 정하고, read를 받네요.

그럼 여기서 read함수에 대해서 알아보도록 합시다.

 

#include <unistd.h>

 

ssize_t read (int fd, void *buf, size_t len)

 입력 인자

 int fd

open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호

 void* buf

 파일에서 읽은 데이터를 저장할 메모리 공간

 len

읽을 데이터의 크기(Byte 단위)

 반환

 ssize_t

파일 읽기 성공 : 0 보다 큰 수

읽을 데이터 없을 시 : 0 (EOF : End Of File 파일의 끝을 만났을 때)

 

다음은 read함수의 원형입니다. 보면 fd는 open() 시스템 콜로 열린 파일을 기리키는 지정 번호임을 알 수 있죠?

조금만 더 알아봅시다.

 

 

 

 

https://z-man.tistory.com/151

위의 글을 읽고 오면

 

0번은 표준 입력으로, 우리가 입력할 때 쓰는 키보드를 뜻하고,

1번은 표준 출력으로, 보통 모니터를 뜻합니다.

2번은 표준 에러로, 그냥 에러가 발생한다고 알려주는 것 같아요

 

 

 

그러면 다시 c코드로 돌아와서,

10번 줄에서 buf에 정상적으로 값을 입력해주고싶으면, fd가 0이 되어야겠죠?

 

fd를 첫번째 전달인자(argv[1])에서 0x1234를 뺀 값으로 하는 것으로 보아, fd는 0x1234의 dec값인 4660을 입력하면 되겠습니다.

그 뒤의 13번의 if문을 보면 LETMEWIN과 비교해서 if문안에 들어가네요. strcmp함수는 같을때 0을 반환하기 때문에 LETMEWIN을 입력해주면 되겠네요.

 

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