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 |