⭐Échauffement
404CTF{l_ech4uff3m3nt_3st_t3rm1ne}
Catégorie: Reverse Difficulté: introduction Flag: -
Challenge
Description
Un bon échauffement permet non seulement d'éviter des blessures, mais aussi de conditionner son corps et son esprit au combat qui va suivre. Ce crackme devrait constituer un exercice adéquat.
Décompilation
Dans le main
, on nous demande un mot de passe, puis la fonction secret_func_dont_look_here
est appelée avec celui-ci.
int main() {
int fail;
char password [0x40];
puts("Vous ne devinerez jamais le mot de passe secret ! Mais allez-y, essayez..");
// Récupération du mot de passe
fgets(password, 0x40, stdin);
// Vérification
fail = secret_func_dont_look_here(password);
if (fail == 0) {
puts("Wow, impressionnant ! Vous avez réussi !");
}
else {
puts("C'est bien ce que je pensais, vous ne connaissez pas le mot de passe..");
}
return 0;
}
La fonction secret_func_dont_look_here
fait une vérification caractère par caractère sur notre mot de passe. L'équation pour chacun est caractère * 2 - 1 = secret_caractère
int secret_func_dont_look_here(char *password) {
size_t size;
int fail;
int i;
size = strlen(secret_data);
fail = 0;
for (i = 0; i < (int)size; i = i + 1) {
if ((char)(password[i] * 2 - i) != secret_data[i]) {
fail = 1;
}
}
return fail;
}
Résolution
Il suffit donc de récupérer les valeurs de secret_data
et résoudre l'équation. On a donc :
password[i] = (secret_data[i] + 1) / 2
def solve():
data = b'\x68\x5f\x66\x83\xa4\x87\xf0\xd1\xb6\xc1\xbc\xc5\x5c\xdd\xbe\xbd\x56\xc9\x54\xc9\xd4\xa9\x50\xcf\xd0\xa5\xce\x4b\xc8\xbd\x44\xbd\xaa\xd9'
print(''.join([chr((data[i] + i) // 2) for i in range(len(data))]))
if __name__ == '__main__':
solve()
Dernière mise à jour
Cet article vous a-t-il été utile ?