NPST 04. Pinneved: obfuscated Python
Task description
Alvebetjentene på Jule NISSEN sitt verksted våknet i dag til et fryktelig syn; Julenissens slede er sprengt i fillebiter. Vi har satt folk på saken for å finne ut av hvem som er ansvarlig for ødeleggelsen, men det er kritisk at sleden blir reparert slik at vi får testet den før Jule NISSEN skal levere pakkene.
Alvebetjentene har samlet vrakrestene, samt verktøyet de mistenker at sabotørene har brukt.
Vi trenger at du rekonstruerer sleden så fort som mulig!
- Tastefinger
"""TEMMELIG HEMMELIG"""
"""Sør-Polar Sikkerhetstjeneste"""
"""Høyeksplosivt script for tilintetgjørelse av Julenissens slede"""
otp = [23, 2, 0, 5, 13, 16, 22, 7, 9, 4, 19, 21,
18, 10, 20, 11, 12, 14, 6, 1, 3, 8, 17, 15]
def explode(input, antall):
størrelse = len(input) // antall
fragmenter = []
for i in range(0, len(input), størrelse):
fragment = input[i:i+størrelse]
fragmenter.append(fragment)
return fragmenter
with open("slede.txt", "r") as file:
slede = file.read()
bang = explode(slede, 24)
eksplosjon = [''.join([chr(ord(c) + 2) for c in fragment])
for fragment in bang]
pinneved = [str(eksplosjon[i]) for i in reversed(otp)]
with open("pinneved.txt", "w") as file:
file.write(''.join(pinneved))Solution
This is a simple sorting problem.
Simplified explanation of pinneved.py.
- Explode the sled into chunks of length: totallength // 24 == 361
- Scramble the chunks with the reversed value of the variable
otp. The first chunk moves to index 23, the second moves to index 2, the third moves to index 0, and so on:[23, 2, 0, 5, 13, 16, 22, 7, 9, 4, 19, 21, 18, 10, 20, 11, 12, 14, 6, 1, 3, 8, 17, 15] - Every ASCII value is shifted by two, like so:
scrambled = [chr(ord(c) + 2) for c in sled]
To solve it, we simply unscramble based on the steps above. I’ve done this in a one-liner in decrypt.py. The output is some ASCII art that contains the flag.
**
** ** **
** ** ** **
************ ************
** ** ** **
==** **==
======== @@
==**==================**
========== ======================
@@ @@ ========
******** **========
******** ==================
********** @@==============@@
@@@@************ @@@@@@======@@@@============@@
==== **************==== @@================@@@@========@@@@
======== ********** @@@@== ==@@==================@@@@@@@@@@@@
========@@@@ ******@@@@@@@@@@ ======@@==============================
******** ====@@====@@====@@==**@@@@@@@@ @@======** @@ @@@@====** **======@@==============================
**==@@@@**==@@====@@======@@@@@@@@@@@@@@@@@@@@ @@====== ====== @@@@========@@@@================**********==
**@@@@==**======@@======@@@@@@@@@@**@@@@@@@@======****************==================** ==================@@@@================**********==
@@@@@@**========@@====@@@@@@@@@@ @@@@@@@@@@ **@@@@==@@****========================** ** ================@@@@==============**********==
@@@@@@@@****======@@@@==@@@@@@@@@@ @@@@@@****@@@@@@==@@@@@@@@@@@@@@@@======@@== ====== ======================@@@@@@==========**********==
**@@@@@@**========@@@@==@@@@@@@@== ******@@@@@@@@@@**@@@@@@@@@@@@@@@@@@@@@@========** ============** **======================@@@@@@@@ ==== ====
**@@@@@@@@****========**************@@@@@@@@@@@@@@@@****@@@@@@@@@@@@@@@@@@@@@@@@@@** ============== ======================== ==== ====
**@@@@@@@@@@@@********@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@******@@@@@@@@@@@@@@@@@@@@@@@@** ================ == @@
**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@====****@@@@@@@@@@@@@@@@@@@@@@@@** == == **== ==
**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****@@@@**@@@@@@@@@@@@@@**@@** == == == ==
**@@========================================================**@@@@@@@@@@@@@@@@@@@@@@@@==** == == == **==
**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****************************** == == == ==
**@@========================================================**@@@@@@@@@@@@@@@@@@@@@@@@==** == == @@ @@
**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@****@@**==@@@@@@@@@@@@@@@@@@@@** **== == ==
******@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**@@******==@@@@@@@@@@@@@@@@** ******** @@ ==
**==**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@******@@@@==**==@@@@@@@@@@@@@@@@** **** == ==
******@@****@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@==**********@@@@@@@@==**==@@@@@@@@@@@@@@@@** **** == ==
**== **@@==******************************************========@@@@@@******@@@@@@@@@@@@@@==== ****** ==** ****
**== @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@******==@@@@@@@@@@@@@@** ******** == ==
**** **** **** **** ********== **** ********== @@ @@
** **** **** **** ************************ **** ** ** **
/$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$ /$$/$$ /$$ /$$$
| $$__ $$ /$$__ $$|__ $$__//$$_/ /$$__ $$ /$$__ $$ /$$__ $$|_ $$_/|_ $$_/ | $$ | $$ | $$ | $$ |_ $$
| $$ \ $$| $$ \__/ | $$ | $$ | $$ \ $$| $$ \__/| $$ \__/ | $$ | $$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ | $$ /$$ /$$ /$$| $$ /$$$$$$ | $$
| $$$$$$$/| $$$$$$ | $$ /$$$ | $$$$$$$$| $$$$$$ | $$ | $$ | $$ |____ $$ /$$__ $$|_ $$_/ /$$__ $$ /$$__ $$ | $$ /$$/| $$ | $$| $$|_ $$_/ | $$$
| $$____/ \____ $$ | $$ | $$ | $$__ $$ \____ $$| $$ | $$ | $$ /$$$$$$$| $$ \__/ | $$ | $$$$$$$$| $$ \__/ | $$$$$$/ | $$ | $$| $$ | $$ | $$/
| $$ /$$ \ $$ | $$ \ $$ | $$ | $$ /$$ \ $$| $$ $$ | $$ | $$ /$$__ $$| $$ | $$ /$$ | $$_____/| $$ | $$_ $$ | $$ | $$| $$ | $$ /$$ | $$
| $$ | $$$$$$/ | $$ | $$$| $$ | $$| $$$$$$/| $$$$$$/ /$$$$$$ /$$$$$$ | $$$$$$$| $$ | $$$$/ | $$$$$$$| $$ | $$ \ $$| $$$$$$/| $$ | $$$$//$$$/
|__/ \______/ |__/ \___/|__/ |__/ \______/ \______/ |______/|______//$$$$$$\_______/|__/ \___//$$$$$$\_______/|__//$$$$$$|__/ \__/ \______/ |__/ \___/ |___/
|______/ |______/ |____Flag: PST{ASCII_art_er_kult}