M0rsarchive

Just unzip the archive ... several times ...


  • solution.py

from PIL import Image
from zipfile import ZipFile
import os

morse = {
    ".-": "a",
    "-...": "b",
    "-.-.": "c",
    "-..": "d",
    ".": "e",
    "..-.": "f",
    "--.": "g",
    "....": "h",
    "..": "i",
    ".---": "j",
    "-.-": "k",
    ".-..": "l",
    "--": "m",
    "-.": "n",
    "---": "o",
    ".--.": "p",
    "--.-": "q",
    ".-.": "r",
    "...": "s",
    "-": "t",
    "..-": "u",
    "...-": "v",
    ".--": "w",
    "-..-": "x",
    "-.--": "y",
    "--..": "z",
    "-----": "0",
    ".----": "1",
    "..---": "2",
    "...--": "3",
    "....-": "4",
    ".....": "5",
    "-....": "6",
    "--...": "7",
    "---..": "8",
    "----.": "9"
}

def password(passwordfile):
    with Image.open(passwordfile) as im:
        px = im.load()
        size = im.size
        # print("[+] Image size: {}".format(size))
        base_pixel = px[0,0]
        morse_pixel = px[1,1]
        # print("[+] Base pixel: {}".format(base_pixel))
        # print("[+] Morse Pixel: {}".format(morse_pixel))
        # Start from below
        pixelrow = []
        password = []
        for i in range(1,size[1],2):
            for j in range(size[0]):
                if px[j,i] == base_pixel:
                    pixelrow.append('0')
                else:
                    pixelrow.append('1')
            morsecode = "".join(pixelrow).strip('0').replace("111","-").replace("1",".").replace("0","")
            print(morsecode)
            password.append(morse[morsecode])
            pixelrow = []
        passw = "".join(password)
        print()
        return passw

def getzipname():
    for files in os.listdir():
        if ".zip" in files:
            return files


def unzip(filename,passwordfilename):
    with ZipFile(filename) as zipf:
        passs = password(passwordfilename)
        print("opening zip file {} with {}".format(filename,passs))
        zipf.extractall(pwd=bytes(passs,'utf-8'))
        os.remove(filename)
        os.remove(passwordfilename)
        os.system("mv flag/*.zip flag/*.png .")
    zipname = getzipname()
    unzip(zipname,passwordfilename)

zipname = getzipname()
unzip(zipname,"pwd.png")

Last updated