War Game/Pwn(pwnable.kr)

[Pwnable.kr] Input 문제풀이

zyari 2019. 12. 1. 17:05
반응형

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