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}Mis à jour
Ce contenu vous a-t-il été utile ?