Mot de passe? (Reverse) - 404CTF2022

Principe:
Décompiler une class Java pour récupérer un mot de passe chiffré, et le déchiffrer (ce mot de passe étant le flag)

Infos (cf menu latéral):
🚩 Flaggué! +100 points gagnés — 💾 Téléchargez les fichiers du challenge
404CTF{C3_sYst3mE_es7_5ecUrisE}

Le challenge

Le challenge nous donne un programme Java et nous demande de retrouver son mot de passe

Décompilation

On va décompiler le code Java via n'importe quel décompilateur en ligne

Dans un scénario réel, n'utilisez pas de décompilateur en ligne car le programme peut être confidentiel ou contenir des données sensibles!

// // Decompiled by Procyon v0.5.36 // package chall; import java.util.Scanner; public class Mdp { public static void main(final String[] array) { final String s = "4/2@PAu<+ViNgg%^5NS`#J\u001fNK<XNW(_"; final Scanner scanner = new Scanner(System.in); System.out.print("Mot de passe Admin:"); if (s.equals(hide(scanner.nextLine()))) { System.out.println("Bienvenue Admin"); } else { System.out.println("Au revoir non admin"); } } static String hide(final String s) { String s2 = ""; for (char index = '\0'; index < s.length(); ++index) { s2 = invokedynamic(makeConcatWithConstants:(Ljava/lang/String;C)Ljava/lang/String;, s2, (char)((char)(s.charAt(index) - index) % '\u0080')); } return s2; } }
On constate que le programme contient un mot de passe chiffré: 4/2@PAu<+ViNgg%^5NS`#J\u001fNK<XNW(_
Au vu du code, on reconstitue le mot de passe en inversant la ligne du "hide": celle-ci se lit s2[i] = (s[i] - i) % 0x80 et donc s[i] = s2[i] + i + K*0x80

On notera que le "hide" contient un caractère non-ASCII: `\x1f` (ou `\u001f`). C'est la raison pour laquelle un `strings Mdp.class` ne revenverra pas le mot de passe, mais deux moitiés 4/2@PAu<+ViNgg%^5NS`#J et `NK<XNW(_`. Ce caractère m'avait aussi posé quelques difficultés dans le code décompilé, mais je ne me souviens pas précisément desquelles (donc, rien d'insurmontable)

Flag: 404CTF{C3_sYst3mE_es7_5ecUrisE}