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?
quelle
Antworten:
Die Manpage für
time
erklärt das Konzept der freiwilligen und unfreiwilligen Kontextwechsel:(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
strace
kö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.quelle