J'ai un fichier binaire et je suis censé déchiffrer son mot de passe (devoirs). Il y avait aussi une fonction donnée (une fonction qui fait partie du fichier binaire). Cette fonction a montré que la chaîne d'entrée a été comparée avec le mot de passe correct, caractère par caractère, et a renvoyé la valeur false instantanément lorsqu'un caractère était erroné (ce n'est pas une manière sûre de le faire, je suppose, car le temps nous est compté et nous avons une idée de la longueur correcte du mot de passe. Exemple). Mais notre professeur a ajouté une minuterie aléatoire qui renvoie le résultat (Correct / Wrong) pour le rendre un peu plus difficile pour nous ...
Quoi qu'il en soit, j'ai déjà réussi le reverse engineering et obtenu le mot de passe correct. Maintenant, je joue avec cela dans la ligne de commande:
/usr/bin/time -v ./program_name enter_password
Avec cette commande, je reçois beaucoup d’informations telles que l’heure système, les swaps, le temps d’exécution… Mais ce qui m’intéresse le plus, c’est "Changements de contexte volontaires" car plus le mot de passe saisi est correct, moins "Changements de contexte volontaires". " Je reçois!
Plus le nombre de caractères erronés que je saisis est grand, plus je reçois de "changements de contexte volontaires".
Il m'a fallu près de deux heures pour déchiffrer le mot de passe simplement en entrant cette commande, en entrant des caractères et en observant "Changements de contexte volontaires". Quand UN caractère était correct, les "Changements de contexte volontaires" diminuaient de un.
Ma question, que sont exactement les "changements de contexte volontaires" et pourquoi m'ont-ils aidé à déchiffrer le mot de passe?
la source
Réponses:
La page de manuel pour
time
expliquer le concept de changements de contexte volontaires et involontaires:(la citation provient de mon système Debian, la page de manuel liée contient un texte légèrement différent)
C'est-à-dire qu'un changement de contexte est volontaire si le processus quitte le processeur car il n'a rien d'autre à faire (en attendant qu'un événement externe se produise). Involuntary, s'il souhaite poursuivre certains calculs, mais le système d'exploitation décide qu'il est temps de passer à un autre processus.
La manière dont cela est lié au programme de vérification du mot de passe dépend de ce que le programme fait réellement.
À partir du code source lié dans les commentaires, nous voyons que le programme appelle
usleep()
une fois pour chaque caractère qui ne correspond pas, poursuivant ensuite la boucle de comparaison sur le caractère suivant. La mise en sommeil est à peu près aussi volontaire que le rendement obtenu par le processeur, de sorte que ces appels apparaîtront comme des commutateurs de contexte volontaires pour chaque caractère non machiste.Sous Linux, vous devriez pouvoir voir les appels avec
strace
.Le dernier délai provient d'un sommeil randomisé de
T * (rand() % 3)
0, 1 ou 2 fois une constante. C'est une granularité plutôt grossière, il devrait donc être facile de faire la moyenne en faisant plusieurs tentatives avec le même mot de passe.la source