시작
지금부터 pwnable.kr
의 Toddler's Bottle
을 풀어보려고 합니다..!!
처음이라 모르는 것 투성이지만
포스팅을 통해 확실하게 이해를 하고자 합니다.
그럼 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
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개의 파일이 보입니다.
fd
는 SetUID
가 걸려있는 실행 파일이고fd.c
는 fd
의 소스,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
함수를 이용하여 값을 저장합니다.LETMEWIN
과buf
를 비교하여, 두 문자열이 일치하면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 |