2013-07-19 13 views
6

Stavo leggendo un book [rus] (Mi dispiace, non riesco a trovare una versione inglese al momento) scritto da Kris Kaspersky che spiega la filosofia e le tecniche di sicurezza del software.Ho bisogno di una spiegazione di un particolare ottimizzazione della sicurezza

C'è un esempio nel libro. Si precisa che il codice:

if (! IsValidUser()) 
{ 
    Message("Invalid user! Abroting..."); 
    Abort; 
} 

è totalmente insicuro perché viene tradotta in questo:

 CALL IsValidUser 
     OR AX,AX 
     JZ continue 
     ^^^^^^^^^^^^^ 
     PUSH offset str_invalid_user 
     CALL Message 
     CALL Abort 
continue:    ; normal program execution 
     ........... 

Così il programma può essere violato modificando solo un byte in un disassembler. Se cambiamo lo JZ continue in JMP continue il controllo non verrebbe eseguito correttamente.

Poi Kris scrive:

la versione corretta del programma in C è:

IsValidUser(); 
if (!true) 
{ 
    Message("Invalid user! Aborting..."); 
    Abort; 
} 

In questa versione la sezione {...} non potrà mai ottenere un controllo.

Non ho davvero capito come dovrebbe funzionare la versione corretta. Perché usa un if-statement che non verrà mai eseguito, quindi può essere rimosso anche da un compilatore?

È un errore o un errore? O non sto ottenendo qualcosa?

+2

Questo deve essere un errore di battitura o il libro è un po 'inutile poiché parla di codice * non ottimizzato *. –

+1

@CodyGray ero io che non sono riuscito a interpretare cosa significa in realtà "la versione corretta del programma". In realtà è stato solo un rapido esempio di come un codice che sembra essere sicuro possa essere totalmente insicuro in effetti. Ad ogni modo conoscere i potenziali modi in cui il tuo programma può essere violato è sempre utile. – Kolyunya

+1

"Corretto" come in "il modo in cui appare dopo il patch ... –

risposta

7

È colpa tua, non di Kris. Questo non è "versione sicura del codice di validazione utente", ma questo è il codice che si ottiene dopo la correzione introdotta da un hacker

Citazione in russo da questo libro:

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

Google translate:

linguaggio C modificato (o patch) programma cercherà come questo:

+0

Grazie. Ora ho capito." Kris ha scritto "la versione corretta del programma in C è: ...". E ho interpretato erroneamente la parola " corrected' ...Ero solito pensare che "corretto" significasse "sicuro". – Kolyunya

+0

Uso * non modificato * La traduzione di Google può essere scusata solo come ultima risorsa per un programmatore scadente. – SChepurin

+0

@SChepurin. Hai ragione. Il mio obiettivo era mostrare che Kolyunya non legge attentamente il testo del libro. Quella era una citazione da un libro in russo solo per lui. Ho aggiunto Google Translate alla correttezza politica. Penso che questa domanda e la risposta non siano interessanti per nessuno, ma solo per Kolyunya. Ci scusiamo per il traduttore di cattiva qualità Google. – SergV

1

L'autore ha voluto mostrare il tipo di codice "equivalente" in C che rappresentasse salto incondizionato (JMP continue) che sostituisce assegno password originale con JZ continue. Hai ragione che questo codice (in C) non ha senso, ma è lì solo per illustrare ciò che l'hacker ha fatto.

Problemi correlati