Skip to content

Instantly share code, notes, and snippets.

@infinitewarp
Created November 4, 2022 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save infinitewarp/5b8d9e0a70ff5fa51eab0762a671c6ec to your computer and use it in GitHub Desktop.
Save infinitewarp/5b8d9e0a70ff5fa51eab0762a671c6ec to your computer and use it in GitHub Desktop.
RH_CFT 2022 Parachute

RH_CTF 2022 Parachute

Real-world NASA/JPL science

This puzzle was based on real-world engineering! NASA's Mars Perseverance Rover was designed with a unique landing system. It deployed a parachute to slow its decent. Then it fired small rockets to hover above the surface and deploy a one-of-a-kind sky crane to lower the rover to the surface while those rockets were firing.

Watch the 2021-02-18 Perseverance Rover's decent and touchdown here: https://youtu.be/4czjS9h4Fpg

(The parachute deploys at 0:12, and the sky crane lowers at 2:45.)

Live video feed screen capture of the parachute:

CG mockup/simulation of the sky crane:

Live video feed screen capture of the sky crane:

Full-scale engineering model of Perseverance. It's big! About the size of a medium sedan.

What about that parachute?

Within hours of the live launch video feed, NASA/JPL engineer Adam Steltzner (lead engineer of the rover's Entry/Descent/Landing phase) confirmed the many posts shouting about it online:

https://twitter.com/steltzner/status/1364076615932645379

What's that encoding?

  • The numbers in the outer ring are just binary.
  • The rest is almost 7-bit ASCII.
  • 1111111 is just filler, not characters.
  • all 7-bit segments need to flip the leading bit from 0 to 1.

RH_CTF 2022 version

Crop original image:

Brighten:

Denoise:

Add grid template overlay:

Draw rings to separate sections:

Draw wedges to separate sections:

Converting binary to 7-bit ASCII

import signal

all_chars = []

def handler(signum, frame):
    print(flush=True)
    print("**********")
    print(f"Decoded message: {''.join(all_chars)}")
    print("Exiting.")
    exit()

signal.signal(signal.SIGINT, handler)

while True:
    binary_string = input("binary input: ")
    new_char = chr(int(binary_string, 2) + 64)
    all_chars.append(new_char)
    print(new_char)

Demo, asciinema recording:

asciicast

Decoded solution!

Decoded sections:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment