CTF/MISC

[boot2root] Vulnerable Adventure - MISC / Python

SecurityMan 2023. 2. 8. 11:00

 

이번 문제는 뭐라 분류해야 할지 몰라서 MISC 로 넣었다.

 

MISC는 miscellaneous의 약자로 여러가지 잡다한 이라는 의미를 가지고 있다.

 

반응형

 

문제 설명을 읽어보면 client 를 실행시켜 플래그를 얻으라고 한다.

 

문제에서 주어지는 파일은 client.py 파일이다.

 

import struct
import socket
import random

s = socket.socket()
port  = 1013
s.connect(('35.238.225.156',port))


coins = 100
health = 100
mana = 100
posx = 0
posy = 0
goblin = 0
terminated = 0
dummyflag = 0
vuln = random.randint(1,500)
print(vuln)
while(1 == 1):
	print "Welcome to game"
	print "What would you like to do?"
	print "1. Speak to goblin in front of you(2 energy) \n 2. Move Forward 1 step(1 energy) \n 3. Move Backward 1 step(1 energy) \n 4. Move Left 1 step(1 energy) \n 5. Move Right 1 step(1 energy) \n 6. Exit "

	choice = input("Enter your choice : ")
	if choice == vuln:
		dummyflag = 1
	
	
	if choice == 1 :
		goblin = 1
	elif choice == 2 :
		posy = 1
	elif choice == 3 :
		posy = -1
	elif choice == 4 :
		posx = -1
	elif choice == 5 :
		posx = 1
	elif choice == 6 :
		terminated = 1

	packet = struct.pack("iiiiiiii",posx,posy,coins,health,mana,goblin,terminated,dummyflag)
	print(struct.unpack("iiiiiiii",packet))
	s.send(packet)
	print(s.recv(500*1024))
	if(terminated == 1):
		break;
	goblin = 0
	dummyflag = 0
	posx = 0
	posy = 0

 

이게 주어지는 파일의 내용이다.

 

35.238.225.156:1013 서버 주소로 소켓 연결을 한 뒤에

 

게임을 플레이하는 기능을 하고 있다.

 

 

바로 한번 실행시켜 봤다.

 

사용자는 6가지의 선택지를 가진다.

 

고블린에게 말을 걸거나,

 

동 서 남 북 으로 1 step 씩 움직이거나,

 

게임을 종료하는 선택지이다.

 

가장 먼저 1번을 선택해 봤더니

 

고블린이 (9,9) 위치에 있으니 거기로 가서 말을 걸면 플래그를 준다고 알려준다.

 

 

(9,9) 위치로 가기 위해 이리저리 플레이 해봤는데

 

여기 캡처에는 보이지 않지만, 

 

서버측에서 고블린을 절대 만날 수 없도록 만들어 놨다.

 

사용자의 위치가 5 에서 시작하는데,

 

1 step 씩 동서남북으로 움직일 때마다 9 씩 움직여서

 

정상적인 방법으로는 절대 (9,9) 에 도달할 수 없다.

 

packet = struct.pack("iiiiiiii",posx,posy,coins,health,mana,goblin,terminated,dummyflag)

 

그래서 client 측의 코드를 바꿔보았다.

 

이 부분을 보면

 

패킷을 구성할때 인수로 posx, posy 를 전달하는데,

 

이게 사용자의 위치를 나타내는 변수이다.

 

packet = struct.pack("iiiiiiii",9,9,coins,health,mana,goblin,terminated,dummyflag)

 

간단하게 posx, posy 부분을

 

고블린이 있는 위치인 9, 9로 바꿔보았다.

 

 

그리고나서 client.py 를 실행해

 

1번을 선택하여 고블린에게 말을 걸면

 

고블린이 플래그를 알려준다.

반응형