Lezione 1: Introduzione e Memory Layout
Cos'è un Buffer Overflow
Un buffer overflow si verifica quando un programma scrive più dati in un buffer di quanto questo possa contenere, sovrascrivendo la memoria adiacente. Questo può alterare il flusso di esecuzione, corrompere dati o consentire l'esecuzione di codice arbitrario.
Layout di Memoria di un Processo
Comprendere la memoria di un processo è essenziale. La memoria è divisa in segmenti:
- Text (code): codice eseguibile del programma (sola lettura).
- Data: variabili globali e statiche (inizializzate e non).
- Heap: memoria dinamica (allocazione a runtime, malloc/new).
- Stack: memoria per variabili locali, argomenti di funzioni, indirizzi di ritorno (LIFO).
In x86 (32-bit) lo stack cresce verso indirizzi inferiori. Ogni stack frame contiene:
- Indirizzo di ritorno (RET)
- Frame pointer (EBP)
- Variabili locali
- Argomenti della funzione
Esempio Pratico in C
Consideriamo un programma vulnerabile:
#include <stdio.h>
#include <string.h>
void vulnerable() {
char buffer[64];
strcpy(buffer, getenv("INPUT")); // pericoloso: nessun controllo sulla lunghezza
printf("Echo: %s\n", buffer);
}
int main() {
vulnerable();
return 0;
}
Se la variabile d'ambiente INPUT contiene più di 64 byte, strcpy continuerà a scrivere oltre il buffer, corrompendo il proved di base (EBP) e l'indirizzo di ritorno (EIP) sulla funzione vulnerable.
Controllo del Registro EIP
L'obiettivo dello sfruttamento è proprio sovrascrivere l'indirizzo di ritorno per reindirizzare l'esecuzione a un nostro codice (shellcode). Il classico approccio ("smashing the stack") prevede:
- Determinare l'offset esatto per raggiungere il RET.
- Iniettare uno NOP sled (istruzioni No-Operation) per facilitare il salto.
- Seguire il payload con lo shellcode.
- Sovrascrivere il RET con un indirizzo all'interno del NOP sled.
Riferimenti Storici
L'articolo The Tao of Buffer Overflow di DilDog (cDc, fine anni '90) è considerato una pietra miliare. Spiega come sfruttare buffer overflow su Windows usando DLL di sistema, e includeva esempi di exploit di soli 112 byte con IP offuscato via XOR. Ancora oggi è un riferimento per l'hacking etico.
Esercizio
Compilare il programma con gcc -m32 -fno-stack-protector -z execstack -no-pie -o vuln vuln.c. Usare GDB per trovare l'offset e verificare la corruzione di EIP. Il laboratorio pratico della Lezione 5 approfondirà l'exploit completo.
Questa lezione è introduttiva. Nelle prossime sessioni vedremo come costruire lo shellcode, come superare le protezioni moderne e analizzare casi reali.