[RoLUG] Intro e definizione di stack

Roccatello Eduard rolug@lists.linux.it
Sat, 8 Feb 2003 18:17:19 +0100


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

INTRODUZIONE
Una delle vulnerabilit=E0 pi=F9 diffuse nei programmi =E8 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, =E8 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 =E8 una struttura dati astratta (ADT) molto utilizzata nelle
archittetture informatiche odierne.
Per struttura dati astratta si intende un modello di struttura in grado d=
i
immagazzinare i dati e di compiere operazioni sui dati inseriti.
Uno stack pu=F2 essere rappresentato come una pila di oggetti, vincolata =
dal
fatto che la rimozione e l'aggiunta degli elementi pu=F2 essere fatta sol=
o in
cima. Si pu=F2 parlare quindi di una struttura LIFO (Last In First Out), =
dove
il primo elemento ad entrare nello stack =E8 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 =E8 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=F9 in alto nella pila senza levarlo =
dalla
stessa. Le prestazioni di uno stack sono ottimali; ogni operazione
effettuabile ha prestazioni asintotiche O(1), cio=E8 il numero di element=
i
contenuti non influenza minimamente le prestazioni ottenibili, che dipend=
ono
invece dal tipo di implementazione effettuato dagli sviluppatori.
La creazione di una struttura dati come lo stack deriva dalla necessit=E0=
 di
avere un'architettura pi=F9 consona possibile ai linguaggi di programmazi=
one
ad alto livello (molto pi=F9 simili al linguaggio parlato che al linguagg=
io
adottato dalla macchina). Non =E8 difficile trovare implementazioni di st=
ack
nelle moderne apparecchiature. Lo stack si presta infatti agevolmente al=20
passaggio degli argomenti di una funzione e all'archiviazione di dati
sequenziali LIFO come la sospensione dei metodi in un programma ed =E8 la
struttura utilizzata dalle archittetture i386 per la gestione delle=20
variabili
in memoria durante l'esecuzione di un programma.

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