Was genau sind „freiwillige Kontextwechsel“?

34

Ich habe eine Binärdatei und soll das Passwort knacken (Hausaufgaben). Es wurde auch eine Funktion angegeben (eine Funktion, die Teil der Binärdatei ist). Diese Funktion hat gezeigt, dass die Eingabezeichenfolge Zeichen für Zeichen mit dem korrekten Kennwort verglichen und sofort false zurückgegeben wurde, wenn ein Zeichen falsch war (dies ist vermutlich nicht sicher, da die Zeit abläuft und wir eine Vorstellung von der korrekten Kennwortlänge als haben Beispiel). Aber unser Lehrer hat einen zufälligen Timer hinzugefügt, der das Ergebnis (Richtig / Falsch) zurückgibt, um es für uns etwas schwieriger zu machen ...

Jedenfalls habe ich es schon erfolgreich mit Reverse Engineering gemacht und das richtige Passwort bekommen. Jetzt spiele ich damit in der Kommandozeile:

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

Mit diesem Befehl erhalte ich viele Informationen wie Systemzeit, Auslagerungen, Ausführungszeit. Am interessantesten für mich sind jedoch "Freiwillige Kontextwechsel", da je korrekter die Zeichen des von mir eingegebenen Kennworts sind, desto weniger "Freiwillige Kontextwechsel" " Ich bekomme!

Je mehr falsche Zeichen ich eingebe, desto mehr "Freiwillige Kontextwechsel" bekomme ich.

Ich habe fast zwei Stunden gebraucht, um das Passwort zu knacken, indem ich diesen Befehl eingegeben, Zeichen eingegeben und "Freiwillige Kontextwechsel" beobachtet habe. Immer wenn EIN Zeichen korrekt war, wurde der Wert für "Freiwillige Kontextwechsel" um eins verringert.

Meine Frage, was genau sind "Voluntary Context Switches" und warum haben sie mir geholfen, das Passwort zu knacken?

cnmesr
quelle
5
Wir gratulieren Ihnen, dass Sie das reiche und noch nicht vollständig verstandene Feld der Seitenkanalangriffe für sich entdeckt haben .
zwol
1
@zwol Was meinst du mit "reich"? Und außerdem sind wir derzeit mit Seitenkanalangriffe in der Klasse zu tun, mich entschuldigen , dass ich nicht haben „vollständig verstanden“ sein Feld so schnell ....
cnmesr
15
@cnmesr Ich nahm es als aufrichtigen Kommentar, nicht als sarkastischen, und sagte, dass Zwol das Gebiet für interessant hält, da immer noch neue Entdeckungen gemacht werden. Es ist nicht so, dass du es nicht vollständig verstanden hast , es ist so, dass niemand es vollständig versteht, und das macht es interessant.
HDV
3
@hvd cnmesr Ja, das habe ich gemeint.
zwol
@zwol Oh sorry dann! Ich habe dich falsch interpretiert und es als Angriff gesehen: p
cnmesr

Antworten:

36

Die Manpage fürtime erklärt das Konzept der freiwilligen und unfreiwilligen Kontextwechsel:

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.

(Zitat stammt aus meinem Debian-System, die verlinkte Manpage hat einen etwas anderen Text)

Das heißt, ein Kontextwechsel ist freiwillig, wenn der Prozess die CPU verlässt, weil er nichts anderes zu tun hat (während darauf gewartet wird, dass etwas externes passiert). Unfreiwillig, wenn die Berechnung fortgesetzt werden soll, das Betriebssystem jedoch entscheidet, dass es an der Zeit ist, auf einen anderen Prozess umzuschalten.


In welchem ​​Zusammenhang dies mit dem Kennwortprüfprogramm steht, hängt davon ab, was das Programm tatsächlich tut.

Aus dem in den Kommentaren verknüpften Quellcode geht hervor, dass das Programm usleep()für jedes nicht übereinstimmende Zeichen einmal aufruft und die Vergleichsschleife für das nächste Zeichen anschließend fortsetzt. Der Ruhezustand ist so freiwillig, wie es die CPU jemals geben wird. Daher werden diese Aufrufe als freiwillige Kontextwechsel für jedes Nicht-Maching-Zeichen angezeigt.

Unter Linux sollten Sie die Aufrufe auch mit sehen stracekönnen.

Die endgültige Verzögerung ergibt sich aus einem zufälligen Schlaf T * (rand() % 3), dh aus dem 0-, 1- oder 2-fachen einer Konstanten. Das ist eine ziemlich grobe Granularität, daher sollte es einfach sein, den Durchschnitt zu ermitteln, indem Sie mehrere Versuche mit demselben Kennwort ausführen.

ilkkachu
quelle
3
Hier ist der Quellcode der Funktion, die ich oben erwähnt habe pastebin.com/iTzheD4u Vielen Dank. Ich werde mir die Aufrufe mit strace ansehen und hoffentlich weitere Informationen erhalten. Über den Zufallstimer: Wenn das Passwort eine falsche Länge hat, ist die Ausgabezeit dieselbe (sehr, sehr schnell) und der Zufallstimer wird nicht ausgeführt. Wenn die Kennwortlänge korrekt ist, erfolgt die Ausgabe zufällig, da der Zufallstimer ausgeführt wird.
Cnmesr
@cnmesr, oh, das ist großartig!
ilkkachu