1. fd


1 Mommy! what is a file descriptor in Linux?

이 문장에서 문제가 리눅스의 파일디스크립터와 관련이 있을 것으로 유추할 수 있다.

일단 안내해준 주소 접속해본다.

2

주소로 접속하여 해당 디렉토리 내에 어떤 파일이 있는지 살펴본다.

flag라는 파일이 fd_pwn 계정 및 root 그룹에게만 read 권한이 있다.

3

접속한 계정은 fd 계정이므로 당연히 읽을 수 없다.

4

해당 디렉토리 내에 fd 파일에 setuid 플래그가 있는 것을 확인할 수 있다.

해당 바이너리를 이용하여 fd_pwn의 권한으로 flag를 읽을 수 있을 수 있다.

디렉토리 내의 fd.c 파일을 열어 fd가 어떤 일을 수행하는지 확인해본다.

5

해당 바이너리는 특수 조건을 만족하면 “/bin/cat flag” 명령어를 수행한다. 따라서 해당 조건을 만족하면 flag를 획득할 수 있다.

첫 번째 인자를 문자열 형식에서 정수형 형식으로 바꾼 후 0x1234를 뺀 값을 fd로 저장한다.

후에 fd로부터 buf에 32바이트를 읽은 것을 확인할 수 있으며 조건문은 fd로부터 읽은 값이 “LETMEWIN\n”과 일치할 경우 실행된다.

현재 터미널에서 바이너리에 실질적인 값을 전달할 수 있는 방법은 표준 입력으로 파일디스크립터 0번을 사용한다.

따라서 argv[1]에 0x1234를 전달하면 fd는 0이되고 표준 입력인 터미널로 바이너리에 입력 값을 전달할 수 있게된다.

0x1234를 전달하기 위해 먼저 십진수로 변환하면 다음과 같다.

6

10진수로 4660을 전달하면 플래그 획득 가능

7

from pwn import *
 
shell = ssh("fd","pwnable.kr",port=2222,password="guest")
 
sh=shell.run('./fd 4660')
sh.sendline('LETMEWIN')
 
print sh.recvall()
 
shell.close()

8




© 2020.02. by blupine