Organizzazione della memoria virtuale di un processo in informatica

Organizzazione della memoria virtuale di un processo in informatica

La struttura della memoria virtuale del processo è suddivisa in più segmenti, i quali identificano delle aree di memoria dedicate ognuna ad un particolare scopo. Tra le principali informazioni relative ad un processo che possiamo trovare in memoria durante la sua esecuzione abbiamo:

  • il codice del programma stesso
  • variabili d’ambiente
  • variabili statiche
  • variabili globali
  • stack
  • heap
  • librerie dinamiche

Prendendo come riferimento l’architettura IA-32 ed entrando maggiormente nel dettaglio possiamo identificare i seguenti segmenti.

  1. Text contiene le istruzioni vere e proprie, il codice che viene effettivamente eseguito dalla CPU. Questo segmento è accessibile in sola lettura, ogni tentativo di scrittura in questa sezione causa la terminazione del processo. Data contiene i dati globali e statici, ovvero tutte le dichiarazioni di variabili globali o statiche che vengono immediatamente inizializzate. Es: static int foo=0;
  2. BSS acronimo di block started by symbol; questa sezione contiene tutte le variabili globali o statiche non inizializzate.
  3. Heap in questa parte della memoria vengono inserite le aree di memoria
    allocate dinamicamente (per esempio tramite funzioni quali: malloc, realloc, calloc).
  4. Stack in questa parte della memoria di processo vengono inserite variabili locali e dinamiche, oltre ai parametri di funzione ed alle informazioni di controllo. Bisogna notare che lo stack parte da indirizzi alti e cresce verso indirizzi minori, mentre lo heap cresce in direzione contraria.
  5. Memory Mapping in questa parte dello spazio di indirizzamento vengono inserite le librerie dinamiche utilizzate dal processo ed i file mappati in memoria tramite chiamate ad mmap().

Organizzazione della memoria virtuale di un processo in informatica

Come funziona l’allocazione dinamica della memoria in informatica

Il meccanismo di allocazione dinamica della memoria permette di allocare esplicitamente blocchi di memoria di dimensione arbitraria in un’area dedicata, detta heap (con delle ovvie limitazioni di dimensione massima che variano a seconda dell’implementazione dell’allocatore di memoria). Tale meccanismo permette di risolvere alcune problematiche legate alla gestione della memoria che non possono essere gestite in modo adeguato tramite l’allocazione statica o automatica della memoria. La memoria allocata staticamente persiste per l’intera vita del programma ma deve essere dimensionata al momento della compilazione. Il meccanismo di allocazione automatica della memoria rappresenta il modo in cui viene gestita l’allocazione delle variabili locali. Esse vengono infatti allocate al momento in cui il flusso di esecuzione raggiunge lo scope delle variabili locali stesse, ad esempio al momento dell’esecuzione della funzione in cui esse sono visibili. Quando il flusso di esecuzione lascia lo scope di tali variabili esse vengono deallocate. Dunque non è possibile controllare contemporaneamente la visibilità e la dimensione delle variabili senza sfruttare il meccanismo di allocazione dinamica della memoria. Il programmatore ha quindi la possibilità di allocare un’area di memoria, utilizzarla per poi liberarla, rendendola di nuovo disponibile per altre operazioni di allocazione dinamica. Di solito una libreria di sistema mappata nello spazio di indirizzamento del processo si incarica di gestire le operazioni di allocazione e di deallocazione della memoria.

Come lo stack, anche lo heap contiene anche informazioni di gestione insieme ai dati stessi. Come risultato abbiamo che gli attacchi di buffer overflow sullo heap hanno lo stesso principio di base dei buffer overflow sullo stack, ovvero sovrascrivere informazioni di gestione specifiche per deviare il flusso di esecuzione del programma con l’obiettivo di eseguire codice arbitrario. Le modalitàa con cui la vulnerabilità viene sfruttata, come vedremo, sono significativamente diverse.

Pubblicato da Vito Lavecchia

Lavecchia Vito Ingegnere Informatico (Politecnico di Bari) Email: [email protected] Sito Web: https://vitolavecchia.altervista.org

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *