Challenge: Dill

Originally this was going to be about pickles, but .pyc sounds close enough to “pickles” so I decided to make it about that instead.

Download: dill.cpython-38.pyc

Solve

1. Go to PyC decompile and upload the file. It will show the code. 2. Code:

# uncompyle6 version 3.5.0
# Python bytecode 3.8 (3413)
# Decompiled from: Python 2.7.5 (default, Jun 20 2023, 11:36:40) 
# [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
# Embedded file name: dill.py
# Size of source mod 2**32: 914 bytes


class Dill:
    prefix = 'sun{'
    suffix = '}'
    o = [5, 1, 3, 4, 7, 2, 6, 0]

    def __init__(self) -> None:
        self.encrypted = 'bGVnbGxpaGVwaWNrdD8Ka2V0ZXRpZGls'

    def validate(self, value: str) -> bool:
        if not (value.startswith(Dill.prefix) and value.endswith(Dill.suffix)):
            return False
        value = value[len(Dill.prefix):-len(Dill.suffix)]
        if len(value) != 32:
            return False
        c = [value[i:i + 4] for i in range(0, len(value), 4)]
        value = ''.join([c[i] for i in Dill.o])
        if value != self.encrypted:
            return False
        else:
            return True

Solution

class Dill:
    prefix = "sun{"
    suffix = "}"
    o = [5, 1, 3, 4, 7, 2, 6, 0]

    def __init__(self) -> None:
        self.encrypted = "bGVnbGxpaGVwaWNrdD8Ka2V0ZXRpZGls"

    def validate(self, value: str) -> bool:
        if not (value.startswith(Dill.prefix) and value.endswith(Dill.suffix)):
            return False
        value = value[len(Dill.prefix) : -len(Dill.suffix)]
        if len(value) != 32:
            return False
        c = [value[i : i + 4] for i in range(0, len(value), 4)]
        value = "".join([c[i] for i in Dill.o])
        if value != self.encrypted:
            return False
        else:
            return True

    def decrypt(self, value: str):
        ans = ""
        if len(value) != 32:
            return False
        c = [value[i : i + 4] for i in range(0, len(value), 4)]
        for i in range(8):
            pos = Dill.o.index(i)
            ans += c[pos]
        return Dill.prefix + ans + Dill.suffix


d = Dill()
ans = d.decrypt("bGVnbGxpaGVwaWNrdD8Ka2V0ZXRpZGls")
print(ans)

Flag

sun{ZGlsbGxpa2V0aGVwaWNrbGVnZXRpdD8K}