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?
Questo deve essere un errore di battitura o il libro è un po 'inutile poiché parla di codice * non ottimizzato *. –
@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
"Corretto" come in "il modo in cui appare dopo il patch ... –