CTF/MISC

[boot2root] Vulnerable Adventure 2 - MISC / Python

SecurityMan 2023. 2. 11. 11:00

 

이전 문제(https://hackingstudypad.tistory.com/413) 와 연계되는 문제이다.

 

똑같이 전에 제공되었던 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)

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

 

이게 이전에 제공되었던 client.py 파일의 내용이다.

 

vuln = random.randint(1,500)

while(1 == 1):

	choice = input("Enter your choice : ")
	if choice == vuln:
		dummyflag = 1

 

고블린을 움직이는데 사용하는 나머지 부분은 다 필요없고

 

이번 문제를 풀기위해서는 이 부분만 보면 된다.

 

코드를 보면

 

1에서 500까지의 숫자 중 랜덤으로 하나를 선택해 vuln 변수에 저장한다.

 

그리고 Enter your choice : 로 사용자의 입력을 받을 때

 

사용자의 입력값이 vuln 의 숫자와 같으면

 

dummyflag 값을 1로 세팅하게 된다.

 

이번 문제는 두 가지 방법으로 해결이 가능하다.

 

vuln = random.randint(1,500)
print(vuln)
while(1 == 1):

	choice = input("Enter your choice : ")
	if choice == vuln:
		dummyflag = 1

 

첫번째는 위처럼 vuln 변수가 설정되고 난 뒤에

 

print(vuln) 을 추가해서 vuln 에 어떤 값이 들어있는지 확인하는 것이다.

 

그런다음 그 값을 그대로 입력하면 dummyflag 가 1로 세팅될 것이다.

 

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

변경 후 : packet = struct.pack("iiiiiiii",posx,posy,coins,health,mana,goblin,terminated,1)

 

두번째는 packet 변수를 세팅할때 

 

dummyflag 라고 되어있는 부분을 그냥 1로 바꿔주는 것이다.

 

이렇게 하면 어떤 경우라도 dummyflag 값은 1이 되어 서버로 전달되게 된다.

 

 

첫번째 방법으로 해결했다.

 

print(vuln) 명령어 수행 결과가 379 라고 나왔고,

 

입력창에 그대로 379 라고 입력했더니

 

dummyflag 변수가 1로 설정되어 서버로부터 플래그를 수신할 수 있었다.

반응형