Hack-A-Sat 2 Qualifiers Writeup

この大会は2021/6/26 23:00(JST)~2021/6/28 5:00(JST)に開催されました。
今回もチームで参戦。結果は48点で697チーム中280位でした。
自分で解けた問題をWriteupとして書いておきます。

Cape Canaveral (Launch Pad)

添付ファイルを展開していくと、flag.txtにフラグが書いてあった。

flag{romeo64040foxtrot2:GE7O02ptNVioho5UrEOABUWZbsZ35pH5zE3Tu3N2NJp6cxWXNuqozIPTANV0w72eqOxB83XgNEJRsZ-_f7_qkC0}

Vandenberg (Launch Pad)

$ nc light-fever.satellitesabove.me 5030
Ticket please:
ticket{juliet129249mike2:GNxsvTYyRq-i5Uzg9OyZx4pkX39q3b2DZXvTuKGQ-SpEersEyEerz1gnRs_GxsWoWw}
1381188155 + 299201040 = ?

計算問題が出題されるので答える。

import socket

def recvuntil(s, tail):
    data = ''
    while True:
        if tail in data:
            return data
        data += s.recv(1)

ticket = 'ticket{juliet129249mike2:GNxsvTYyRq-i5Uzg9OyZx4pkX39q3b2DZXvTuKGQ-SpEersEyEerz1gnRs_GxsWoWw}'

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('light-fever.satellitesabove.me', 5030))

data = recvuntil(s, '\n').rstrip()
print data
print ticket
s.sendall(ticket + '\n')

data = recvuntil(s, '?')
formula = data.split(' = ')[0]
ans = str(eval(formula))
print data + ans
s.sendall(ans + '\n')
data = recvuntil(s, '\n').rstrip()
print data
data = recvuntil(s, '\n').rstrip()
print data
data = recvuntil(s, '\n').rstrip()
print data

実行結果は以下の通り。

Ticket please:
ticket{juliet129249mike2:GNxsvTYyRq-i5Uzg9OyZx4pkX39q3b2DZXvTuKGQ-SpEersEyEerz1gnRs_GxsWoWw}
1381188155 + 299201040 = ?1680389195
You got it!
Here's your flag:
flag{juliet129249mike2:GA2H-aYaRo2aO92FZYrxxlwHUghqK8rhn70U1bPCWv1msQyAIQ5cCeqMtWbhFr9FS4oo1mUiu9BlzG6vKXbTOmw}
flag{juliet129249mike2:GA2H-aYaRo2aO92FZYrxxlwHUghqK8rhn70U1bPCWv1msQyAIQ5cCeqMtWbhFr9FS4oo1mUiu9BlzG6vKXbTOmw}

Edwards (Launch Pad)

$ nc sharp-object.satellitesabove.me 5031
Ticket please:
ticket{mike765988hotel2:GMk7kVfski9enWkhCIP_L2WyfJ8mhq7vqts4PLhFYLJ7awd9HrSXsB0JMLpSsTUFzg}
Please navigate to http://52.14.38.134:19048/ in your favorite browser.
You have 60 seconds.

これで60秒間有効なURLが表示されるので、ブラウザでアクセスする。
「This is the way」のリンクをクリックしたら、フラグが表示された。

flag{mike765988hotel2:GH4gL6bP15VVEr7sSjNDnF6Wy2ai-RAzrKG_ampH4kjHe18aO2FnVGohYyKuWPUIknvpWvDGXqVcFfrcUa5CqVY}

iq (We're On the Same Wavelength)

$ nc unique-permit.satellitesabove.me 5006
Ticket please:
ticket{echo88126papa2:GETJ79_7Zs8MnOuKypq_QGJnT8qbHNv1a9i7OYQ8tLlkzXO0bDS9_SXDd3dT-kqCLA}
IQ Challenge
   QPSK Modulation   
          Q
          |          
    01    |     11   
    o     |+1   o    
          |          
          |          
    -1    |     +1   
===================== I
          |          
          |          
    00    |     10   
    o     |-1   o    
          |          
          |          
Convert the provided series of transmit bits into QPSK I/Q samples
                  |Start here
                  v
Bits to transmit: 01000011 01110010 01101111 01101101 01110101 01101100 01100101 01101110 01110100 00001010
Provide as interleaved I/Q e.g. 1.0 -1.0 -1.0  1.0 ... 
                                 I    Q    I    Q  ...
Input samples:

0は -1.0、1は 1.0に置き換えればよい。

import socket

def recvuntil(s, tail):
    data = ''
    while True:
        if tail in data:
            return data
        data += s.recv(1)

ticket = 'ticket{echo88126papa2:GETJ79_7Zs8MnOuKypq_QGJnT8qbHNv1a9i7OYQ8tLlkzXO0bDS9_SXDd3dT-kqCLA}'

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('unique-permit.satellitesabove.me', 5006))

data = recvuntil(s, '\n').rstrip()
print data
print ticket
s.sendall(ticket + '\n')

data = recvuntil(s, ': ')
bits = recvuntil(s, '\n').rstrip()
print data + bits
data = recvuntil(s, ': ')

bits = bits.replace(' ', '')
ans = ''
for b in bits:
    if b == '0':
        ans += '-1.0 '
    else:
        ans += '1.0 '

ans = ans[:-1]
print data + ans
s.sendall(ans + '\n')
data = recvuntil(s, '\n').rstrip()
print data
data = recvuntil(s, '\n').rstrip()
print data

実行結果は以下の通り。

Ticket please:
ticket{echo88126papa2:GETJ79_7Zs8MnOuKypq_QGJnT8qbHNv1a9i7OYQ8tLlkzXO0bDS9_SXDd3dT-kqCLA}
IQ Challenge
   QPSK Modulation
          Q
          |
    01    |     11
    o     |+1   o
          |
          |
    -1    |     +1
===================== I
          |
          |
    00    |     10
    o     |-1   o
          |
          |
Convert the provided series of transmit bits into QPSK I/Q samples
                  |Start here
                  v
Bits to transmit: 01000011 01110010 01101111 01101101 01110101 01101100 01100101 01101110 01110100 00001010
Provide as interleaved I/Q e.g. 1.0 -1.0 -1.0  1.0 ...
                                 I    Q    I    Q  ...
Input samples: -1.0 1.0 -1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 -1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 1.0 -1.0 1.0 -1.0
You got it! Here's your flag:
flag{echo88126papa2:GL7EtSGPuI6Jiz0StQJ0xLlP2ugBA0MNzXTsdArBZjDzXqdPeU7fsNU3xBvhIpSL5huK7h6wZmOAgwmOSV1ezhU}
flag{echo88126papa2:GL7EtSGPuI6Jiz0StQJ0xLlP2ugBA0MNzXTsdArBZjDzXqdPeU7fsNU3xBvhIpSL5huK7h6wZmOAgwmOSV1ezhU}