2013-07-19 5 views
6

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?

+2

Das muss entweder ein Tippfehler sein, oder das Buch ist irgendwie nutzlos, da es um * nicht optimierten * Code geht. –

+1

@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

+1

"Korrigiert" wie in "wie es nach dem Patch aussieht ... –

Antwort

7

Es ist deine Schuld, nicht Kris. Dies ist nicht „sichere Version des Benutzervalidierungscode“, aber dies ist der Code, der von einem Hacker eingeführt nach der Korrektur erhalten wird

Zitat in Russisch aus diesem Buch:

На языке Си исправленная программа будет выглядеть так:

Google übersetzen:

C Sprache modifizierte (oder gepatcht) Programm werden wie folgt aussehen:

+0

Danke. Jetzt bekomme ich es. Kris schrieb' die korrigierte Version des Programms in C ist: ... '. Und ich fehlinterpretierte das Wort' korrigiert "...Ich dachte immer, dass "korrigiert" "sicher" bedeutet. – Kolyunya

+0

Mit * nicht bearbeitet * Google Übersetzung kann nur als letztes Mittel für einen armen Programmierer entschuldigt werden. – SChepurin

+0

@Shepurin. Du hast recht. Mein Ziel war es, zu zeigen, dass Kolyunya den Text des Buches nicht sorgfältig liest. Das war ein Zitat aus einem Buch auf Russisch nur für ihn. Ich habe Google Translate zur politischen Korrektheit hinzugefügt. Ich denke diese Frage und die Antwort ist für niemanden interessant, sondern nur für Kolyunya. Sorry für die schlechte Qualität Übersetzer Google. – SergV

1

Der Autor die Art von „gleichwertig“ Code in C, die unbedingten Sprung darstellen würde (JMP continue) ersetzt Original-Passwort Check zeigen wollte, mit JZ continue. Sie haben Recht, dass dieser Code (in C) keinen Sinn hat, aber es ist nur dazu da, um zu illustrieren, was der Hacker getan hat.