본문 바로가기

IT(개발, 보안)/pwnable

[Pwnable 풀이] 10. input

10번째로 푸는 문제이다.

먼저 접속해서 파일들을 살펴본다.

 

input.c와 실행파일, flag가 존재한다.

 

 

 

상당히 긴 코드인데 부분 나눠서 살펴보자

 

먼저 프로그램 시작시 출력하는 인삿말 다음으로 프로그램의 입력 인자를 확인한다. argc는 입력받은 인자의 갯수로 총 100개의 인자를 가지고 있는지 확인하고, 그중 'A' 번째와 'B' 번째 인자의 값을 비교하는 구문이다.

그 다음으로 buf라는 문자열에 fd 0(표준입력, stdin)과 2(표준에러, stderr)의 값을 저장해 비교해보고 환경변수 중 하나의 값을 체크한다.

 

파일 하나를 오픈하여 읽어보고, 소켓을 열어 네트워크로 특정 값을 수신하는지 확인하는 구문을 거친 뒤 flag를 출력해준다.

 

전체적으로 프로그램이 입력으로 사용하는 5가지를 테스트하는 프로그램이다. 주어져야하는 인자들의 값이 많으므로 파이썬으 pwn 모듈을 사용해서 해결해보았다.

 

from pwn import *

# argv
argvs = [' ' for _ in range(100)]
argvs[ord('A')] = '\x00'
argvs[ord('B')] = '\x20\x0a\x0d'

# stderr
with open('./stderr', 'w') as f:
    f.write('\x00\x0a\x02\xff')

# env
env_val = {'\xde\xad\xbe\xef':'\xca\xfe\xba\xbe'}

# file
with open('./\x0a', 'w') as f:
    f.write('\x00\x00\x00\x00')

# network
argvs[ord('C')] = '40000'

t = process(executable = '/home/input2/input', argv=argvs, stderr=open('./stderr'), env=env_val)

t.sendline('\x00\x0a\x00\xff')

n = remote('localhost','40000')
n.send('\xde\xad\xbe\xef')
t.interactive()

프로그램은 ssh로 접속한 서버의 권한 문제로 /tmp에 디렉토리를 만들고 그 곳에서 작성하였다.

 

flag가 해당 디렉토리에 존재하지 않기 때문에 심볼릭 링크를 사용해 디렉토리에 만들어주었다.

 

 

반응형

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

[Pwnable 풀이] 12. mistake  (0) 2022.12.06
[Pwnable 풀이] 11. leg  (4) 2022.12.02
[Pwnable 풀이] 9. random  (2) 2022.11.29
[Pwnable 풀이] 8. passcode  (0) 2022.11.28
[Pwnable 풀이] 7. bof  (0) 2022.11.20