web-dev-qa-db-fra.com

Que sont exactement les «changements de contexte volontaires»?

J'ai un fichier binaire et je suis censé casser 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 était comparée au bon mot de passe caractère par caractère et retournée fausse instantanément lorsqu'un caractère était incorrect (ce n'est pas un moyen sûr de le faire, je suppose parce que le temps s'écoule et nous avons une idée de la longueur correcte du mot de passe comme 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, je l'ai déjà fait avec succès avec l'ingénierie inverse et obtenu le mot de passe correct. Maintenant je joue avec dans la ligne de commande:

/usr/bin/time -v ./program_name enter_password

Avec cette commande, j'obtiens beaucoup d'informations telles que l'heure système, les swaps, le temps d'exécution .. Mais ce qui est le plus intéressant pour moi, c'est "les changements de contexte volontaires" car plus les caractères du mot de passe que j'entre sont corrects, moins les "changements de contexte volontaires" " Je reçois!

Plus je sais de mauvais caractères, 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 les "changements de contexte volontaires". Chaque fois qu'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?

34
cnmesr

La page de manuel pour time explique le concept de changement de contexte volontaire et involontaire:

The resource specifiers [...] are:
   c      Number of times the process was context-switched involuntarily
          (because the time slice expired).
   w      Number of times that the program was context-switched voluntarily, 
          for instance while waiting for an I/O operation to complete.

(la citation provient de mon système Debian, la page de manuel liée a un texte légèrement différent)

Autrement dit, un changement de contexte est volontaire, si le processus quitte le CPU car il n'a rien d'autre à faire (en attendant que quelque chose d'extérieur se produise). Involontaire, s'il souhaite poursuivre certains calculs, mais le système d'exploitation décide qu'il est temps de passer à un autre processus.


La façon dont tout cela est lié au programme de vérification des mots de passe dépend de ce que fait réellement le programme.

Du code source lié dans les commentaires, nous voyons que le programme appelle usleep() une fois pour chaque caractère non correspondant, poursuivant ensuite la boucle de comparaison sur le caractère suivant. Le sommeil est à peu près aussi volontaire que le rendement du CPU, donc ces appels s'afficheront comme des changements de contexte volontaires pour chaque caractère non-maching.

Sous Linux, vous devriez également pouvoir voir les appels avec strace.

Le retard final provient d'un sommeil aléatoire de T * (Rand() % 3), c'est-à-dire 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.

36
ilkkachu