File descriptor [fd]
Mommy! what is a file descriptor in Linux?
ssh [email protected] -p2222 (pw:guest)
SSH를 통해 접근하면 위와 같은 창이 나온다.
ls -al
명령을 입력하면,
fd, fd.c, flag
파일이 보인다.
fd 파일 : 실행 시킬 수만 있다.
fd.c 파일 : 읽을 수 있다.
flag 파일 : 암것도 할 수 없다.
fd.c파일을 보면, (cmd: 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 변수에 인자로 받은 값을 atoi()[1]함수 에 넣어 0x1234를 빼고,
len에 read()[2] 함수에 fd와 buf를 넣어 그 결과를 len에 넣는다.
그 후 if문에서 buf의든 내용과 “LETMEWIN\n”문자열을 비교해 같으면 flag를 출력해 준다.
여기서 중요한건 인자로 받는 내용을 넣는 fd,
즉, fd = atoi(input) - 0x1234;
에서 fd에 0(stdin)을 넣게 되면 read()함수는 사용자에 입력을 buf에 넣게 된다.
이를 위해 0x1234를 16진수 에서 10진수로 변환해 준다. > 4660
이를 fd 실행 파일에 인자로 넣어주면 ./fd 4660
사용자 입력을 기다리면서 커서가 깜빡인다.
이제 LETMEWIN
을 입력하고 엔터를 치면,
flag가 나오게 된다.
[2]read() : file descriptor(fd)를 받아 지정한 버퍼(buf)에 저장해,
지정한(32)데이터의 크기로 byte(:12) 단위로 읽어들임