210_ 2019. 6. 14. 22:41

fd

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)

pwnable.kr 첫번째 문제인 fd 문제이다.

문제의 소스코드를 한번 살펴보자.

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

}

10번째 줄에서 atoi 함수에 의해 argv[1]에서 입력한 값을 정수로 바꿔서 0x1234를 뺀 다음, fd에 대입해보자.

int fd = atoi( argv[1] ) - 0x1234;

그리고 read(fd, buf, 32); 로 read함수가 호출되는데 이때 fd가 0이면 표준 입력 으로 적용되기 때문에 buf에 값을 입력할 수 있다.

len = read(fd, buf, 32); // 여기서 fd가 0이면 표준 입력.

 


Attack Vector

  1. argv[1]에 0x1234를 입력하여 fd값을 0으로 만듬.
  2. read함수가 실행되면 if문에 성립하게끔 "LETMEWIN"을 입력함.
  3. 플래그 개이득 잔치~
fd@ubuntu:~$ ./fd 4660
LETMEWIN
good job :)
mommy! I think I know what a file descriptor is!!

왜 argv[1]에 4660?
-> 0x1234 == 4660