Principe:
Avancer l'heure de sa machine pour connaître le mot de passe 'aléatoire' d'accès au challenge à venir, puis utiliser ce mot de passe sur le serveur lorsque l'heure du serveur correspond à celle modifiée
On lance le binaire pour voir ce qu'il en est: il nous demande un pseudo et un mot de passe
On essaie une longue entrée, qui se fait tronquer: peut-être a-t-on un buffer overflow?
edb
On lance alors edb et on recommence
En avançant dans l'exécution, on trouve un "Monsieur Dupont":
aurait-on déjà trouvé le login?
Ne voulant pas relancer le programme, je force directement le RIP pour ignorer le JMP
et aller à Bonjour Monsieur Dupont
On me demande un mot de passe, j'entre mon IOC, j'avance et je vois qu'elle est comparée à une chaine
qui ressemble à un mot de passe (RDI)
Rand et time
En reprenant l'exécution, je m'aperçois qu'à un endroit, on trouve des caractères, du time
et du srandom
J'infère alors que les caractères constituent un alphabet des possibles, et que le time
sert à initialiser le srandom qui est la définition de la seed pour des appels à rand.
La conséquence? Si je trouve quelle est cette seed sur le serveur, je suis capable de reproduire
les valeurs rand générées et de connaitre le mot de passe
Tricher avec l'horloge
Je décide alors de changer l'heure de mon PC, de lancer le binaire, et de regarder, dans la mémoire,
quel est le mot de passe
Je remets l'heure normale, et j'utilise alors ce mot de passe en boucle sur ma machine, toutes les 800ms.
Dès qu'il est à nouveau 23:00:00, le mot de passe marche!
Exploit
Je refais pareil, cette fois avec le serveur (et avec 23:38:00 puisque le temps a passé)
Une fois l'heure passée, je regarde dans les réponses du serveur et je trouve le flag:
404CTF{13_10UP_D3V0r3_14_H411384rD3}
Je ne sais pas si cette méthode était celle attendue,
puisqu'elle me semble plus proche du reverse que de l'exploitation de binaire.
Il me semble qu'un ret2libc était attendu. Mais tant pis!