diff --git a/rev/crackme_py/crackme.py b/rev/crackme_py/crackme.py new file mode 100755 index 0000000..7a91689 --- /dev/null +++ b/rev/crackme_py/crackme.py @@ -0,0 +1,58 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p python3 + +# Hiding this really important number in an obscure piece of code is brilliant! +# AND it's encrypted! +# We want our biggest client to know his information is safe with us. +bezos_cc_secret = "A:4@r%uL`M-^M0c0AbcM-MFE0g4dd`_cgN" + +# Reference alphabet +alphabet = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ \ + "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" + + + +def decode_secret(secret): + """ROT47 decode + + NOTE: encode and decode are the same operation in the ROT cipher family. + """ + + # Encryption key + rotate_const = 47 + + # Storage for decoded secret + decoded = "" + + # decode loop + for c in secret: + index = alphabet.find(c) + original_index = (index + rotate_const) % len(alphabet) + decoded = decoded + alphabet[original_index] + + print(decoded) + + + +def choose_greatest(): + """Echo the largest of the two numbers given by the user to the program + + Warning: this function was written quickly and needs proper error handling + """ + + user_value_1 = input("What's your first number? ") + user_value_2 = input("What's your second number? ") + greatest_value = user_value_1 # need a value to return if 1 & 2 are equal + + if user_value_1 > user_value_2: + greatest_value = user_value_1 + elif user_value_1 < user_value_2: + greatest_value = user_value_2 + + print( "The number with largest positive magnitude is " + + str(greatest_value) ) + + +# NOTE: replaced function +# choose_greatest() +decode_secret(bezos_cc_secret) diff --git a/rev/keygenme_py/keygenme-trial.py b/rev/keygenme_py/keygenme-trial.py new file mode 100755 index 0000000..7df2081 --- /dev/null +++ b/rev/keygenme_py/keygenme-trial.py @@ -0,0 +1,246 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p python3 python3Packages.cryptography + +#============================================================================# +#============================ARCANE CALCULATOR===============================# +#============================================================================# + +import hashlib +from cryptography.fernet import Fernet +import base64 + + + +# GLOBALS --v +arcane_loop_trial = True +jump_into_full = False +full_version_code = "" + +username_trial = "MORTON" +bUsername_trial = b"MORTON" + +key_part_static1_trial = "picoCTF{1n_7h3_|<3y_of_" +key_part_dynamic1_trial = "xxxxxxxx" +key_part_static2_trial = "}" +key_full_template_trial = key_part_static1_trial + key_part_dynamic1_trial + key_part_static2_trial + +star_db_trial = { + "Alpha Centauri": 4.38, + "Barnard's Star": 5.95, + "Luhman 16": 6.57, + "WISE 0855-0714": 7.17, + "Wolf 359": 7.78, + "Lalande 21185": 8.29, + "UV Ceti": 8.58, + "Sirius": 8.59, + "Ross 154": 9.69, + "Yin Sector CL-Y d127": 9.86, + "Duamta": 9.88, + "Ross 248": 10.37, + "WISE 1506+7027": 10.52, + "Epsilon Eridani": 10.52, + "Lacaille 9352": 10.69, + "Ross 128": 10.94, + "EZ Aquarii": 11.10, + "61 Cygni": 11.37, + "Procyon": 11.41, + "Struve 2398": 11.64, + "Groombridge 34": 11.73, + "Epsilon Indi": 11.80, + "SPF-LF 1": 11.82, + "Tau Ceti": 11.94, + "YZ Ceti": 12.07, + "WISE 0350-5658": 12.09, + "Luyten's Star": 12.39, + "Teegarden's Star": 12.43, + "Kapteyn's Star": 12.76, + "Talta": 12.83, + "Lacaille 8760": 12.88 +} + + +def intro_trial(): + print("\n===============================================\n\ +Welcome to the Arcane Calculator, " + username_trial + "!\n") + print("This is the trial version of Arcane Calculator.") + print("The full version may be purchased in person near\n\ +the galactic center of the Milky Way galaxy. \n\ +Available while supplies last!\n\ +=====================================================\n\n") + + +def menu_trial(): + print("___Arcane Calculator___\n\n\ +Menu:\n\ +(a) Estimate Astral Projection Mana Burn\n\ +(b) [LOCKED] Estimate Astral Slingshot Approach Vector\n\ +(c) Enter License Key\n\ +(d) Exit Arcane Calculator") + + choice = input("What would you like to do, "+ username_trial +" (a/b/c/d)? ") + + if not validate_choice(choice): + print("\n\nInvalid choice!\n\n") + return + + if choice == "a": + estimate_burn() + elif choice == "b": + locked_estimate_vector() + elif choice == "c": + enter_license() + elif choice == "d": + global arcane_loop_trial + arcane_loop_trial = False + print("Bye!") + else: + print("That choice is not valid. Please enter a single, valid \ +lowercase letter choice (a/b/c/d).") + + +def validate_choice(menu_choice): + if menu_choice == "a" or \ + menu_choice == "b" or \ + menu_choice == "c" or \ + menu_choice == "d": + return True + else: + return False + + +def estimate_burn(): + print("\n\nSOL is detected as your nearest star.") + target_system = input("To which system do you want to travel? ") + + if target_system in star_db_trial: + ly = star_db_trial[target_system] + mana_cost_low = ly**2 + mana_cost_high = ly**3 + print("\n"+ target_system +" will cost between "+ str(mana_cost_low) \ ++" and "+ str(mana_cost_high) +" stone(s) to project to\n\n") + else: + # TODO : could add option to list known stars + print("\nStar not found.\n\n") + + +def locked_estimate_vector(): + print("\n\nYou must buy the full version of this software to use this \ +feature!\n\n") + + +def enter_license(): + user_key = input("\nEnter your license key: ") + user_key = user_key.strip() + + global bUsername_trial + + if check_key(user_key, bUsername_trial): + decrypt_full_version(user_key) + else: + print("\nKey is NOT VALID. Check your data entry.\n\n") + + +def check_key(key, username_trial): + + global key_full_template_trial + + if len(key) != len(key_full_template_trial): + return False + else: + # Check static base key part --v + i = 0 + for c in key_part_static1_trial: + if key[i] != c: + return False + + i += 1 + + # TODO : test performance on toolbox container + # Check dynamic part --v + if key[i] != hashlib.sha256(username_trial).hexdigest()[4]: + return False + else: + i += 1 + + if key[i] != hashlib.sha256(username_trial).hexdigest()[5]: + return False + else: + i += 1 + + if key[i] != hashlib.sha256(username_trial).hexdigest()[3]: + return False + else: + i += 1 + + if key[i] != hashlib.sha256(username_trial).hexdigest()[6]: + return False + else: + i += 1 + + if key[i] != hashlib.sha256(username_trial).hexdigest()[2]: + return False + else: + i += 1 + + if key[i] != hashlib.sha256(username_trial).hexdigest()[7]: + return False + else: + i += 1 + + if key[i] != hashlib.sha256(username_trial).hexdigest()[1]: + return False + else: + i += 1 + + if key[i] != hashlib.sha256(username_trial).hexdigest()[8]: + return False + + + + return True + + +def decrypt_full_version(key_str): + + key_base64 = base64.b64encode(key_str.encode()) + f = Fernet(key_base64) + + try: + with open("keygenme.py", "w") as fout: + global full_version + global full_version_code + full_version_code = f.decrypt(full_version) + fout.write(full_version_code.decode()) + global arcane_loop_trial + arcane_loop_trial = False + global jump_into_full + jump_into_full = True + print("\nFull version written to 'keygenme.py'.\n\n"+ \ + "Exiting trial version...") + except FileExistsError: + sys.stderr.write("Full version of keygenme NOT written to disk, "+ \ + "ERROR: 'keygenme.py' file already exists.\n\n"+ \ + "ADVICE: If this existing file is not valid, "+ \ + "you may try deleting it and entering the "+ \ + "license key again. Good luck") + +def ui_flow(): + intro_trial() + while arcane_loop_trial: + menu_trial() + + + +# Encrypted blob of full version +full_version = \ +b""" +gAAAAABgT_nv3JrW2AMPOanzoOatT8tWrZSH9V2-H_-sY8RFTh1Vr9guvCw3iIUq7eVs4IhR2u6bI_HkJm6u5VK99vYIKXfthUYjQRMNmo6uMwqdK8ZYm3wH3Z2BlFNmGxMSXKmFhDQujSexuuMg5ZFIb5VhyZeUY4R9KubbghdUIlZ2hBeCpxef_ioNjM7VUKJEyJgxiAtPdMKSgT8y-FJsikUsw9Scbe8nH-bC856u_mqk6AKQnORLmxfsJykFMFm-wOh-unFnUvg9HiT6lYXCrFnXNEFEnq5djwM9H4iRXYwyO4XdHEqVcodEyE3HoPFOh24R9ATElafkxty16jECSabI7k608v6sk2Pxd-EAI0XEtjlVE5Qz-qdnoTIXEXXbwK8Bpw33JwRGJs-WduRmF2G5qVVAGONjaAc9CPXhawUkf2_sNMlnq6lqn7sBb2K7BiqW2Efc88pzfsOYvGQC94CBBhIUQTePRcZ_bUbsDLR8PrWlNQ28Vt6P45URpPDtxkUGQtixiQi9QlPThCFJs28XmApvRQQfJHdje45t2ELeVgn5YMi_FHQ98qgMudwXHXprigHAMmcB2rFPWWhAQn4sIrdL2In424RWO0qOhd9IJrU7DldcrmOMyvpHV87HzVgsRnI97Hn-jiVi_FemDWAsDGFwjaGbrxWUfr01ienDjlrXc-NC2x1Tt6jTHiFb2LbUqzGyjJ-m-5eCuqr1zh8_oCypnBB79XuKMGlngql0NQVEReZ9pDZd3Iax0TJVM55luvuCpjolarAJXz28Ynt5et1DHfnAQ1gQ4laW3ZtRL6TTp1vRpfllOURLpAxNrY03a7cMS5iIS7nXMgllh-uV9S1O3Ww4z_nPSh3q-1yKUilHfuXwdazGjBvfvwDSD3ZgvzgDmvQ-eCNV4I-oEHlAjqAiuwMvClU3Pr-mmBg257A8LHQlJJ7Rl6oYpW-B43esP6sQ2G66ofHbx4ZyUhqH5WC6jjoSuxyRFs6Z6wiNDztgkSdqbSc7iTxtF8oHBqPI_boBwr7YskpWmgwNFhWPzxGwyhMI2H38WGx1klLhNKsa4Ep9vcTuj_ltCL_QZkIgfgklf3QYGWBNLjIPBPkv1c0GqYMPkhnc4Libqdr8LXZJug2ry1s-H16d2U7_cjo9d8usNG2nNhUQvJ8d5I58r3IlioEUWjkUfWy4t3Aw8UN43iZ62MyzE7yzNIYMIwIxgB9qXmrFkh3pFnoZKlPHh7rjVBlbsIgPl64Ewi70P2AdkuDe7BXQ6kX4rdWm3i18ePWIX8n0WYz4eyGz41eRXU2hjyJeIz4Wi0rcjx39LS9BXWq4qHYnT3WNGzONy1ArEiNNiXYk61CyJiaCmFX2BZ5NL85O0ePD-bf7cn7KIWvTGqUoXIP-j1FAYvJy47myTITkurZ7YwEHIAk2sejWMltN-JeI6Jqu8nFKTl1h1sbNpCvAnJmSFczKN9fTJONndpK_PpPbUIilA1UHeqtsQfhNpyx1KK6xeFYyCa0V2sLDnHIHWREXMgcB99TUYSV0_DpbIvwQIaINt7cTDQWWvD7tyFXWltw7VqGAUCgtWYAOIoXj9ZxyOCwuIBHXGD8h8r_kBWx8GlN2Mn70ALuVpPWfR_Y55SHGy3KEUtgig92ms5758hdTQjbvb9wk9byAXvAwpltWQG86XlCIIZSM2vpDqpQ6l-8j_BBir_oXjjuaHQKEw3A3ISpLTP9ZKqcRuDAyeiNNNO_HuPK8hxNFzy7Zvu46tH3waLaPW_v_OivUOx7rP8YxocSv6ON_lwR4sRj3mvAk_WPbXpGQaRaNL813pp5aPzOkUAuod25H6esLw0Io7nCirZ3ZhPKfhtY0bakpTl2o5JJGe_2eEm_D6afBnhnkpEaJOsJhkPj7BXBZH9VJJlBWsHOV8WM3sgy1dBQjCP4C0ThSBhEUwq1mPIFKsvffKJgianCnk0fdmpFOLDJci9i5LDAB-sra6RM4y-HhV2gt3PSvyB_H0WDcdQhSZHVz6U_yNMucIW8-4YwdRwec6HGrNneiyIlacHlKO15PCwWBogndUApfLYrxKHHbxIU1sDybMlIEgBBu9_3gOStqXZu4zBDR93P-qYGz-0jrEHq3YVN9olBLx9yoOVI2AZ9m0PJwpKHYc2uZsciFy__dckefZ79zycUzeSKuKbhaZozQOvdLKwmtcB8y5n3_nwwN6-FQu9APoLqsZoaq3wT5QM6ax-_FS9XwzhqEunognjINxAXu660db73L710noV3CBT76aDY3hiV7fnYhQTfysI4SHQtnAzHXMbxYmNfbMnOALTAkQt7Yaiy_NGAr7jmNOAQwhHIW8eaOsCfhRPl7XjdM7pX2N4EM5cFAEphKWQ62f_3RhnyvaTDNmDXkde-_2FjfBMGirouVJL2rSA-icdD1pfkCKO7U0An5V7AUKuYDTZXTXE4DFWUIq4K36jFmHJ9fwllHoe1_A22RuP4DHm4o7TYEJIeo5UvaVc9Lfd6edWIn8KqDzhTz6TZLWlSbK_RnZlpCv3rdibpHzE-epOv1y5pDv08R8jWnVzHv0c3DgfJzWknRd-S5hIIOd5FEyCAx4NpOqYJjpD109ijZLzDMxuvml8QJmX2tplAp-5xGGiVAFPLse1Vo95f5Wsh8KXwnbNjFQSYf8AgskPp_2spP7rBpVvDrn6HJp7TvQY6mNZMXgLOWy8WHynKESedYkD7iQSHwZ5iMvJTVLDHjYbll0PZyI-Tsy7Q9ZP4ysdzkL5TwGwHa53UhUsiLQmhpkht4dKg3kqq-pA-f5PwKOWKCsKwtUyGFvz9gL7yDNNQwNpSaN2vBy5U8ulVA8SooM9SwmelNHOKvF2rmy6nOQ8mzt-vnnKqCTnc_4VgNakpw86IQVsw7VGQEGTNLD8ULL8bFkSlfICvDQKSLOPONExox17G4YuXFRpDCGoK3KLbM4oKQCi9QWPOL0jhovl0zu1j-XIY7IA2SX4C_Ie9MV27amQi7mwFHYpj3081isJOZd_cUxszijjqOFI71IBeHwSHj5wOnWRUHVLk-aOCT_rKKpae6mPyL0uJsIS1s0B62scEcn0wFa90pjuARSPhc35VCA9TFDcq6W0tAi4aNNzT-vgv4NkqfR6hh_jqs0irQZj7jtUh4OGbkaZljMovt7UYBKd9L4m5gmh1w672_Oif5pDU3YXMdc4FSp39f1wWDvHz0Uw7grUTlvLL3ge6f-Elxe2c0n56nWxs4qo4rqGY9c5BuIFxly_6iymzec33Yo8r0_L5VIRIoWl6lcZq-uIRdTl8mzbVDEoU7r1P6mvg3xUfKfF-Q-XnlfV23XNLSuIF3JF78DkjkNxdOP9dM4dCHbexa5yKeNqAan6Rq7LCnlxTGqP_lxpJO4GvU6npINZ1qjp9ydUveK-Ya7o6rfJqN1GbITvUdaMOFq00OfOsKdZXn7gB_I6el_O-YKJcx3W2X_im81FwT_8P-zW_jEdO-lmztiEyVEvUOFJJfAm-K_G4-HEYzROMPrgof708fnnxDaWGiUi0AtJeEk4sHvf2PTiE0517FcKadlELd_4R-eLKk9Wwu24faJ_R0Ej8NinIbeqCUTb0LkIKa5ChJbL4nXs9f019rUFewPDJhpVLy4nJywzVou9_7-DCMxUT3ld1PjfumXvAbYejzN4Ubue-yfBwPFe_U2YoLM-CyCPNXCbP8WKzCzzNwCcLf8OcQ6gbsyhi0Ul9urHnqWK93qVmPZLEVG9QBEmKPtN6FNWtNIomFiLnl6C9dwbSCWxUJWU_dP7tmVzundLgQhiZhgQz2T7ffSf1aNGSR5hklFayb-MyfOJm46EPx1hVVgqIcdxg7Ko4gt6rpjwAYRQ== +""" + + + +# Enter main loop +ui_flow() + +if jump_into_full: + exec(full_version_code) diff --git a/rev/keygenme_py/solve.py b/rev/keygenme_py/solve.py new file mode 100755 index 0000000..30b9598 --- /dev/null +++ b/rev/keygenme_py/solve.py @@ -0,0 +1,18 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p python3 + +import hashlib + +print("picoCTF{1n_7h3_|<3y_of_", end="") + +username_trial = b'MORTON' +print(hashlib.sha256(username_trial).hexdigest()[4], end="") +print(hashlib.sha256(username_trial).hexdigest()[5], end="") +print(hashlib.sha256(username_trial).hexdigest()[3], end="") +print(hashlib.sha256(username_trial).hexdigest()[6], end="") +print(hashlib.sha256(username_trial).hexdigest()[2], end="") +print(hashlib.sha256(username_trial).hexdigest()[7], end="") +print(hashlib.sha256(username_trial).hexdigest()[1], end="") +print(hashlib.sha256(username_trial).hexdigest()[8], end="") + +print("}") diff --git a/rev/transformation/enc b/rev/transformation/enc new file mode 100644 index 0000000..92a1129 --- /dev/null +++ b/rev/transformation/enc @@ -0,0 +1 @@ +灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸弰摤捤㤷慽 \ No newline at end of file diff --git a/rev/transformation/solve.py b/rev/transformation/solve.py new file mode 100755 index 0000000..be10810 --- /dev/null +++ b/rev/transformation/solve.py @@ -0,0 +1,19 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p python3 + +# enc = ''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)]) + +def decrypt(enc): + result = [] + for x in enc: + n = ord(x) + result.append(chr((n & 0xFF00) >> 8)) + result.append(chr(n & 0xFF)) + + return "".join(result) + +if __name__ == "__main__": + with open('enc') as file: + enc = file.read() + + print(decrypt(enc)) \ No newline at end of file