Ich las eine book [rus] (Entschuldigung, ich kann im Moment keine englische Version finden) geschrieben von Kris Kaspersky die Philosophie und Techniken der Software-Sicherheit zu erklären.Benötigen Sie eine Erklärung für eine bestimmte Sicherheitsoptimierung?
Es gibt ein Beispiel in dem Buch. Darin heißt es, dass der Code:
if (! IsValidUser())
{
Message("Invalid user! Abroting...");
Abort;
}
völlig unsicher ist, weil es in dieser übersetzt wird:
CALL IsValidUser
OR AX,AX
JZ continue
^^^^^^^^^^^^^
PUSH offset str_invalid_user
CALL Message
CALL Abort
continue: ; normal program execution
...........
So kann das Programm, indem nur ein Byte in einem Disassembler gehackt werden. Wenn wir JZ continue
zu JMP continue
ändern, wird die Überprüfung nicht korrekt ausgeführt.
Dann Kris schreibt:
die korrigierte Version des Programms in C:
IsValidUser();
if (!true)
{
Message("Invalid user! Aborting...");
Abort;
}
In dieser Version ist der {...}
Abschnitt wird nie eine Kontrolle geraten.
Ich verstehe nicht wirklich, wie die korrigierte Version funktionieren soll. Warum benutzt er einen if-statement
, der nie ausgeführt wird, kann also sogar von einem Compiler entfernt werden?
Ist es ein Tippfehler oder ein Fehler? Oder ich bekomme nichts?
Das muss entweder ein Tippfehler sein, oder das Buch ist irgendwie nutzlos, da es um * nicht optimierten * Code geht. –
@CodyGray Ich habe es versäumt, zu interpretieren, was "die korrigierte Version des Programms" eigentlich bedeutet. Tatsächlich war es nur ein schnelles Beispiel dafür, wie ein Code, der sicher zu sein scheint, in der Tat völlig unsicher sein kann. Jedenfalls ist es immer nützlich zu wissen, auf welche Weise Ihr Programm gehackt werden kann. – Kolyunya
"Korrigiert" wie in "wie es nach dem Patch aussieht ... –