Security/System

[pwnable.kr] Toddler's Bottle - fd 문제

bonggang 2019. 9. 9. 14:48

문제

 

https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr

 

 

문제 풀이

 

접속

- 리눅스에서 파일 디스크립터가 무엇인지 묻는 질문이기에 먼저 ssh로 원격 접속

ssh fd@pwnable.kr -p 2222

// ssh 접속 방법: ssh [접속계정] -p [포트번호]

 

 

코드 확인 및 해석

 

- ls 명령어를 사용해서 파일 목록을 확인

- cat 명령어를 사용해서 코드 확인

 

#include <stdio.h>
#include <stdlib.h>
#incldue <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; //argv[1]을 숫자로 변경 후 - 0x1234
    int len =0;
    len = read(fd, buf, 32);
    if(!strcmp("LETMEWIN\n", buf)){ //buf 값과 LETMEWIN\n을 비교
    	printf("good job : )\n");
        system("/bin/cat flag");
        exit(0);
    }
    printf("learn about Linux file IO\n");
    return 0;
}

 

-> if(argc<2) : 파라미터 값을 줘야한다.

-> 0x1234의 10진수 값은 4660

-> read(int fd, void *buf, size_t nbytes): 파일 디스크립터, 버퍼, 버퍼 크기 파라미터 필요

-> read의 파일 디스크립터, 이 문제에서는 표준 입력을 이용해 LETMEWIN\n을 넣어주어야하기 때문에 파일 디스크립터가 0이 되어야 함. => argv[1] = 0x1234

 

파일 디스크립터 이름 정의
0 stdin 명령어 표준 입력
1 stdout 명령어 표준 출력
2 stderr 명령어 표준 오류

 

실행 화면