fd - 1 pt [writeup]
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)
1. 파일확인
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
총 3개의 파일이 있으며 fd 프로그램을 실행해서 flag를 얻는 방식이다.
2. 소스코드 확인 및 풀이
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;
}
LETMEWIN 문자열과 buf를 비교해서 /bin/cat flag를 출력하는 방식이다. 우선 파일디스크립터(fd)의 값을 표준입력인 키보드(0)으로 문자열을 buf에 받아야한다. 즉, fd 값을 0으로 만들어야 함으로 atoi(char*)는 문자열을 정수로 바꾸어주는 함수이다. 0x1234를 10진수로 변환하면 4660이다.
fd@ubuntu:~$ ./fd 4660
LETMEWIN
good job :)
mommy! I think I know what a file descriptor is!!
4660을 입력하면 read(0, buf,32)로 함수가 실행된다 표준입출력을 지정하였으며 키보드 입력값을 받기 시작한다. 이때 LETMEWIN을 입력하게되면 flag가 나타난다.
3. flag
mommy! I think I know what a file descriptor is!!