WAR GAME/pwnable.kr

[pwnable.kr] fd 문제풀이

jir4vvit 2020. 3. 3. 00:45

사용 툴: cygwin

 

1) 문제

fd 문제

엄마! 리눅스에서 file descriptor가 뭐야?

 

 

2) 문제풀이

문제에 적혀있는대로 ssh fd@pwnable.kr 에 2222번 포트로 접속해준다.

비밀번호는 guest다.

SHJ@DESKTOP-CK691IG ~
$ ssh fd@pwnable.kr -p2222
fd@pwnable.kr's password:
Permission denied, please try again.
fd@pwnable.kr's password:
 ____  __    __  ____    ____  ____   _        ___      __  _  ____
|    \|  |__|  ||    \  /    ||    \ | |      /  _]    |  |/ ]|    \
|  o  )  |  |  ||  _  ||  o  ||  o  )| |     /  [_     |  ' / |  D  )
|   _/|  |  |  ||  |  ||     ||     || |___ |    _]    |    \ |    /
|  |  |  `  '  ||  |  ||  _  ||  O  ||     ||   [_  __ |     \|    \
|  |   \      / |  |  ||  |  ||     ||     ||     ||  ||  .  ||  .  \
|__|    \_/\_/  |__|__||__|__||_____||_____||_____||__||__|\_||__|\_|

- Site admin : daehee87@gatech.edu
- IRC : irc.netgarage.org:6667 / #pwnable.kr
- Simply type "irssi" command to join IRC now
- files under /tmp can be erased anytime. make your directory under /tmp
- to use peda, issue `source /usr/share/peda/peda.py` in gdb terminal
You have mail.
Last login: Mon Mar  2 10:15:22 2020 from 82.80.166.79
fd@pwnable:~$

  첫 문제니까... 가져와봤다...

간zi 난다 ㅎ

 

fd@pwnable:~$ ls -al
total 40
drwxr-x---   5 root   fd   4096 Oct 26  2016 .
drwxr-xr-x 116 root   root 4096 Nov 12 21:34 ..
d---------   2 root   root 4096 Jun 12  2014 .bash_history
-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
-rw-------   1 root   root  128 Oct 26  2016 .gdb_history
dr-xr-xr-x   2 root   root 4096 Dec 19  2016 .irssi
drwxr-xr-x   2 root   root 4096 Oct 23  2016 .pwntools-cache
fd@pwnable:~$ cat flag
cat: flag: Permission denied
fd@pwnable:~$

flag가 대놓고 보이길래 열어봤는데 권한이 없다고 한다.

 

열어볼 건 fd와 fd.c

fd에는 setuid가 걸려있고 fd.c가 fd의 소스코드인 것 같아서 fd.c를 먼저 열어보았다.

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

}

fd@pwnable:~$

마지막 if문을 살펴보면 strcmp 함수가 있다.

strcmp는 문자열을 비교하는 함수인데 같으면 0을 반환한다.

 

한마디로 buf가 LETMEWIN이면 flag를 뱉어내는 것 같다.

 

그 다음 read함수를 살펴보겠다.

* read함수 첫번째 인자값

0 : 표준 입력

1 : 표준 출력

2 : 표준 에러

 

- 여기서 첫 번째 인자가 의미하는 것이 file descriptor라고 한다.

- 문제에서 buf는 파일에서 읽은 데이터를 저장할 메모리 공간이고, 32는 읽을 데이터의 크기이다.

 

결론은 우리는 fd가 0으로 해서 LETMEWIN을 buf에 저장해야한다.

 

fd가 0이 되려면 argv[1]값으로 0x1234를 넣어줘야한다.

여기서 atoi가 문자열을 정수로 바꿔주는 역할을 하기 때문에 0x1234를 10진수로 나타낸 4660을 입력하겠다.

 

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

 

FLAG : mommy! I think I know what a file descriptor is!!

 

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

[pwnable.kr] collision 문제풀이  (0) 2020.03.05