Mommy! what is a file descriptor in Linux?


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


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




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


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




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




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


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


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



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


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


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


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


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


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




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













1
2
3
4
5
6
7
8
9
10
11
12
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()
 
 
cs


pwntools 사용




'CTF 공부 > Pwnable.kr' 카테고리의 다른 글

6. random  (0) 2018.09.16
5. passcode  (0) 2018.09.15
4. flag  (0) 2018.09.13
3. bof  (0) 2018.09.13
2. collision  (0) 2018.09.13

+ Recent posts