ssh로 접속하면,
fd@pwnable:~$ ls
fd fd.c flag
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;
}
실행파일과 소스코드 그리고 플래그가 보인다.
소스코드를 보면 argv[1]으로 준값을 atoi로 정수로 변환하고 계산을 해 fd 변수에 저장한다.
그리고 fd변수를 read의 첫번째 인자로 준다 그리고 buf에 값을 쓴다.
read의 첫번째 인자는 fd로 파일 디스크립터라는 뜻이다.
리눅스에서 파일디스크립터는 0은 표준 입력(stdin), 1은 표준 출력(stdout), 2는 표준 에러이다.
그리고 buf와 'LETMEWIN\n' 문자열을 비교해서 flag를 출력해줍니다.
그렇다면 우리는 표준입력으로 fd를 맞춰주고 LETMEWIN이라는 값을 쓰면 플래그를 획득할 수 있을겁니다.
0x1234는 4660이니 실행인자로 4660을 입력해서 stdin으로 입력을 받게하고
LETMEWIN을 입력하면?
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!!