Temi


Debolezze


  1. Il binario /opt/protostar/bin/stack0 non controlla la dimensione dell’input → Non fidarti dell’input

🐲 Strategia di attacco


1. Analisi codice sorgente

Analizzando il codice sorgente possiamo notare che l’applicazione legge un input da tastiera e lo usa per riempire un buffer da 64 byte. La lettura e riempimento avviene tramite la funzione di libreria gets() che non controlla che la dimensione dell’input sia contenuta in quella del buffer.

Essendo la variabile buffer definita dopo modified, dovrebbe trovarsi in cima allo stack, con un indirizzo più basso. Se il buffer viene ecceduto, si va a sforare nella regione di memoria di modified.

→ Non ho capito bene, vedere meglio anche cosa cambia da 32 a 64 bit.

2. Sfruttamento della debolezza

Debolezza: Nessun check per il buffer overflow.

Se si prova ad inserire 65 caratteri a che occupano 1 byte in UTF-8, si sfora e si modifica la variabile modified.

👼 Mitigazione debolezze


Mitigazione #1

Binario stack0 non controlla la dimensione dell’input

Il binario /opt/protostar/bin/stack0 riempie un buffer con una stringa in input tramite la funzione gets() che non controlla la dimensione dell’input.

Per evitare ciò, basta sostituirla con la funzione fgets(), che limita la dimensione dell’input:

fgets(buffer, 64, stdin);

Per compilare il nuovo codice si usano alcune opzioni particolari, che spengono le protezioni del compilatore contro il buffer overflow:

gcc -fno-stack-protector -z execstack -o stack0-fgets stack0-fgets.c

Si modificano poi i privilegi sul file eseguibile:

chown root:root /path/to/stack0-fgets
chmod 4755 /path/to/stack0-fgets