CrackMe3

Catégorie: Reverse Difficulté: - Flag: CTFREI{3z_a3s_d3crypt10n}

Challenge

Description


Sauras-tu réussir à retrouver le flag de ce challenge ?

Il est conseillé de faire les challenges d'introduction de crypto avant de faire ce challenge

Solution

On commence par décompiler avec Ghidra puis direction la fonction main. Dedans on observe plusieurs choses, notamment :

Ligne 60, on trouve cipher = EVP_aes_128_ecb();, le binaire utilise donc de l'AES avec une clé de 128 bits (16 octets) en mode ECB (donc pas d'IV).

Si l'on regarde la description de la fonction EVP_DecryptInit_ex, on voit que &local_58 correspond à la clé.

On sait que la clé fait 16 octets, donc elle correspond à tout ce qui est surligné.

Ici, on voit que l'on décode tout ce qui est en jaune depuis la base64.

Pas besoin d'aller plus loin, on connaît la clé, les données déchiffrées, plus qu'à cook un script :

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from base64 import b64decode

key = 0x6562616265666163.to_bytes(8, 'little')
key += 0x6562616265666163.to_bytes(8, 'little')
print(f'{key=}')

data = 0x464e386332326c56.to_bytes(8, 'little')
data += 0x2b7949466a4c6a35.to_bytes(8, 'little')
data += 0x7872337268617331.to_bytes(8, 'little')
data += 0x753067624d.to_bytes(5, 'little')
data += 0x564e58.to_bytes(3, 'little')
data += 0x4568346567.to_bytes(5, 'little')
data += 0x3d34584a6e4b75.to_bytes(7, 'little')
print(f'{data=}')
ciphertext = b64decode(data)

cipher = AES.new(key, AES.MODE_ECB)
flag = unpad(cipher.decrypt(ciphertext), AES.block_size).decode()
print(flag)
# key=b'cafebabecafebabe'
# data=b'Vl22c8NF5jLjFIy+1sahr3rxMbg0uXNVge4hEuKnJX4='
# CTFREI{3z_a3s_d3crypt10n}

Dernière mise à jour

Cet article vous a-t-il été utile ?