$cat python.mdReversingHacknite 2.0
Python
A short Python script scrambles the flag with a reversible shift and base32. Running each step backwards restores it.
$man python
What this one teaches:
- Reading a short program to list the exact steps it performs.
- That each step (a shift, a join, base32) can be undone in reverse order.
- What base32 and ASCII codes are.
Task description
Ema likes programming in Python. As a challenge, she’s giving you one of her compact scripts that turns your solution into a pile of meaningless characters. Reverse her process and find the flag.
The original was in Croatian; this is my translation.
The script
We get the script and its output:
import base64
flag = open("flag.txt").readline().rstrip()
result = ""
for i in range(len(flag)):
result += chr(ord(flag[i]) + (i % len(flag)))
print(base64.b32encode(("|").join(list(result)).encode()))
# b'IN6FK7CIPQ2XYND4G56DO7DCPQ7HYQD4HZ6DW7CDPRAXYPT4IR6EI7CGPREXYS34OE'
Reversing anything like this is just doing its steps backwards. In order, it:
- reads the flag from a file;
- shifts each character:
ordgives a character’s number (its ASCII code), it adds the positioni, andchrturns the number back into a character. (i % len(flag)is justihere, sinceinever reaches the length.) - puts a
|between every character; - encodes the whole thing with base32, a way of writing data using 32 plain characters.
Undoing it
We run those steps in reverse: base32-decode, drop the | separators, then shift each character back by its position.
encoded = "IN6FK7CIPQ2XYND4G56DO7DCPQ7HYQD4HZ6DW7CDPRAXYPT4IR6EI7CGPREXYS34OE"
import base64
joined = base64.b32decode(encoded).decode() # e.g. "C|U|H|5|..."
shifted = joined.replace("|", "") # drop the separators
flag = ""
for i in range(len(shifted)):
flag += chr(ord(shifted[i]) - i) # shift each one back
print(flag)
Base32 decoding gives C|U|H|5|4|7|7|b|.... Removing the | leaves the shifted characters, and subtracting each one’s position undoes step 2. The first few come out as C, then T, then F: the start of the flag. The rest follows, giving the full flag.
$cat flag.txt reveal
CTF2021[674074054578]