[Hacktoday Final 2022] – Crash the Hash

attachment: chall.py

#!/usr/bin/python3
from hashlib import md5
from string import ascii_uppercase as ALLCHAR
from random import seed, choices
from time import time
from math import floor


seed(floor(time()))
SECRET = “”.join(choices(ALLCHAR, k=4)).encode()
FLAG = open(“flag.txt”, “r”).read()


def show_menu():
    print(
        “””
Select menu:
[1] Play.
[2] Get secret.
[3] Exit”””
    )


def get_digest(msg):
    return md5(msg).hexdigest()


def get_secret():
    return get_digest(SECRET)


def ask_string(n):
    print(f”Please enter string {n}”)
    string = input(“> “)
    string = bytes.fromhex(string)
    if string[:4] == SECRET:
        return string
    return False


def get_flag():
    print(“\n# Enter two different strings.”)
    s1 = ask_string(“string 1”)
    s2 = ask_string(“string 2”)
    if not s1 or not s2:
        return “Wrong secret.”
    if s1 == s2:
        return “Crash!”
    if get_digest(s1) != get_digest(s2):
        return “Something went wrong (?)”
    return FLAG


def main():
    print(“Welcome to Crash of Hash!”)
    print(“Crash of Hash is a fun game that can makes you smash your brain.”)
    print(
        “The game is simple, to get the flag, you have to give us two different strings (in hex) with the same md5 hash.”
    )
    print(“Psst… To be honest, it’s not that simple.”)
    while True:
        show_menu()
        op = input(“> “)
        if op == “1”:
            print(f”# {get_flag()}”)
        elif op == “2”:
            print(f”# Here is our secret : {get_secret()}”)
        elif op == “3”:
            break
        else:
            print(“\n# Please enter the number from the menu.”)
    print(“\n# Thank you for playing.”)
    return 0


if __name__ == “__main__”:
    main()

Inti dari soal ini adalah kita harus meng-input 2 buah string dengan hash md5 yang sama, dan syaratnya adalah string tersebut diawali oleh “secret” yang dengan panjang 4 karakter yang ditentukan secara random.

Solusinya adalah kita bisa menggunakan tools bernama fastcoll (https://github.com/brimstone/fastcoll), sebuah tools md5 collision generator dengan fungsi yang serupa dengan yang diminta pada soal, meng-generate hash collision dengan prefix.

Jadi pertama, kita ambil dulu nilai hash secretnya di option 2

Setelah itu, kita cari secretnya dengan bantuan crackstation.net. Alasan kami mendehashnya dengan cara ini adalah karena length secret yang cukup pendek sehingga crackstation pasti menyimpannya.

Setelah didapat bahwa secretnya adalah CWQY, kita masukkan secret tersebut ke dalam file yang diberi nama “input”. Setelah itu, kita gunakan fastcoll dengan command 

docker run –rm -it -v $PWD:/work -w /work -u $UID:$GID brimstone/fastcoll –prefixfile input -o msg1.bin msg2.bin

Hasilnya, diperolehlah 2 buah file: msg1.bin dan msg2.bin yang isinya berbeda namun memiliki hash yang sama dengan prefix “CWQY”.

Msg1.bin:

Msg2.bin:

Dengan begitu, kita tinggal mengubah file-file ini menjadi hexadecimal lalu meng-inputnya di challenge.

Flag = hacktoday{md5_hash_c0llis1on_1s_rilll_8723e329}

Leave a Reply

Your email address will not be published. Required fields are marked *