-
[pwnable.kr][Toddler's Bottle] 1. fdWargame/pwnable.kr 2019. 7. 15. 19:49
pwnable.kr의 첫 번째 문제는 fd(File Descriptor)에 대한 문제이다.
먼저 파일 디스크립터에 대해 잘 모른다면 아래 설명을 참조하자.
...더보기파일 디스크립터(File Descripter)란?
리눅스에서 파일을 읽고 쓰기 위해서는 반드시 파일을 open해야 한다. 만약 프로세스가 실행중에 이미 존재하는 파일을 open하거나 새로운 파일을 생성해달라고 커널에 요청하면, 커널은 해당 파일에 대해 '파일 디스크립터'라는 0 이상의 정수값을 반환한다. 리턴된 파일 디스크립터 값은 후에 프로세스가 read(), write()와 같은 시스템콜 함수를 이용하여 특정 파일에 접근할 때 인자로 사용된다.
즉, 파일 디스크립터란 프로세스에서 특정 파일에 접근할 때 사용하는 일종의 인덱스 값이다.
프로세스가 처음 실행될 때, 기본적으로 할당되는 파일 디스크립터가 존재한다.
- 0번: 표준 입력 (stdin)
- 1번: 표준 출력 (stdout)
- 2번: 표준 오류 (stderr)
따라서 프로세스가 실행된 후 처음으로 파일을 생성하면 3번부터 파일 디스크립터가 부여된다.
Xshell을 이용하여 pwnable.kr에 SSH로 접속한다. (포트번호: 2222)
아래와 같이 세션을 생성하여 해당 세션으로 연결한 다음, 사용자 이름 fd, 비밀번호 guest를 입력하면 된다.
연결에 성공하면 아래와 같은 화면이 나온다.
먼저 안에 무슨 파일이 있는지 확인해보자.
fd, fd.c, flag 3개의 파일이 있다. flag는 권한때문에 읽을 수가 없어서 fd.c를 읽어보았다.
read 함수에 인자로 fd(파일 디스크립터)가 존재한다. 만약 fd가 0이면 해당 프로세스에 대해 표준 입력을 수행할 것이고, 1이면 표준 출력을 수행할 것이다. 따라서 fd를 0으로 만들어주면, read 함수에 의해 프로세스가 표준 입력을 받을 수 있게 되므로, 그때 LETMEWIN이라는 문자열을 입력값으로 주면 buf에 저장될 것이다.
그 다음 if문에서는 strcmp 함수로 buf에 저장된 문자열과 LETMEWIN을 비교하여, 두 문자열이 같으면 flag를 출력한다. (strcmp 함수는 두 문자열이 같으면 0을 반환한다.)
따라서 먼저 fd의 값을 0으로 만들어주기 위해 ./fd 프로세스의 인자로 0x1234의 10진수 값인 4660을 넣어준다.
위와 같이 실행하면 ./fd 프로세스의 fd 값은 0이 되어 사용자의 입력을 기다리게 된다. 이때 입력값으로 LETMEWIN을 넣어주면 flag가 나타난다.
참고자료
'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr][Toddler's Bottle] 6. random (0) 2019.07.26 [pwnable.kr][Toddler's Bottle] 5. passcode (0) 2019.07.19 [pwnable.kr][Toddler's Bottle] 4. flag (0) 2019.07.18 [pwnable.kr][Toddler's Bottle] 3. bof (0) 2019.07.17 [pwnable.kr][Toddler's Bottle] 2. collision (0) 2019.07.16