본문 바로가기

CTF_Write_UP/pwnable.kr

pwnable.kr : fd 풀이

시작

지금부터 pwnable.krToddler's Bottle을 풀어보려고 합니다..!!

처음이라 모르는 것 투성이지만

포스팅을 통해 확실하게 이해를 하고자 합니다.

그럼 fd부터 시작하겠습니다!

Mommy! what is a file descriptor in Linux?

 

root@goorm:/# ssh fd@pwnable.kr -p2222

Write UP

fd@ubuntu:~$ ls -l
total 16
-r-sr-x--- 1 fd_pwn fd   7322 Jun 11  2014 fd
-rw-r--r-- 1 root   root  418 Jun 11  2014 fd.c
-r--r----- 1 fd_pwn root   50 Jun 11  2014 flag

ls로 확인해 보니 3개의 파일이 보입니다.

fdSetUID가 걸려있는 실행 파일이고
fd.cfd의 소스,
flag는 우리가 열어봐야 할 정답인 것 같네요.

fd를 먼저 실행시켜 볼까요?

fd@ubuntu:~$ ./fd
pass argv[1] a number

숫자 하나를 인자로 넣어달라고 하네요.

10을 넣고 다시 한 번 돌려보겠습니다.

fd@ubuntu:~$ ./fd 10
learn about Linux file IO

learn about Linux file IO 메시지가 출력된 후 프로그램이 종료됩니다.

자, 그렇다면 cat으로 fd.c의 소스를 보겠습니다.

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

위에서부터 차근차근 내려가보죠 !

  • char[] 타입의 buf 변수를 32 bytes 만큼 할당해주었습니다.
  • argc 변수가 2보다 작으면 인자값으로 숫자를 하나 넣어달라고 요청하는군요.
  • fd 변수에 argv[1] (=첫 번째 인자값)에서 0x1234를 뺀 값을 저장하네요.
  • len 변수에 read 함수를 이용하여 값을 저장합니다.
  • LETMEWINbuf를 비교하여, 두 문자열이 일치하면 flag를 출력해줍니다.
  • 아닐 경우엔 learn about Linux file IO를 출력한 후 프로그램이 종료됩니다.

 

 

리눅스는 File Descriptor라는 개념이 존재합니다.

File Descriptor : 시스템으로부터 할당 받은 파일을 대표하는 값, 파일에 접근할 때 사용하는 추상적인 값

0 : stdin, 표준입력
1 : stdout, 표준출력
2 : stderr, 표준에러

그 중 0, 1, 2는 위와 같이 특수한 목적으로 정해져 있습니다.

 

 

자, 그렇다면 fd를 어떻게 설정해야 할까요?

미리 정해져 있는 0, 1, 2 중 하나로 설정하면 read 함수가 올바르게 작동할 수 있다고 생각했습니다.

0x1234를 10진수로 변환하면 4660이네요.

따라서 4660, 4661, 4662 중 하나로 인자를 넣어주면 되겠군요.

또, 바로 밑의 strcmp 함수를 충족시키기 위해서

LETMEWIN 문자열을 buf 함수에 저장해주면 /bin/cat flag가 실행될 것 같습니다!

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

마무리

File Descriptor는 들어도 들어도 애매하네요..ㅠㅠ

read 함수를 작동시키기 위해 fd에 이미 할당된 0, 1, 2를 넣어주는게 신기합니다 ㅎㅎ..

긴 글 읽어주셔서 감사합니다! :D

'CTF_Write_UP > pwnable.kr' 카테고리의 다른 글

pwnable.kr : mistake 풀이  (0) 2019.04.16
pwnable.kr : passcode 풀이  (0) 2019.04.14
pwnable.kr : random 풀이  (0) 2019.04.13
pwnable.kr : bof 풀이  (0) 2019.04.13
pwnable.kr : col 풀이  (0) 2019.04.12