[RoLUG] Intro e definizione di stack

Matteo Canato rolug@lists.linux.it
Sat, 8 Feb 2003 21:54:22 +0100


'azz eduard sei un mostro! non ho mai letto niente di più chiaro sullo stack
(altro che gli appunti della coppia bellini/melon)!

bello anche il paper sulla crittografia!

----- Original Message -----
From: "Roccatello Eduard" <eduard@box.it>
To: <rolug@lists.linux.it>
Sent: Saturday, February 08, 2003 6:17 PM
Subject: [RoLUG] Intro e definizione di stack


Sto continuando la scrittura del paper sui buffer overflow e diciamo che
avanza piuttosto bene anche se un po' lentamente (mi sono ammalato e per
quasi 4 giorni non ho mai acceso il pc :-( )
queste parti credo siano finite (salvo minimi ritocchi lessicali) e spero di
averle scritte nel modo più semplice possibile

INTRODUZIONE
Una delle vulnerabilità più diffuse nei programmi è sicuramente il buffer
overflow, che detiene il primato insieme a format string bug.
Usata da tempo dagli hacker per verificare la sicurezza dei sistemi
informatici, è stata illustrata pubblicamente da AlephOne nel numero 49
della famosissima rivista elettronica underground Phrack (raggiungibile
all'indirizzo http://www.phrack.org).
Consiste essenzialmente nell'esecuzione arbitraria di codice malizioso e
sfrutta il mancato controllo sulle dimensioni dei buffer da memorizzare
nelle variabili di un programma.

DEFINIZIONE DI STACK
Lo stack è una struttura dati astratta (ADT) molto utilizzata nelle
archittetture informatiche odierne.
Per struttura dati astratta si intende un modello di struttura in grado di
immagazzinare i dati e di compiere operazioni sui dati inseriti.
Uno stack può essere rappresentato come una pila di oggetti, vincolata dal
fatto che la rimozione e l'aggiunta degli elementi può essere fatta solo in
cima. Si può parlare quindi di una struttura LIFO (Last In First Out), dove
il primo elemento ad entrare nello stack è anche il primo ad uscire.
I metodi principali definibili di uno stack sono 3: PUSH, POP e TOP (dove
per metodo si intende una funzione eseguibile dallo stack).
PUSH è il metodo standard per l'aggiunta degli oggetti allo stack, POP serve
a leggere ed a togliere l'elemento in cima allo stack mentre TOP esegue
solamente la lettura dell'oggetto più in alto nella pila senza levarlo dalla
stessa. Le prestazioni di uno stack sono ottimali; ogni operazione
effettuabile ha prestazioni asintotiche O(1), cioè il numero di elementi
contenuti non influenza minimamente le prestazioni ottenibili, che dipendono
invece dal tipo di implementazione effettuato dagli sviluppatori.
La creazione di una struttura dati come lo stack deriva dalla necessità di
avere un'architettura più consona possibile ai linguaggi di programmazione
ad alto livello (molto più simili al linguaggio parlato che al linguaggio
adottato dalla macchina). Non è difficile trovare implementazioni di stack
nelle moderne apparecchiature. Lo stack si presta infatti agevolmente al
passaggio degli argomenti di una funzione e all'archiviazione di dati
sequenziali LIFO come la sospensione dei metodi in un programma ed è la
struttura utilizzata dalle archittetture i386 per la gestione delle
variabili
in memoria durante l'esecuzione di un programma.

--
Roccatello Eduard
RoLUG member @ http://rovigo.linux.it
Webmaster @ http://www.pcimprover.it

--
Mailing list info: http://lists.linux.it/listinfo/rolug