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 ?