해설

다양한 형태의 입력 값을 처리할 수 있는지에 대한 문제이다. 코드를 보면 커맨드라인 입력, 표준 입력, 표준 에러, 환경 변수, 파일 입출력, 네트워크 입출력에 대한 다양한 형태의 입력 값을 받아서 검사하고 있다. 아래와 같이 코드를 작성하면 문제를 해결 할 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from pwn import *
 
''' for stage 2 stderr'''
= open("./stdrr""wb")
f.write(b"\x00\x0a\x02\xff")
f.close()
= open("./stdrr""rb")
 
''' for stage 4 '''
f2 = open("./\x0a""wb")
f2.write(b"\x00\x00\x00\x00")
f2.close()
 
args = []
''' for stage 3 '''
env = {
    b"\xde\xad\xbe\xef": b"\xca\xfe\xba\xbe"
}
 
for i in range(100):
    if i == 0:
        args.append("/home/input2/input")
    ''' for stage 1 '''
    elif i == 65:
        args.append("\x00")
    elif i == 66:
        args.append("\x20\x0a\x0d")
    ''' for stage 5(port number) '''
    elif i == 67:
        args.append("22222")
    else:
        args.append("a")
 
= process(args, stderr=f, env=env)
pause()
 
print(p.recvuntil(b":)\n"))
print(p.recvline())
 
''' for stage 2 stdin '''
p.sendline(b"\x00\x0a\x00\xff")
 
 
f.close()
 
print(p.recvline())
print(p.recvline())
print(p.recvline())
 
''' for stage 5 '''
= remote("127.0.0.1"22222)
c.sendline(b"\xde\xad\xbe\xef")
print(p.recvline())
''' print flag '''
print(p.recvline())
 

낙서

참고로 위의 스크립트를 /tmp 경로에서 실행하게 될텐데, 문제 코드에서는 system("/bin/cat flag")를 통해 flag 값이 출력 된다. 이 때, flag가 상대 경로로 지정되어 있으므로, 해당 스크립트를 실행하는 경로에 flag의 심볼릭 링크를 만들어 주면 된다.

'pwn' 카테고리의 다른 글

pwnable.kr - mistake  (0) 2020.07.15
pwnable.kr - leg  (0) 2020.03.04
pwnable.kr - passcode  (0) 2019.08.22
pwnable.kr - random  (0) 2019.08.16
pwnable.kr - flag  (0) 2019.08.13

+ Recent posts