Securing Keys

[Linux] pwnable.kr fd 풀이 본문

IT/Linux

[Linux] pwnable.kr fd 풀이

GRACE_MJ 2022. 4. 2. 20:06

현생에 집중하느라 여태껏 미뤄왔던 개인 공부를 시작하기 위해 제일 접근하기 쉬운 워게임부터 풀어보고자 한다

pwnable.kr 의 첫번째 단계: fd 를 풀어보도록 하겠다

첫번째 단계인 fd를 클릭하면 위와 같이 문제가 표시된다

 

File Descriptor

In Unix and Unix-like computer operating systems, a file descriptor (FD, less frequently fildes) is a unique identifier (handle) for a file or other input/output resource, such as a pipe or network socket.

File descriptors typically have non-negative integer values, with negative values being reserved to indicate "no value" or error conditions.

File descriptors are a part of the POSIX API. Each Unix process (except perhaps daemons) should have three standard POSIX file descriptors, corresponding to the three standard streams:

Integer valueName<unistd.h> symbolic constant[1]<stdio.h> file stream[2]

0 Standard input STDIN_FILENO stdin
1 Standard output STDOUT_FILENO stdout
2 Standard error STDERR_FILENO stderr

https://en.wikipedia.org/wiki/File_descriptor#/media/File:File_table_and_inode_table.svg

 

위키피디아를 통해 리눅스에서의 File Descriptor에 대해서 검색하면 위와 같은 내용을 확인할 수 있는데,

한국어로는 파일 서술자로 fd를 통칭하는 듯하다.

 

문제에서 알려준 쉘로 접속을 해보니, fd, fd.c, flag 파일이 존재하는 것을 확인할 수 있었다.

fd는 SetUID가 걸려있는 실행파일이었고, fd.c는 fd 실행파일의 코드였으며, flag를 우리가 궁극적으로 읽고자 하는 플래그값이 되겠다.

 

flag를 그냥 읽으려 하면 권한이 없어 읽지 못하기 때문에

fd 실행파일을 통해 root 권한을 잠시 빌려서 flag 파일을 읽어야 할 것으로 보인다.

 

fd.c 코드를 확인해보니, fd 실행파일을 실행시킬 때 한 개의 인자를 필요로 하고,

그 인자는 숫자로 0x1234와 동일한 값이어야지만이 read() 시 첫번째 인자로 0이 들어가서 standard input이 가능할 것으로 보인다.

그렇다면 0x1234가 정수로 어떤 값인지만 알면 flag를 알아낼 수 있을 것이다.

0x1234는 정수로 4660이기 때문에 fd를 실행 시 인자로 4660을 입력해주었다.

이때 4660만 입력해서는 안되고, 4660을 입력함으로써 read()가 standard input이 가능해진 상태이므로,

입력값과의 비교대상이 "LETMEWIN\n" 이기 때문에 fd 실행 후 이어서 LETMEWIN을 입력해주어야 한다.

 

위와 같이 fd 실행파일을 실행해주면, flag 값을 읽고 출력해주게 되고 해당 플래그를 pwnable.kr에 입력해주면 된다.

Comments