pwnable 1번 문제를 풀어보자.

먼저 디렉토리에 있는 파일목록, 권한을 본다.

fd@ubuntu:~$ ls -l

total 16

-r-sr-x--- 1 fd_pwn fd   7322 Jun 11  2014 fd

-rw-r--r-- 1 root   root  418 Jun 11  2014 fd.c

-r--r----- 1 fd_pwn root   50 Jun 11  2014 flag

fd.c를 읽어보면

fd@ubuntu:~$ 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;


}

Linux file IO에 대해 공부하라는 문구와 문자열 정수를 정수로 바꾸는 atoi(argv[1]) 함수와

file descriptor를 이용해 파일을 읽는 read(fd, buf, 32); 함수가 있었다.


read(fd, buf, 32); 의 파라미터 fd는 open한 파일의 descriptor를 나타내며 buf는 읽을 데이터를 저장할 메모리 영역이다

그리고 32는 count값으로 읽을 size이다.

파일 디스크립터 값이 미리 정해져있는 0 : 표준 입력(stdin) 1 : 표준 출력(stdout) 2 : 표준 오류(stderr)는 있는데,

다음 3가지는 서로다른 프로세스라도 다 같은 값이다. 그렇기 때문에 파일을 열어도 파일 디스크립터는 3번부터 시작한다.

0x1234를 10진수로 바꾸면 4660이고 argv[1]에 4660을 넣어준다.

그 다음에 LEMEWIN을 입력해주면 플래그값이 뜬다.


fd@ubuntu:~$ ./fd 4660

LETMEWIN

good job :)

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


'System Hacking > pwable.kr' 카테고리의 다른 글

06.Pwnable random  (0) 2018.02.15
05.Pwnable passcode  (0) 2018.02.15
04.Pwnable flag  (0) 2018.02.13
03.Pwnable bof  (0) 2018.02.13
02.Pwnable col  (0) 2017.11.23

+ Recent posts