[ Pwnable.kr ] - fd(file descriptor)

DPOS·2021년 6월 19일
3

pwnable.kr

목록 보기
1/4
post-thumbnail

문제조건

  • 플래그 얻기
  • 파일 디스크립터

문제풀이

언제나 항상 그래왔듯 ls -alF로 파일목록을 확인합니다.
(flag는 현재 권한이 없어 접근이 불가합니다.)
접근 가능한 파일 중 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;          // 매개변수를 정수형으로 바꾸고 16진수로 1234 즉, 10진수로 4660만큼을 뺌
        int len = 0;
        len = read(fd, buf, 32);                    // 버퍼에 값 입력
        if(!strcmp("LETMEWIN\n", buf)){             // 값이 LETMEWIN일 경우 flag 출력
                printf("good job :)\n");
                system("/bin/cat flag");
                exit(0);
        }
        printf("learn about Linux file IO\n");      // 파일 디스크립트(fd)의 값이 0~2가 아니면 출력
        return 0;

}

  코드를 확인하면 파일디스크립터로 입력받은 값에서 4660만큼 뺀 수를 저장한다는 것을 알 수 있습니다. 그리고 파일디스크립터의 값이 유효한 값이면 솔직히 상관 없지만, 그래도 용도에 맞춰주기 위해 파일 디스크립터가 0이 되도록 매개변수로 4660을 넘겨줍니다.

  매개변수로 4660을 넘겨주면 learn about Linux file IO\n이 출력되지 않고 입력상태가 됩니다. 이때 LETMEWIN을 입력하면 플래그 값이 정상적으로 출력되고 프로그램이 끝납니다.

결과사진

profile
본인 전공빼고 다 하는 사람

0개의 댓글