Github avatar

GyeongSu Han's Github Pages

Pwnable.kr fd

Mar 16, 2016 · Wargame

ssh fd@pwnable.kr 2222
fd@ubuntu:~$ ls
fd  fd.c  flag

접속을 하게 되면 이와 같은 파일이 존재하게 됩니다.

fd@ubuntu:~$ 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;
}

이 문제를 보게 되면 14번째 줄에서 buf와 “LETMEWIN” 이라는 문자열을 비교하여 문제를 해결할 수 있습니다.

buf에 입력을 하는 경우는 13번째 줄의 read를 통하여 입력을 하게 되는데, read의 인자로는 file descriptor, 저장될 배열의 주소, 읽을 사이즈를 인자로 받습니다.

저장될 주소는 buf에 저장이 되고, 읽는 데이터는 fd에서 읽습니다. fd의 값을 사용자가 수정할 수 있는데, 리눅스 상에서의 표준 fd는 다음과 같습니다.

0: stdin
1: stdout
2: stderr

stdin은 보통 키보드를 의미하며, stdout의 경우 출력창 이므로 콘솔, stderr또한 콘솔에 출력되는 내용을 말합니다. 우리가 입력을 받아야 하는데, 필요한 값은 fd가 0이 되도록 하는것 입니다.

fd의 경우 atoi를 통하여 ascii를 int로 변경하여 되는 값에 0x1234를 뺀 값이 됩니다.

fd = 0x1234 - 0x1234일 경우 0이 되므로 0x1234의 값인 4660을 넣어주어 문제를 해결하면 됩니다.

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