티스토리 뷰

Write Up/pwnable.kr

pwnable.kr) fd write up

PORORIRI 2019. 1. 8. 16:08


방학을 맞이해서 다양한 분야의 CTF 문제를 풀면서 공부하고 있다.

그 중 하나인 시스템 CTF 문제들을 모아둔 pwnable.kr 에서 1번 문제를 풀이 해보도록 하겠다.


제일 첫번째 문제 fd는 저기 귀여운 그림만큼 쉬운 문제인데 fd 개념을 이해하는데 시간이 좀 걸렸던 문제이다.




문제를 클릭하면 위와 같이 접속 경로와 문제 설명이 나온다. 

적혀 있는 서버로 접속하여 문제를 풀면 된다.  접속 방법은 아래와 같다.



cmd에서 ssh fd@pwnable.kr -p2222 를 입력해 주고 주어진 패스워드 guest 를 입력해주면 위와 같이 pwnable.kr 에 접속 할 수 있다. 

접속해서 ls 명령어로 파일을 읽어보면 파일은 총 fd, fd.c, flag 이렇게 3개의 파일이 존재한다.



ls -l 로 권한을 살펴보면 flag 는 root 만 읽을 수 있게 설정 되어있다. 





fd.c 를 읽어보면 입력값이 2미만일때

                 pass argv[1] a number가 출력되고 프로그램종료

2 이상일 때

read() 함수를 이용해 파일을 읽고 buf와 문자열을 비교해 buf가 LETMEWIN\n 일 경우 good job과 함께 플래그값을 읽음


이 때 문제의 hint 를 보면 "Learn about LInux file IO"

그러면 Linux file IO 를 공부하러 가보자. 




-FD(File Descriptor, 파일 서술자)


일반적으로 POSIX 운영 체제에 쓰이는 것인데 특정한 파일에 접근하기 위한 추상적인 키.

리눅스에서 파일에 접근하기 위해서는 이 FD 파일 서술자 라는 것을 사용 함.

파일 서술자는 정수, 즉 C 형 int임.


=기본 POSIX 파일 서술자


정수값 

이름 

표준 입력 (stdin) 

1

표준 출력 (stdout)

2

표준 오류 (stderr) 

(https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%EC%84%9C%EC%88%A0%EC%9E%90)



위 문제에서 buf 와 입력값을 비교하기 위해서 파일 서술자를 이용해 파일에 입력을 하여야 한다.

여기서 사용 해야 할 것은 표준입력 파일 서술자 정수값인 "0"


fd.c 를 다시 한번 보면



int fd = atoi(argv[1]) - 0x1234; 라고 선언 되어 있고 이 fd 를 이용해

read(파일 디스크립터, 버퍼, 버퍼크기)를 지정해 주고 있다.

atoi()함수는 문자열을 숫자로 변환해 주는 함수이다.


따라서 읽어들인 fd 의 크기가 0이 된다면 파일 입력 모드로 설정 해 줄 수 있는 것!

fd의 크기를 0으로 만들기 위해서 0x1234 를 더해주면 되는 것이다.



그런데 이때 입력값은 헥사로 받지않고 있기 때문에 0x1234의 십진수 값인 4660을 입력하고 LETMEWIN을 입력하면



good job이 뜨고 flag 값이 나오게 된다. 




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함