본문 바로가기
시스템 해킹/pwnable.kr

[Pwnable.kr] fd

by L3m0n S0ju 2021. 3. 24.

 


 

문제: 엄마! 리눅스에 파일 디스크립터가 뭐야??

 


 

 

문제에서 주어진 서버로 접속하면 fd, fd.c flag 3가지 파일이 있다. fd.c를 열람하면 아래와 같다.

 

 

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;

 

위 코드에서 주의깊게 봐야할 코드는 두 부분이다.


 

        int fd = atoi( argv[1] ) - 0x1234; 
        int len = 0; 
        len = read(fd, buf, 32);

 

 

read(fd, buf, 32)에서 fd는 0이 되어야한다. fd는 파일 디스크립터로 표준 파일 디스크립터 0, 1, 2는 각각 입력, 출력, 오류를 의미한다. 그리고 나머지 숫자들은 파일을 가르키는 디스크립터로 작동한다. read 함수는 사용자에게 입력 받기 위해 사용하는 함수이다. 따라서 fd는 0이 되어야 하므로 atoi(argv[1]) 는 0x1234와 같아야 한다. 0x1234는 10진수로 4660이다. 따라서 첫 번째 인자로 4660을 주면 위 코드 문제는 해결된다.

 


     

 

        if(!strcmp("LETMEWIN\n", buf)){ 
                printf("good job :)\n"); 
                system("/bin/cat flag"); 
                exit(0); 
        } 

 

플래그를 읽기 위해서 buf는 LETMEWIN\n이어야 한다. 따라서 프로그램을 실행하고 LETMEWIN\n을 입력하면 플래그가 출력된다.

 


플래그

 

'시스템 해킹 > pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] cmd1  (0) 2021.04.21
[Pwnable.kr] mistake  (0) 2021.04.21
[Pwnable.kr] flag  (0) 2021.04.19
[Pwnable.kr] collision  (0) 2021.04.19
[Pwnable.kr] bof  (0) 2021.03.24

댓글