Crack Me

Description

Can you figure out the correct cipher being used?

Cracked

We are given a Python script crack.py

The first bit gives us a cipher, which is the encrypted flag, and an alphabet

flag = "C6EC@r%uLJ_F#b0c04Co4<0bIAbCEN"

alphabet = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ \
            "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

We also get a list of ciphers

ciphers = [
           "RSA", "ELGAMAL", "DIFFIE-HELLMAN", "DES","MD5", "SHA1", "SHA256", "SHA512", "SHA3", "RSA",
           "CETACEAN", "CIPHERSABER2", "RAIL FENCE", "A1Z26", "BLOWFISH", "RC4", "RC5", "RC6",
           "RC7", "RC8", "RC9", "RC10", "RC11", "RC12", "RC13", "RC14", "RC15", "RC16", "RC17",
           "RC18", "RC19", "RC20", "RC21", "RC22", "RC23", "RC24", "RC25", "RC26", "RC27",
           "RC28", "RC29", "RC30", "RC31", "RC32", "RC33", "RC34", "RC35", "RC36", "RC37",
           "RC38", "RC39", "RC40", "RC41", "RC42", "RC43", "RC44", "RC45", "RC46", "RC47",
           "RC48", "RC49", "ROT47", "RC50", "RC51", "RC52", "RC53", "RC54", "RC55", "RC56", "RC57",
           "RC58", "Morse", "RC59", "RC60", "RC61", "RC62", "RC63", "RC64", "RC65", "RC66", "RC67",
           "RC68", "RC69", "RC70", "RC71", "RC72", "RC73", "RC74","Vigenere", "RC75", "RC76", "RC77",
           "RC78", "RC79", "RC80", "RC81", "RC82", "RC83", "RC84", "RC85", "RC86", "RC87",
           "RC88", "RC89", "RC90", "RC91", "RC92", "RC93", "RC94", "RC95", "RC96", "RC97",
           "RC98", "RC99", "RC100", "RC101","ATBASH", "RC102", "RC103", "RC104", "RC105", "RC106",
           "RC107","BACONIAN", "RC108", "RC109", "RC110", "RC111", "RC112", "RC113", "RC114", "RC115",
           "RC116", "RC117", "AFFINE","RC118", "RC119", "RC120", "RC121", "RC122", "RC123", "RC124",
           "RC125", "RC126", "RC127", "RC128", "SIMPLE SUBSTITUTION", "RC129", "RC130", "RC131", "RC132", "RC133", "AES",
           "RC134", "RC135", "RC136", "RC137", "RC138", "RC139", "RC140", "RC141", "RC142",
           "RC143", "RC144", "ROT13", "RC145", "RC146", "RC147", "BIFID","RC148", "RC149", "RC150", "RC151",
           "RC152", "RC153", "POLYBIUS SQUARE","RC154", "RC155", "RC156", "RC157", "RC158", "RC159", "RC160",
           "RC161", "RC162", "RC163", "RC164","Caesar", "RC165", "RC166", "RC167", "RC168", "RC169",
           "RC170", "RC171", "RC172", "CODES AND NOMENCLATORS","RC173", "RC174", "RC175", "RC176", "RC177", "RC178"
        ]

Finally, the main function just calls get_flag so let's examine it

def get_flag():
    while True:
        input1 = input("Enter the correct cipher: ").upper()
        if input1 == ciphers[61]:
            key = int(input("\nEnter the key: "))
            decode_flag(flag,key)
            break
        else:
            print('Wrong shift cipher!\n')
        
   
def decode_flag(flag, key):
    decoded = ""

    for x in flag:
        index = alphabet.find(x)
        temp_index = (index + key) % len(alphabet)
        decoded = decoded + alphabet[temp_index]
    print(decoded)

Looks like get_flag takes in a cipher name then a key, which is an integer, and checks if the cipher is ciphers[61] from the provided list of ciphers

Since I'm not in the mood to count, let's add print(ciphers[61]) to the main function and run the script with python crack.py

The cipher is ROT47 so we can enter that in, then it prompts us with Enter the key:

Taking a look at the code, the key is used with decode_flag to decrypt the cipher using the alphabet, and since the cipher is ROT47 the key must be 47

  • This is due to decode_flag decrypting by "rotating" the flag with the key at the line (index + key) % len(alphabet)

Cracked

Flag

retroCTF{y0uR3_4_cr@ck_3xp3rt}

Last updated