Table des matières
Nous avons une binaire ELF 64 bits appelée vault qui demande un mot de passe pour afficher un flag sous la forme ECSC{}
.
L’objectif est de récupérer le flag sans bruteforce, en exploitant la logique interne du programme.
Analyse Initiale
Nous utilisons Ghidra pour analyser la fonction main()
et la validation du mot de passe.
- Le programme affiche
"=-=-=-= Very secure vault =-=-=-="
et demande un mot de passe. - Il appelle une fonction
check_char()
pour valider chaque caractère. - Si tous les caractères sont valides ET que la somme des valeurs ASCII (
local_9c
) ==0xb0b
(2827 en décimal), alors le flag est affiché.
Analyse de check_char()
bool check_char(int param_1, byte param_2) {
return (int)(char)password[(param_1 + 10U) % 0x28] == (uint)param_2;
}
La fonction vérifie si param_2 (le caractère entré) correspond au caractère attendu dans password:
[(param_1 + 10) % 40]
Nous trouvons le mot de passe stocké en mémoire :
b87de397e1346bc605be4ed8361a68a3d9748fc9
Nous exploitons maintenant le vault
password = "b87de397e1346bc605be4ed8361a68a3d9748fc9" # Extrait de l'ELF
flag = [''] * 40 # Placeholder pour les caractères du flag
checksum = 0 # Somme des caractères
# Reconstruction du flag en inversant check_char()
for i in range(40):
flag[(i - 10) % 40] = password[i]
checksum += ord(password[i])
# Vérification de la somme des caractères
if checksum == 0xb0b:
print(f"Flag extrait : ECSC{{{''.join(flag)}}}")
else:
print("Erreur : problème de checksum")
$ python3 script.py
Flag extrait : ECSC{346bc605be4ed8361a68a3d9748fc9b87de397e1}