Que sont exactement les «changements de contexte volontaires»?

34

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?

cnmesr
la source
5
Félicitations pour avoir découvert par vous-même le domaine des attaques latérales riches et encore mal comprises .
dimanche
1
@zwol Qu'entendez-vous par "riche"? Et en plus, nous traitons actuellement avec des attaques par canaux secondaires en classe, excusez-moi, je n’ai pas "pleinement compris" son champ aussi rapidement ...
cnmesr
15
@cnmesr Je l'ai considéré comme un commentaire sincère et non sarcastique, affirmant que zwol considérait le domaine comme intéressant car de nouvelles découvertes sont encore en cours. Ce n'est pas que vous ne l'ayez pas bien compris, mais que personne ne le comprend vraiment , et c'est ce qui le rend intéressant.
hvd
3
@hvd cnmesr Oui, c'est ce que je voulais dire.
dimanche
@zwol Oh désolé alors! Je vous ai mal interprété et j'ai vu cela comme une attaque: p
cnmesr

Réponses:

36

La page de manuel pourtime expliquer le concept de changements de contexte volontaires et involontaires:

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 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.

ilkkachu
la source
3
Voici le code source de la fonction que j'ai mentionnée ci-dessus pastebin.com/iTzheD4u Merci, je vais jeter un coup d'œil sur les appels avec strace et j'espère obtenir davantage d'informations. À propos du minuteur aléatoire: Si le mot de passe a une longueur incorrecte, le temps de sortie est identique (très très rapide) et le minuteur aléatoire n’est pas exécuté. Si la longueur du mot de passe est correcte, la sortie est aléatoire car une minuterie aléatoire est exécutée.
cnmesr
@ cnmesr, oh, c'est excellent!
ilkkachu