write-ups/pwnable.kr

pwnable.kr fd write up

2017. 7. 3. 21:01


#include <stdio.h> #include <stdlib.h> #include <string.h> char buf[32];                       // 전역변수 buf를 32byte 크기로 생성함 int main(int argc, char* argv[], char* envp[]){ // main 함수의 인자로 argv와 envp로 환경변수를 받음 if(argc<2){ // 만약 명령어만 입력했다면 오류를 뱉고 종료 printf("pass argv[1] a number\n"); return 0; } int fd = atoi( argv[1] ) - 0x1234;  // atoi() 함수로 char형으로 받은 argv를 int형으로 convert int len = 0; len = read(fd, buf, 32); // read() 함수로 읽은 값을 32byte 크기만큼 buf 에 저장 if(!strcmp("LETMEWIN\n", buf)){     // buf에 LETMEWIN\n 이라는 값이 있으면 flag를 보여줌 printf("good job :)\n"); system("/bin/cat flag"); exit(0); } printf("learn about Linux file IO\n"); return 0; }


fd 문제의 주어진 소스이다. 


문제 이름처럼 중요한 것은 fd 값이다. fd는 파일 디스크립터(file descriptor)라는 것인데, read 함수에서 필수적으로 필요한 인자값이다. 그리고 read() 함수 뿐만 아니라 유닉스 시스템에서 프로세스가 파일에 접근할 때 fd 값을 이용한다. 그리고 이 fd 값은 unsigned int 값이라고 한다. 


File Descriptor의 값은 각각

0            표준입력(Standard Input)

1            표준출력(Standard Output)

2            표준에러출력(Standard Error)




이해를 돕기 위해서 한 블로그의 글을 인용한다.

 

: 전화 한 통만 하면 필요한 논문을 복사해 주는 곳이 있다. 그리고 그곳의 단골손님 영수가 있다. 그런데 이 녀석은 매번 똑 같은 논문의 일부분을 복사해 달라고 한다. “아저씨~ ‘고도의 정보화 사회가 되어 가면서, 인간의 삶의 질과 관계된 문제들이 점점 더 그 중요성이 더해짐에 따라 감각, 지각, 사고, 성격, 지능, 적성 등의 인간적 특징들이 고려됐을 때의 인간의 원리에 대한 연구’ 라는 논문 26쪽부터 30쪽까지 복사해 주세요” 이 녀석은 보통 이런 식으로 하루에도 여러 번 주문을 한다. 설상가상으로 말하는 속도도 느린 편이다. 그래서 아저씨가 말씀하시길 “그 논문은 이제부터 너의 18번이다! 그냥 저의 18번 논문 26쪽부터 30쪽까지 복사해 주세요 라고 해라!”영수는 그 이후로도 최소 50자가 넘는 제목의 논문만 복사 주문을 한다. 그 때 마다 아저씨는 논문에 새로운 번호를 할당해 준다(중복되지 않는). 그래야 영수와의 대화 속에서 스트레스를 덜 받을 수 있기 때문이다.


다시 정리해서 File Descriptor 는 시스템 상의 파일을 가리키기 좋게 하기 위해서 시스템이 우리들에게 건네주는 숫자라고 할 수 있다. 




그래서 fd 실행파일의 인자값으로 4660 ~ 4662 을 입력하고 LETMEWIN 이라는 문자열을 입력하게 되면 우리는 flag를 얻을 수 있다.



플래그를 획득했다.



[*] fd 정의 인용 : http://dev-ahn.tistory.com/96

[*] fd 이해를 위한 글 인용 : http://mintnlatte.tistory.com/266

















'write-ups > pwnable.kr' 카테고리의 다른 글

pwnable.kr random write up  (0) 2017.07.04
pwnable.kr passcode write up  (0) 2017.07.04
pwnable.kr flag write up  (0) 2017.07.04
pwnable.kr bof write up  (1) 2017.07.04
pwnable.kr col write up  (0) 2017.07.04