Pwnable/Pwnable.kr

[Pwnable.kr] fd 문제 풀이![재업로드]

RootJJang 2022. 6. 19. 10:48
SMALL

할 게 없어서 pwnable.kr 문제들을 다시 재업로드하려고 합니당

 

엄무니 리눅스에서 파일 디스크립터란 게 뭐예여? 라고 하네요

 

함 putty로 접속해 풀어볼게용

 

접속 설정은 요래 해주시면 됩니당

 

비밀번호에 guest까지 쳐서 로그인하면 접속 성공!

 

이제 소스코드를 확인해보죠

 

#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;

}

중요한 것만 보자면 인자를 atoi(ascii to int)를 통해 정수값으로 바꾼 값을 fd에 저장하고

 

그 후에 buf를 32바이트 만큼 fd의 형태로 읽어주는데 이때 File Descriptor라는 개념이 사용됩니다!

 

File Descriptor 개념은 다음 블로그에서 공부하고 오시기 바랍니당

 

https://twofootdog.tistory.com/51

 

파일 디스크립터(File Descriptor) 란 무엇인가?

1. 개념 파일 디스크립터(File Descriptor)란 리눅스 혹은 유닉스 계열의 시스템에서 프로세스(process)가 파일(file)을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상

twofootdog.tistory.com

 

그렇다면 0, 1, 2 중에 적절하게 표준 입력을 사용하기 위해 fd에 값을 0으로 바꿔주면 되네요!

 

어떻게 바꾸냐 하면 아까 fd 변수에 인자값을 0x1234로 빼주는데 이때 0x1234는 atoi 함수로 인해 4660이 되므로 저희가 인자값에 4660을 넣어주면 0이 되어 read() 함수에 있는 fd에 0이 들어가면서 입력을 받을 수 있게 됩니다!

 

함 해보죠

 

이제 입력 받는 곳에 조건문에 맞게 LETMEWIN을 입력해줍시당

 

엄뫄! 나 파일 디스크립터가 뭔지 알 것 같애!!!

 

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

LIST