๐ง ๋ฌธ์
๋ฌธ์ ๋ช : GPS Tracking
prob1.dat
ํ์ผ์ด ์ฃผ์ด์ง๋ค. ํด๋น ํ์ผ์ HxD
ํด๋ก ์ด์ด๋ณด๋ฉด, ๊ท์น์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋จ์ ์ถ์ธกํ ์ ์๋ค. ๋ฌธ์ ์ ํจ๊ป ๋ดค์ , ๊ท์น์ ์ผ๋ก ์์น ์ ๋ณด๋ฅผ ๋ด๊ณ ์์์ ์ ์ ์๋ค.
ํด๋น ์ฅ์๋ค์ ํ๋ฌ์ค ์ฝ๋๋ฅผ ์กฐํฉํ์ฌ ํ๋๊ทธ๋ฅผ ํ๋ํ๋ผ๊ณ ํ๋ค.
ํ๋๊ทธ ํ์
flag = ''
for place in places:
flag += plus_code[:-2]
-> scpCTF{flag}
ํ๋๊ทธ ํ์์ ์์ ๊ฐ๋ค๊ณ ํ๋ค. .dat
ํ์ผ์ ๊ท์น์ ์ฐพ์์ ์์น๋ฅผ ์ฐพ๊ณ , ํ๋ฌ์ค ์ฝ๋๋ก ๋ง์ง๋ง ๋๊ธ์์ฉ ์ฐ๊ฒฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
๐ง ๋ถ์
์์ ๊ฐ์ ๊ท์น์ ์ฐพ์ ์ ์๋ค. 4๋ฐ์ดํธ ๋จ์๋ก ๋๊ฐ์ ํ๋๊ฐ ์๊ณ , ์ดํ \x00\x00
์ด ๋ค์ด๊ฐ์๋ ๊ท์น์ด๋ค. ๊ฐ์ ์๋ฆฌ์ ํ๋๋ค์ ์ ์ฌํ ๊ฐ์ ๊ฐ์ง๊ณ ์์์ ์ ์ ์๋ค.
ํด๋น ์นด๋ฉ๋ผ์ ๊ท์น์ ์๋(4byte), ๊ฒฝ๋(4byte), null(2byte)์ด๊ณ , ์๋์ ๊ฒฝ๋๋ ๊ฐ๊ฐ 10์ง ํํ๋ก ์ ์ฅ๋์ด ์๋ค.
๋ฐ๋ผ์, ๋ฆฌํ์๋์ธ์ผ๋ก ๊ฐ์ ํ์ฑํ์ฌ ๋๋ถ์ด๋ก ๋ณํํ๊ณ , ๋ค์ ์๋/๊ฒฝ๋ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ์ขํ๋ฅผ ์ป๋๋ค. ์ดํ, google map
์์ ํ๋ฌ์ค์ฝ๋๋ฅผ ํ์ธํ์ฌ ์กฐํฉํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๐ง ๋ฌธ์ ํด๊ฒฐ
import struct
import googlemaps
from tqdm import *
GOOGLE_MAPS_API_KEY = ""
def get_plus_code(x, y):
gmaps = googlemaps.Client(key=GOOGLE_MAPS_API_KEY)
result = gmaps.reverse_geocode((x, y))
if result and len(result) > 0:
plus_code = result[0].get('plus_code', {}).get('global_code', None)
return plus_code
else:
return None
def degree_to_dms(deg):
degree = int(deg)
minute = int((deg - degree) * 60)
second = (deg - degree - minute/60) * 3600
return degree, minute, second
def dms_to_degree(dms):
degree, minute, second = dms[0], dms[1], dms[2]
return(float(degree) + float(minute)/60 + float(second)/(60*60))
def int_to_dms(int_value):
int_value = (int_value/ 100) / 3600
degree = int(int_value)
int_value = 60 * (int_value - degree)
minute = int(int_value)
int_value = 60 * (int_value - minute)
second = int(int_value)
return degree, minute, second
def dms_to_int(dms):
degree = int(dms[0])
minute = int(dms[1])
second = round(float(dms[2]),2)
int_value = int((degree * 3600 + minute * 60 + second) * 100)
return int_value
def save_file(lst, file_path):
with open(file_path, 'wb') as file:
for tmp in lst:
lat = tmp[0]
log = tmp[1]
lat_dms = degree_to_dms(lat)
log_dms = degree_to_dms(log)
lat_int = dms_to_int(lat_dms[0], lat_dms[1], lat_dms[2])
log_int = dms_to_int(log_dms[0], log_dms[1], log_dms[2])
lat_bytes = struct.pack('i', lat_int)
log_bytes = struct.pack('i', log_int)
data_bytes = lat_bytes + log_bytes
file.write(data_bytes[:][::-1])
def bytes_to_int(data):
return struct.unpack('<I', data)[0]
data_block = open('prob1.dat','rb').read()
result = ''
for i in trange(0,len(data_block),0xa):
try:
dat = data_block[i:i+0x8]
lat_int, log_int = bytes_to_int(dat[0:4]), bytes_to_int(dat[4:8])
lat_dms, log_dms = int_to_dms(lat_int), int_to_dms(log_int)
#print(lat_dms, log_dms)
latitude, longitude = dms_to_degree(lat_dms), dms_to_degree(log_dms)
print(f"\nLatitude : {latitude}\nLongitude : {longitude}")
plus_code = get_plus_code(latitude,longitude)
#print(plus_code)
result += plus_code[-2:]
except:
continue
print('scpCTF{'+result+'}')