pwnable.kr(toddler) - fd 풀이

secretpack·2023년 2월 8일
0

pwnable.kr

목록 보기
1/2
post-thumbnail

문제

Mommy! what is a file descriptor in Linux?

try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link:
https://youtu.be/971eZhMHQQw

ssh fd@pwnable.kr -p2222 (pw:guest)


개요

서버에 접속하여 ls 명령을 입력해보면 fd, fd.c, flag 3개의 파일이 존재하는 것을 알 수 있습니다.
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;
}

buf 배열과 비교하여 buf의 내용이 "LETMEWIN" 이라는 문자열이라면 system("/bin/cat flag") 명령이 실행되어 flag를 출력하게 됩니다. 우리가 주목해야 할 코드는 다음과 같습니다.

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

int 형 변수 fd에 커맨드라인으로 입력받은 값에서 16진수 0x1234를 뺀 값을 저장합니다.
그리고 read함수의 인자로 fd의 값을 넣습니다. read 함수의 원형은 다음과 같습니다.

ssize_t read(int fd, void *buf, size_t nbytes)

여기서 fd는 파일디스크립터, buf는 파일을 읽어 들일 버퍼, 버퍼의 크기를 의미합니다.
첫 번째 문제는 리눅스의 파일디스크립터를 이해하고 있는지에 대한 여부를 묻는 문제입니다.

  • 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값
  • 프로세스에서 열린 파일의 목록을 관리하는 테이블 인덱스

유닉스 시스템에서 모든 정규 파일, 디렉토리, 소켓 등 모든 객체들은 파일로 관리됩니다. 프로세스가 이 파일들을 접근할 때 파일 디스크립터 라는 개념을 이용합니다. 프로그램이 프로세스로 메모리에서 실행을 시작할 때, 기본적으로 할당되는 파일 디스크럽터는 다음과 같습니다.

  • 표준 입력(Standard Input) - stdin(0)
  • 표준 출력(Standard Output) - stdout(1)
  • 표준 에러(Standard Error) - stderr(2)

이들에게 각각 0, 1, 2라는 정수가 할당되며 관련 매크로는 <unistd.h>에서 찾을 수 있습니다.

파일디스크립터를 이용하여 read 함수가 입력을 받을 수 있다면 배열에 "LETMEWIN" 문자열을 넣을 수 있을 것입니다. 그렇다면 커맨드라인 인자로 0x1234 가 들어갔을 때 fd는 0이 되고 입력을 받을 수 있을 것입니다. 먼저 커맨드라인 인자로 0x1234의 10진수인 4660을 입력해봅니다.

fd@ubuntu:~$ ./fd.c 4660

아무것도 뜨지 않은 채 커서가 밑으로 내려간 것을 확인하실 수 있을 것입니다.
fd가 0이 되었으므로 read 함수를 통해 buf 에 값을 채울 수 있습니다.
플래그 출력 조건을 만족하기 위해 "LETMEWIN" 을 입력합니다.

fd@ubuntu:~$ ./fd.c 4660
LETMEWIN
good job:)
mommy! I think I know what a file descriptor is!!
fd@ubuntu:~$

정상적으로 플래그를 출력하는 것을 확인할 수 있습니다.

profile
Security Researcher / Security Consultant

0개의 댓글