반응형
ssh로 접속해 input.c의 내용을 확인해본다. 엄청 길지만 대략적으로 보니 stage 5까지 클리어하면 플래그가 나오는 것 같다. 그러면 stage 1부터 차근차근 풀어보자.
stage 1
코드
인자의 개수가 100개여야하고, argv['A']가 \x00, argv['B']가 \x20\x0a\x0d이면 클리어이다.
stage 2
코드
std input으로 \x00\x0a\x00\xff를, std error로 /x00/x0a/x02/xff를 주면 된다.
stage 3
코드
\xde\xad\xbe\xef라는 환경변수에 \xca\xfe\xba\xbe 값을 넣어주면 된다.
stage 4
코드
\x0a라는 파일을 열어서 첫 4바이트가 \x00\x00\x00\x00이면 된다.
stage 5
코드
argv['C']를 정수로 바꾼 값을 포트번호로 하는 서버를 열고 \xde\xad\xbe\xef를 보내면
된다.
이를 바탕으로 파이썬 코드를 짠다.
from pwn import *
#stage 1
argv_arr=[str(i) for i in range(100)]
argv_arr[ord('A')]="\x00"
argv_arr[ord('B')]="\x20\x0a\x0d"
#stage 2
with open('./stderr', 'a') as f:
f.write('\x00\x0a\x02\xff')
#stage 3
envs = {'\xde\xad\xbe\xef':'\xca\xfe\xba\xbe'}
#stage 4
with open('./\x0a', 'a') as f:
f.write('\x00\x00\x00\x00')
#stage 5
argv_arr[ord('C')] = '22222'
#send parameters, open stderr file, environment variable setting
target = process(executable='/home/input2/input', argv=argv_arr, stderr=open('./stderr'), env=envs)
#stage2 - stdin
target.sendline('\x00\x0a\x00\xff')
conn = remote('localhost', 22222)
conn.send('\xde\xad\xbe\xef')
target.interactive()
코드를 현재 디렉토리에는 만들 수 없기 때문에 /tmp로 가서 디렉토리를 하나 더 만든 후 작성해준다.
그리고 실행하면 문제는 풀리는데 플래그가 보이지 않는다.
이유는 tmp디렉토리에 flag파일이 없기 때문이다. 그렇다고 flag파일을 복사할 수도 없기 때문에 심볼릭 링크를 걸어준다.
그리고 실행하면 성공!
반응형
'War Game > Pwn(pwnable.kr)' 카테고리의 다른 글
[Pwnable.kr] shellshock 문제풀이 (0) | 2019.12.05 |
---|---|
[Pwnable.kr] mistake 문제풀이 (0) | 2019.12.05 |
[Pwnable.kr] leg 문제풀이 (0) | 2019.12.02 |
[Pwnable.kr] Passcode 문제풀이 (0) | 2019.12.01 |