Descrivere l’attacco “Man in The Middle” applicato alla firma elettronica
Con attacco Man In The Middle si intende che tra due utenti che comunicano si interpone un terzo utente, con cattive intenzioni. Immaginiamo che tali utenti siano A e B. E supponiamo che A firma digitalmente (con la sua chiave privata) dei dati da inviare a B. C, l'attaccante si interpone nella comunicazione e ottiene il dato cifrato da A con la chiave privata di A, C lo decifra (essendo la chiave pubblica di B nota) e modifica il messaggio. Fatto ciò firma il messaggio con la sua chiave privata e lo invia a B. Nel frattempo C, deve convincere con l'inganno, B che la chiave pubblica di A è la sua (di C), se B cade nell'inganno, utilizza la chiave pubblica di C per verificare la firma considerando autentica un firma contraffatta da C. A questo tipo di attacco si può porre rimedio cifrando il messaggio e la firma con la chiave pubblica del destinatario, o utilizzando un HMAC (firmato) per il messaggio.
Il sequence number utilizzato in IPSEC serve per contare:
A) i byte al fine di eliminare pacchetti ripetuti
==B) i pacchetti al fine di eliminare pacchetti ripetuti ==
C) le connessioni TCP al fine di bloccare collegamenti pericolosi
D) i byte al fine di ritrasmettere pacchetti persi
E) i pacchetti al fine di ritrasmettere pacchetti persi
F) le connessioni TCP al fine di riaprire connessioni interrotte
Il cifrario noto come ‘one time pad’:
A) è un cifrario asimmetrico completamente sicuro
B) usa chiavi asimmetriche della stessa lunghezza
C) usa chiavi asimmetriche lunghe quanto il testo da cifrare
==D) usa chiavi simmetriche lunghe quanto il testo da cifrare ==
E) usa chiavi simmetriche di qualsiasi lunghezza e da utilizzarsi una volta sola
Descrivere il funzionamento delle chiamate di funzione, con riferimento all’architettura IA32
Le chiamate di funzione avvengono con l'allocazione dei cosiddetti frame di chiamata all'interno dello stack. Prima che una funzione venga chiamata vengono posizionati sullo stack i parametri che si vogliono passare alla funzione, poi si salva il valore dell'indirizzo di ritorno e infine si salva il vecchio valore del frame pointer. A questo punto il frame pointer si fa puntare al valore corrente dello stack pointer.
Prologo:
push ebp # salvataggio frame pointer
mov ebp, esp # spostamento frame pointer all'inizio del frame
sub esp, n # per allocare spazio nello stack
asm
Epilogo:
mv esp, ebp
pop ebp
ret
asm
Fare un esempio di codice vulnerabile rispetto ad attacchi di buffer overflow e spiegare il funzionamento dell’attacco riferito a quello specifico esempio di codice, per l’architettura IA32.
Un esempio potrebbe essere:
int auth(){
char[10] secret;
gets(secret); // funzione vulnerabile
if(secret == "topsecret0"){
loginOK();
return 0;
}else return -1;
}
void loginOK(){
printf("Login succeded");
}
int main(){
auth();
}
C
In questo codice il main
chiama la funzione auth()
, la funzione auth()
alloca un buffer che deve essere riempito dall'utente. All'utente viene lasciata la possibilità di riempire il buffer quanto vuole. L'utente, quind, può riempire il buffer per accedere ad altre aree di memoria dello stack.
L'attaccante potrebbe accedere alla funzione loginOK
modificando l'indirizzo di ritorno e inserendo l'indirizzo della funzione loginOK
.
Discutere il paradosso del compleanno, generalizzato per un anno di N giorni e per un gruppo di K persone.
Il paradosso del compleanno è un risultato probabilistico che suggerisce che per avere una probabilità maggiore del 50% affinché vi siano due persone che abbiano la stessa data di nascita in un certo gruppo di
Generalizziamo il problema, diciamo di avere un anno di
Chiamiamo
Abbiamo: