Sei sulla pagina 1di 11

Tutorial #2 : Introduzione a OllyDbg

Prima di continuare a leggere.


La traduzione e la revisione di questi tutorial mi hanno portato via molto tempo. Mi farebbe dunque
molto piacere sapere cosa voi lettori pensiate del risultato finale. Siete liberi di esprimere giudizi,
opinioni, pareri, critiche e consigli al seguente link https://it.surveymonkey.com/r/RM5FVGK. Si
tratta di un piccolo sondaggio che mi sar utile per capire se valga davvero la pena di continuare
questa serie. Detto questo non mi rimane che augurarvi una buona lettura!

Cos Olly Debugger?


Il suo creatore, Oleh Yuschuk , lo defin in questo modo:
OllyDbg is an 32-bit assembler level analysing debugger for Microsoft Windows. Emphasis on
binary code analysis makes it particularly useful in cases where source is unavailable. (ovvero,
"OllyDbg un debugger per l'analisi a livello di assembly per Microsoft Windows. E' basato
sull'analisi del codice binario e diviene particolarmente utile nel caso in cui il codice sorgente non
fosse disponibile.")
Olly inoltre un debugger "dinamico", il che significa che permette all'utente di cambiare alcuni
parametri mentre il programma in esecuzione; il che molto importante quando si sta
manipolando un file binario, cercando di capirne il funzionamento. Olly ha un sacco di
caratteristiche interessanti, per questo motivo probabilmente il debugger pi usato per il reverse
engineering (almeno per la modalit "ring 3", che approfondiremo pi avanti)

Una panoramica
In seguito riportata l'immagine della schermata principale di Olly, suddivisa nelle varie sezioni:

Schermata principale di olly


Olly si avvia con la finestra "CPU" aperta: proprio qui che presente la maggiorparte del
contenuto del file analizzato. Per chiuderla sufficiente cliccare sull'icona contrassegnata dalla
lettera "C" nella barra del men. La finestra suddivisa in quattro sezioni principali: disassembly,
registri, stack e dump. In seguito verranno descritte una ad una.

1. Disassembly
Questa finestra contiene il codice disassemblato del file binario e le sue informazioni, come gli
"opcodes" (di cui parleremo presto) e le istruzioni in assembly. La prima colonna riporta l'indirizzo
(nella memoria) dell'istruzione, la seconda contiene il cosidetto "opcode" a cui viene associato
almeno una istruzione (alcune ne hanno pi di uno). Questa l'unica informazione che la CPU pu
leggere ed elaborare, infatti costituisce il "linguaggio macchina" ovvero il linguaggio del computer.
Se provate ad analizzare il contenuto di un file binario usando, ad esempio, un editor esadecimale,
potete notare che contiene proprio questi opcode e nient'altro. Una delle principali operazioni di
Olly quella di disassemblare il "linguaggio macchina", ovvero trasformare gli opcode in assembly,
rendendo pi "umana" la loro lettura e interpretazione. La terza colonna contiene, appunto, il
linguaggio assembly. Per coloro che non sono abituati a vedere questo tipo di codice, la sua lettura
potrebbe apparire comunque poco amichevole, ma presto imparerai che lavorare con l'assembly
molto pi facile rispetto a lavorare con gli opcode.
L'ultima colonna invece contiene il commento di Olly riguardo l'istruzione; spesso contiene il nome
delle chiamate API (Application Programming Interface,
https://it.m.wikipedia.org/wiki/Application_programming_interface), come ad esempio

"CreateWindow" e "GetDlgItemX". Olly inoltre prova ad aiutarci a capire il codice dando un nome
alle chiamate che non sono parte delle API come, nel caso del seguente screen,
"ImageRed.00510C84 e ImageRed.00510BF4. Potrebbero apparire poco utili ma Olly ci
permette di rinominarli con nomenclature pi adatte. Si posso anche inserire i propri commenti in
questa colonna; basta fare doppio clic sulla riga e un pops up si aprir consentendovi di inserire il
vostro commento. Questi ultimi verranno poi automaticamente salvati per la volta successiva.

2. I Registri
Ogni CPU ha in s una raccolta di registri. Si potrebbero definire come delle speciali variabili
utilizzate dal processore per salvare alcune piccole quantit di informazione. In seguito riportata
l'immagine della finestra dei registri, suddivisa nelle varie sezioni:

Nel primo "settore" in alto vengono definiti i registri principali; Nel caso i registri vengano
modificati, cambieranno colore dal nero al rosso (ci rende veramente facile trovare i contenuti
modificati). Per modificarne il contenuto, sufficiente cliccarci due volte. Questi registri hanno
molteplici utilit, ma torneremo a parlarne dopo.
Il settore intermedio dedicato alle "flags", anche queste delle particolari variabili utilizzate dalla
CPU per "segnalare" alcuni particolari eventi (due numeri sono uguali, un numero maggiore di
un'altro, ecc). Il doppio click su di esse ne cambia il valore. Le flags hanno sempre un ruolo
importante nell'attivit di reversing.
Infine l'ultimo settore riguarda i FPU, ovvero i registri "Floating Point Unit". Questi vengono presi
in considerazione ogni volta che la CPU effettua dei calcoli matematici con numeri decimali e per
questo motivo vengono raramente usati dai reverser, se non durante l'analisi di cifrari.

3. Lo Stack

Lo "stack" una parte della memoria riservata al file binario per memorizzare delle informazioni
temporanee. Quest'ultime comprendono i puntatori agli indirizzi di memoria, le stringhe, i marcatori
(markers) e i pi importanti nel nostro caso, gli indirizzi di ritorno quando il codice chiama una
funzione. Quando un metodo (o funzione) di un programma chiama un'altro metodo, il controllo
deve dunque essere spostato a questo nuovo metodo in modo che possa ritornare. La CPU deve
memorizzare dove questo nuovo metodo stato chiamato cosicch quando questo termina,
l'esecuzione del programma riprende da dove il metodo stato chiamato. In conclusione, lo stack
quella porzione di memoria dove la CPU pu trovare gli indirizzi di ritorno.
Un'altra cosa da sapere sullo stack riguarda la sua struttura chiamata "LIFO" (First In, Last Out).
Una metafora comunemente usata per descrivere questa caratteristica la pila di piatti: quando
aggiungi (push) un piatto nella cima, tutti i piatti scalano di una posizione verso il basso; quando
invece rimuovi (pop) un piatto sempre dalla cima, tutti gli altri piatti si alzano di un livello.
Vedremo tutto questo in azione nel prossimo tutorial quindi non preoccupatevi se tutto ci pu
sembrarvi un po' confuso.
Nell'immagine soprastante, la prima colonna rappresenta l'indirizzo di ogni dato inserito nello stack,
la seconda colonna riservata alla rappresentazione in esadecimale 32-bit del dato e l'ultima invece
riporta l'eventuale commento di Olly; ad esempio, nel primo risultato il commento "RETURN to
kernel..." che indica l'indirizzo che verr letto dalla CPU quando il metodo corrente avr terminato
la sua esecuzione per ritornare alla posizione prima del "salto" alla funzione.
In Olly possibile premere il tasto destro del mouse sullo stack e scegliere modify per
modificarne il contenuto.

4. Il Dump

Prima, quando abbiamo parlato degli "opcode" che la CPU legge all'interno di un binario, avevo
anticipato che possibile "vedere" direttamente gli opcode attraverso un editor esadecimale. Beh,
con Olly quest'ultimo non necessario. La finestra del "dump" proprio un editor esadecimale
integrato che permette la visualizzazione del contenuto del binario con l'unica differenza che questo
tipo di informazione salvata nella memoria, non nel disco. Di solito viene rappresentata in due
modalit: esadecimale e ASCII, rispettivamente la seconda e terza colonna dell'immagine
soprastante (nella prima colonna invece riportato l'indirizzo di memoria dove "contenuto" il
dato). Olly inoltre consente la modifica del dump ed quello che vedremo pi avanti in un tutorial.

La barra degli strumenti


Purtroppo, la barra degli strumenti di Olly lascia un po 'a desiderare (questo dovuto al fatto che il
creatore non madrelingua inglese) Ho marcato le icone in modo da aiutarvi:

Questi sono i principali comandi per eseguire codice. Tenete presente che, soprattutto quando
iniziate a utilizzare Olly, tutti questi pulsanti sono accessibili anche dal menu a discesa "Debug" ,
quindi se non sapete qualcosa, potete usarlo come punto di riferimento.
Far un paio di osservazioni su alcune icone. Re-load sostanzialmente ci permette di riavviare
l'applicazione e metterla in pausa in corrispondenza dell'entry point. Tutte le patch (vedi pi avanti)
saranno rimosse, alcuni breakpoints disabilitati, e l'applicazione non eseguir alcun codice, beh,
almeno nella maggior parte dei casi. Run e Pause fanno proprio questo. Step In significa che
verr eseguita soltanto una riga di codice e poi il programma andr in pausa, richiama una chiamata
di funzione nel caso fosse presente. Step Over [F]fa la stessa cosa, ma passa al di sopra di una
chiamata a un'altra funzione. Animate proprio come Step In e Over fatta eccezione per il fatto
che lo f in modo lento, permettendovi di sbirciare[F]. Probabilmente non lo utilizzerete spesso, ma

a volte divertente guardare il codice scorrere, soprattutto se si tratta di un binario polimorfico


dov' possibile osservare il mutarsi del codice. Forse per mi sto spingendo un po troppo avanti
La parte successiva sono le (ancora pi criptiche) icone di Windows:

Ognuna di queste icone apre una finestra, alcune le utilizzeremo spesso, altre invece un po piu
raramente. Dal momento che che le lettere utilizzate non sono tra le pi intuitive, potreste anche
fare come ho fatto io e iniziare a fare clic su ogni bottone finch trovate quello che vi serve.Sappiate
comunque che ogni bottone accessibile anche dal menu View ,questo potrebbe aiutarvi a
comprendere meglio le lettere a cui sono associati. Adesso per voglio esaminare insieme a voi
alcune delle finestre pi comuni :

1. (M)emory

La finestra della memoria permette la visualizzazione di tutti i blocchi di memoria che il


programma ha allocato. Questa includele sezioni principali dell'applicazione in esecuzione (in
questo caso, le voci "Showstri" nella colonna Owner. Potete vedere un sacco di altre sezioni in
basso alla lista; queste sono DLL che il programma ha caricato in memoria e ha intenzione di
utilizzare. Se fate doppio clic su una di queste linee, si aprir una finestra che mostra il disassembly
(o esadecimale) di tale sezione. Questa finestra mostra inoltre anche il tipo di blocco, i diritti di
accesso, la dimensione e l'indirizzo di memoria in cui viene caricata la sezione.

2. (P)atches

Questa finestra visualizza tutte le "patch" fatte, in altre parole, qualsiasi modifica al codice originale
che avete realizzato. Da notare che lo stato impostato come attivo; se si ri-carica l' applicazione
(facendo clic sull'icona re-load) queste patch saranno disabilitate(e andranno perse).Al fine di
riattivare (o disattivarle) sufficiente fare clic sulla patch desiderata e premere la barra spaziatrice.
Questo vi permetter di impostare a vostro piacimento lo stato della patch su on oppure off. Inoltre
nelle colonne Old e New verranno mostrate le istruzioni originali, e quelle modificate.

3. (B)reakpoints

Questa finestra mostra dove sono impostati tutti i breakpoints in uso. Farete amicizia molto presto
con questa finestra

3. (K)all Stack
(Accidenti, proprio non riesco a capire come mai i principanti facciano cos tanta fatica a ricordare
queste icone ...)

Questa finestra diversa dallo "stack" che abbiamo visto in precedenza. Mostra molte pi
informazioni sulle chiamate compiute nel codice, i valori inviati a queste funzioni, e tanto altro
ancora.Vedremo qualcosa in pi a breve.
* Nel prossimo tutorial metter a disposizione la mia versione di Olly con molti 'aggiornamenti',
alcuni dei quali vi permetteranno di avere dei pulsanti che finalmente potrete capire. Ecco una foto
*

Il menu contestuale
Per l'ultimo elemento di questo tutorial, ho voluto farvi conoscere rapidamente il menu del tasto
destro in Olly. Da qui possibile eseguire moltissime azioni, e proprio per questo vi consiglio di
familiarizzare con tutti i comandi messi a disposizione da questo menu. Facendo clic sul tasto
destro del mouse in qualsiasi punto della sezione disassembly vi apparir questo:

Per ora mi limiter a ripercorrere gli elementi pi popolari. Man mano che acquisite esperienza,
finirete per sfruttare anche le opzioni meno utilizzate.
Binary consente la modifica dei dati binari byte per byte. Da qui per esempio, possibile
modificare una stringa sotterrata nel binario da "Unregistered" a "Registered" . Breakpoint
consente di impostare un punto di interruzione nel codice. Ci sono diversi tipi di breakpoints, ma li
andremo ad analizzare nel prossimo tutorial. Search For un sottomenu piuttosto grande , dov'
possibile cercare dati come stringhe,chiamate di funzione etc all'interno di un binario. Analysis
forza Olly a ri-analizzare la sezione di codice che si sta visualizzando. A volte Olly si confonde tra
la visualizzazione del codice o dei dati (ricordate che entrambi sono solo numeri)questo costringe
Olly a considerare dove siete nel codice e a tentare di indovinare a cosa questa sezione dovrebbe
appartenere.

Ricordate inoltre che il mio menu avr un aspetto diverso dal vostro, in quanto ho installato alcuni
plugin e aggiunto alcune funzionalit. Ma non preoccupatevi, torneremo su questo argomento nei
prossimi tutorial.

-Alla prossima.

R4ndom

Traduzione a cura di Gmarksa e MadJack. Link al Tut originale :


http://octopuslabs.io/legend/blog/archives/31.html