63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
import numpy as np
|
|
from pwnlib import tubes
|
|
import time
|
|
import matplotlib.pyplot as plt
|
|
from scipy.spatial.transform import Rotation
|
|
import seaborn as sb
|
|
|
|
def read_starfile(data):
|
|
stars = []
|
|
for line in data.strip().split('\n'):
|
|
[x,y,z,m] = [float(s.strip()) for s in line.split(',')]
|
|
stars.append({'v': np.array([x,y,z]), 'm':m})
|
|
return stars
|
|
|
|
with open('./spacebook-golf56788echo/test.txt') as f:
|
|
catalog = read_starfile(f.read())
|
|
|
|
def match_brightest_stars(unknown, catalog):
|
|
brightest = []
|
|
catalog_matches = []
|
|
for star in unknown:
|
|
if star['m'] < 500:
|
|
continue
|
|
|
|
# find closest magnitude in catalog
|
|
match = np.argmin(np.abs(np.array([s['m'] for s in catalog]) - star['m']))
|
|
print(f'[+] matched {star} to {catalog[match]}')
|
|
brightest.append(star)
|
|
catalog_matches.append(catalog[match])
|
|
|
|
return brightest, catalog_matches
|
|
|
|
def orient(ref, catalog):
|
|
P = [s['v'] for s in catalog]
|
|
Q = [s['v'] for s in ref]
|
|
|
|
rot, rmsd = Rotation.align_vectors(P, Q)
|
|
print(f'[+] aligned; rmsd = {rmsd}')
|
|
return rot
|
|
|
|
TICKET = 'ticket{golf56788echo:GC_k-MZGAfTKMu0NDrCfBq2vYcpBpr5MuWKIFWJU3xOm2B_YAUF-EUiGswBD9NJ5Mw}'
|
|
r = tubes.remote.remote('spacebook.satellitesabove.me', 5015)
|
|
r.send(TICKET+'\n')
|
|
time.sleep(0.5)
|
|
r.recvuntil('Ticket please:\n', drop=True)
|
|
|
|
for _ in range(5):
|
|
unknown_stars = read_starfile(r.recvuntil('\n\n').decode())
|
|
|
|
# find pairs
|
|
unknown_ref, catalog_ref = match_brightest_stars(unknown_stars, catalog)
|
|
# get attitude
|
|
attitude = orient(unknown_ref, catalog_ref)
|
|
# rotate each star to catalog-referenced coordinates and match by L2 norm
|
|
index_guesses = []
|
|
for star in unknown_stars:
|
|
v = attitude.apply(star['v'])
|
|
index_guesses.append(np.argmin([np.linalg.norm(catalog_star['v'] - v) for catalog_star in catalog]))
|
|
|
|
r.send(','.join(map(str, index_guesses))+'\n')
|
|
r.recvuntil('Left...\n')
|
|
print(r.clean())
|