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

pinneved.txt pinneved.py

"""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}