본문 바로가기

IT(개발, 보안)/pwnable

[Pwnable 풀이] 1. fd

문제

처음으로 접한 포너블 문제!

리눅스 시스템의 파일 디스크립터를 알고 있다면 풀 수 있는 간단한 문제이다.

 

Putty를 사용해 해당 시스템에 접속해보면 fd, fd.c, flag 3개의 파일이 디렉토리에 존재한다.

 

fd 파일은 실행파일로 fd.c를 컴파일한 것으로 보여지며, flag 파일은 정답이 적힌 파일이지만 권한 부족으로 직접 확인할 수 없다.

 

vi 에디터를 사용해 fd.c 파일을 열어보았다.

fd.c 파일

C언어로 작성된 소스코드로 int main()의 괄호 속 변수들은 실행 할때 함께 주어지는 파라미터들을 저장하는 변수들이다.

 argc는 주어진 파라미터의 갯수, argv는 그 주어진 파라미터들을 저장하고 envp는 프로그램을 작동하는데 사용되는 환경변수들을 저장한다.

 

가장 첫번째 if는 프로그램이 시작될때 파라미터가 주어지지 않은 경우를 예외 처리하기 위한 구문으로, argc는 기본으로 1의 값을 가지고 있어 2 미만의 argc 값이 주어졌을 때 프로그램을 종료시킨다.

 

'int fd =' 으로 시작하는 줄은 문제풀이의 핵심 구문으로 argv[1], 즉 첫번째 파라미터에 저장된 값을 atoi(), 문자열을 정수로 바꾸는 함수를 사용해서 0x1234를 빼준 값을 fd에다 저장한다.

 

그 다음 len = 으로 시작하는 코드에서 read 함수는 리눅스 함수의 파일디스크립터를 이용해 32길이를 가진 buf 배열에 파일디스크립터가 가진 값을 저장하는 기능을 수행한다.

 

리눅스의 파일디스크립터란 하나의 프로세스가 입출력을 위해서 파일을 열람 할때 할당되지 않은 가장 작은 정수의 숫자를 할당해 파일디스크립터로 파일에 접근할수 있게 도와주는 역할을 하는데 기본적으로 프로세스는 0,1,2의 파일디스크립터가 표준입력(Standard Input), 표준 출력(Standard Output), 표준에러(Standard Error)로 할당된다.

 

해당 fd.c 코드에서는 따로 추가적인 파일을 열람하지 않으므로 0,1,2 세가지의 파일 디스크립터가 존재하므로 fd값에 표준 입력, 0의 값을 준다면 입력을 통해 buf 배열에 원하는 문자열을 저장할 수 있을 것으로 보인다.

 

마지막 if 구문은 stfcmp 함수를 사용해 문자열 비교를 진행하고 flag를 출력하는 기능을 하므로 fd 변수에 0을 저장해서 buf에다가 LETMEWIN이라는 문자열을 저장할 수 있다면 flag를 열람할 수 있을 것으로 보인다.

 

0x1234는 16진수 숫자로 10진수로 변환하면 4660의 값을 가지고 있으므로 4660을 인자로 주고 문자열을 입력하면 성공적으로 flag를 얻을 수 있다.

 

내가 알기로는 0은 표준 입력, 1과 2는 표준 출력과 표준 에러이므로 4661과 4662를 입력하면 buf에다 문자열을 저장할 수 없을 줄 알았는데 문자열 입력이 가능했고 flag 또한 얻을 수 있었다. 왜 그런지는 모르겠다.

반응형

'IT(개발, 보안) > pwnable' 카테고리의 다른 글

[Pwnable 풀이] 6. flag  (0) 2022.11.19
[Pwnable 풀이] 5. cmd1  (0) 2022.11.15
[Pwnable 풀이] 4. shellshock  (0) 2022.11.10
[Pwnable 풀이] 3. coin1  (0) 2022.11.09
[Pwnable 풀이] 2. col  (0) 2022.11.09