White Security
Fd 문제풀이 본문
엄마! 리눅스 파일 디스크립터가 뭐야?
pwnable.kr Toddler 1번 응애응애 문제입니다.
파일 디스크립터에 대한 기본적인 이해를 요하는 문제로서
리눅스와 c언어에 대한 기본적인 이해만 있다면 풀 수 있습니다.
putty나 openssl 등의 ssh 콘솔을 사용하여
접근을 시도하면 홈 폴더에 파일이 3개 존재하는 것을 확인할 수 있습니다.
fd 라는 이름의 실행가능한 파일에
user sticky bit가 붙은 것을 확인할 수 있군요.
덕분에 fd 프로그램을 실행하면
일시적으로 fd_pwn 의 권한을 가지게 되므로
flag 파일의 내용을 확인할 수 있게 됩니다.
fd 프로그램의 소스 파일인 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( argv[1] ) - 0x1234 를 대입하고 있군요.
0x1234를 10진수로 바꾸면 4660이 되니
atoi( argv[1] ) - 4660 이라고도 할 수 있습니다.
그런데 여기서 fd는 무엇일까요?
fd는 바로 File Descripter 의 약자입니다.
유닉스에서 공통적으로 사용하는 표준 스트림으로
표준 입력 (Standard input, STDIN, 0)
표준 출력 (Standard Output, STDOUT, 1)
오류 출력 (Standard Error, STDERR, 2)
세가지가 있는데요.
콘솔 실행시에 자동으로 프로그램에
할당되며 기동됩니다.
fd 프로그램도 예외가 아니지요.
len = read(fd, buf, 32);
위 처럼 read 함수에 두번째 인자로
0을 넣어주면 표준 입력에서 32 바이트를 읽어오겠다는 뜻이 됩니다.
따라서 argv[1] 으로 4660으로 주고
이후 표준 입력에 LETMEWIN을 입력하여 주면
플래그를 얻을 수 있습니다.
'Wargame Writeups > pwnable.kr' 카테고리의 다른 글
Random 문제풀이 (0) | 2019.02.06 |
---|---|
Passcode 문제풀이 (0) | 2019.02.06 |
Flag 문제풀이 (0) | 2019.02.05 |
Bof 문제풀이 (0) | 2019.02.05 |
Collision 문제풀이 (1) | 2019.02.04 |