Ho letto molti articoli su funzioni non sicure come strcpy, memcpy, ecc. Che possono causare problemi di sicurezza durante l'elaborazione di dati esterni, come il contenuto di un file o dati provenienti da socket. Questo può sembrare stupido, ma ho scritto un programma vulnerabile ma non sono riuscito a "hackerarlo".Esempio di overflow del buffer che porta a una perdita di sicurezza
Capisco il problema dell'overflow del buffer. Prendete questo codice di esempio:
int main() {
char buffer[1];
int var = 0;
scan("%s", &buffer);
printf("var = 0x%x\n", var);
return 0;
}
Quando eseguo il programma e digitare "ABCDE", i risultati del programma 0x65646362 che è "edcb" in esadecimale + little-endian. Tuttavia ho letto che è possibile modificare il valore eip che è stato inserito nello stack per fare in modo che il programma esegua del codice indesiderato (ad es. Prima di una chiamata alla funzione system()).
Tuttavia assemblaggio della funzione inizia così:
push %ebp
mov %ebp, %esp
and $0xfffffff0, %esp
sub $0x20, %esp
Poiché il valore del% è esp casuale all'inizio della funzione e per questo "e", non sembra esserci alcun modo affidabile per scrivere un valore preciso nel valore di eip spinto.
Inoltre, ho letto che era possibile eseguire il codice che hai scritto nel buffer (qui il buffer è lungo solo 1 byte, ma in realtà sarebbe abbastanza grande per memorizzare del codice) ma quale valore daresti eip per farlo (considerando la posizione del buffer è casuale)?
Quindi perché gli sviluppatori sono così preoccupati per problemi di sicurezza (tranne che il programma potrebbe bloccarsi)? Avete un esempio di un programma vulnerabile e come "hackerarlo" per eseguire codice indesiderato? Ho provato questo su Linux, Windows è meno sicuro?
Correggimi se ho torto ma, per quanto seminale, non mi ricordo di questo articolo che riguarda i meccanismi di protezione dello stack. – torak
@torak: No, non lo è. Non credo che questo sia il problema dell'OP, e la domanda sembra più basilare che affrontare le salvaguardie dell'OS/hardware. Questo articolo è un ottimo punto di partenza. –
@Moron: Beh, dato che l'OP ha specificamente menzionato che l'istruzione 'e $ 0xfffffff0,% esp' rende l'offset alla variabile EIP, sembrerebbe che afferrino il meccanismo di overflow di base. – torak