LOA Hacklab - Corso di ASM/reversing/secure C by Lidl&&Mala - 0001/1010 ----------------------------------------------------------------------- "I padroni, quelli che comandano, possono portarci via ogni genere di cose. Con le loro dannate leggi e fabbriche e tribunali e banche... Possono modellare il mondo a loro piacimento, possono portarti via la casa e i parenti e perfino il lavoro che fai... Ma non potranno mai portarti via quello che SAI, vero? Quello non possono portartelo via." W. Gibson, B. Sterling: "La macchina della realta'" ============================================================================= COS'E' IL REVERSING? ============================================================================= Il reversing, in termini molto astratti, non e' altro che l'applicazione pratica di un processo deduttivo. In questi termini, e' possibile ricondurre a una sola definizione pratiche comuni della vita di ogni giorno e, allo stesso tempo, tecniche informatiche che a un primo sguardo possono apparire quasi esoteriche. Il concetto su cui si basa il reversing, secondo questa particolare definizione, e' che ogni cosa funziona secondo un meccanismo: una volta compreso questo meccanismo, siamo liberi di utilizzarlo al meglio o, eventualmente, di modificarlo per piegarlo al nostro volere. A dir la verità cio' che voi utilizzate per reversare, in generale, ogni aspetto della realta' non e' vera e propria deduzione: il suo nome in realta' e' INFERENZA e la deduzione ne e' solo un aspetto. I meccanismi di inferenza che possiamo riscontrare sono quelli di - inferenza deduttiva (deduzione): partendo da una serie di premesse, la deduzione mi garantisce la correttezza della conclusione se tutte le premesse sono vere; ad esempio, partendo sempre dallo stesso stato della macchina le stesse righe di codice producono gli stessi risultati; - inferenza abduttiva (abduzione): la conclusione che traggo da una serie di premesse e' ragionevole, ma non garantita; essa non si fonda unicamente su basi scientifiche, ma ha comunque un fondamento di verità: ad esempio, se i valori passati a una funzione (dal nome ignoto) sono l'id utente e il numero seriale, potete abdurre il fatto che la funzione verificherà la correttezza del numero seriale associato all'id; - inferenza induttiva (induzione): quando in diversi casi noto che a certe premesse corrispondono sempre le stesse conclusioni, per induzione posso dare per scontato che anche i fenomeni futuri si comportino allo stesso modo; anche l'induzione non mi garantisce la correttezza della conclusione, anzi si fonda su basi completamente empiriche; un esempio potrebbe essere il seguente: se dall'analisi di una serie di programmi creati dallo stesso programmatore riscontro la presenza della stessa protezione, posso supporre che anche il prossimo programma conterra' lo stesso algoritmo. Probabilmente nel momento in cui darete la prima occhiata a queste righe io saro' davanti a voi, e immagino gia' di vedere i vostri occhi sgranati e l'espressione in viso che fa trapelare la domanda: "Ma questo qua e' un malato di mente?". Beh, dei due vostri insegnanti il malato in effetti sono io, come potete notare anche dal nick... ma alla fine come alternativa chi avete? Little, che, come dice il soprannome, e' piccolo :) Questo mi porta a introdurvi la prima lezione del corso: non giudicate dal nick, ma da quello che c'e' dietro. Se metterete in pratica questo insegnamento, vi accorgerete che in realta' Little e' un grande e io... beh, sono l'eccezione che conferma la regola. Sempre a proposito di nomi e' forse opportuno chiarire alcune ambiguita' che si presentano quando si parla di hacking, cracking e reverse engineering: il reversing e' semplicemente una tecnica che puo' essere applicata per vari scopi, piu' o meno leciti e più o meno legati alle correnti di pensiero dell'hacking e del cracking; gli individui possono essere buoni o cattivi, il reversing e' solo uno strumento nelle loro mani. E nessuno si azzardi a dire che sono cattivo... ============================================================================= SOFTWARE REVERSING ============================================================================= Il tipo di reversing che tratteremo all'interno di questo corso sara' per la maggior parte orientato al software. Questo, tuttavia, non significa che ci limiteremo solamente a esempi di questo tipo: la nostra intenzione (alla fine ci direte se ce l'abbiamo fatta) e' quella di spaziare fra argomenti diversi e, per quanto riguarda il campo informatico, fra sistemi operativi e linguaggi differenti. Se la cosa vi spaventa non preoccupatevi: se da una parte e' vero che qualche conoscenza tecnica non potra' che semplificarvi la vita, dall'altra cercheremo di impostare il corso in modo da dare a tutti le basi necessarie per comprendere quello che spiegheremo nelle lezioni piu' avanzate. In particolare, le prime giornate saranno dedicate alla macchina con cui lavoriamo... nulla di complicatissimo, almeno per quanto riguarda la parte che interessa a noi: abbiamo una CPU che elabora le istruzioni, una memoria all'interno della quale e' memorizzato praticamente TUTTO (cioe' i dati e, allo stesso tempo, le istruzioni stesse dei programmi) e una serie di dispositivi di input/output (due esempi banali? La tastiera per l'input e il monitor per l'output). In realta', come vedrete nella seconda lezione, le informazioni oltre che in memoria possono essere salvate anche all'interno di REGISTRI: potete immaginare queste entita' come delle locazioni di memoria, caratterizzate pero' da un nome e da un tempo di accesso piu' breve (in quanto essi, fisicamente, si trovano all'interno della CPU). Le istruzioni salvate all'interno della memoria sono scritte tutte nello stesso linguaggio, chiamato Assembly. Come mai, allora, esistono cosi' tanti linguaggi di programmazione, se poi tutto viene convertito in ASM? Beh, diciamo che l'ASM non si distingue per semplicita', mentre i linguaggi a un livello di astrazione piu' alto vengono privilegiati nelle applicazioni per le quali il tempo di sviluppo sia piu' importante dell'efficienza. Tuttavia, tenete presente che non importa il linguaggio con cui il vostro programma e' stato scritto: se gira sul vostro computer vuol dire che alla fine, in un modo o nell'altro, e' stato tradotto in ASM. "In un modo o nell'altro" e' stato scritto intenzionalmente: non tutti i linguaggi, infatti, vengono tradotti direttamente in assembly. Ve ne sono alcuni, come ad esempio Perl, che vengono "interpretati", cioe' letti ed eseguiti da un programma (che a sua volta e' compilato in ASM); altri, come Java, sono compilati in un formato chiamato "bytecode", che non e' altro che un particolare assembly fatto per girare sulla Virtual Machine (la quale, a sua volta, e' compilata in ASM). Senza dilungarci oltre, quello che mi preme farvi notare e' che QUALSIASI programma giri sul vostro PC, non lavorera' mai a un livello piu' basso dell'ASM: questo e' il motivo per cui tale linguaggio ha, per il reversing, una cosi' grande importanza. Anche se all'ASM dedicheremo diverse lezioni, come abbiamo gia' anticipato non ci limiteremo a considerare solo questo linguaggio: cosi' come in teoria e' possibile applicare il processo mentale tipico del reversing a qualsiasi aspetto della realta', in pratica smanetteremo con protocolli, CGI, HTML, C, Perl e chi piu' ne ha piu' ne metta. Lo scopo che questo corso si prefigge e' proprio quello di insegnarvi non una serie di nozioni, ma alcuni concetti che poi verranno messi in pratica in diversi campi e con diversi esempi. Per questo motivo, dopo le prime due lezioni dedicate alle basi dell'ASM, le due successive saranno dedicate alla programmazione in C e ai metodi per "tornare indietro", dal codice ASM, al C. L'utilita' di queste tecniche risiede non solo nella possibilita' di trasformare un qualsiasi programma chiuso in uno dal sorgente aperto, ma anche nella maggiore comprensione del funzionamento dei programmi una volta compilati. Tecniche come quella del buffer overflow derivano direttamente da concetti di questo tipo e vi possono aiutare sia a rendere piu' sicuri i vostri programmi sia... a rendere meno sicuri quelli degli altri ;) Le due lezioni successive sono decisamente piu' pratiche e vi permetteranno, finalmente, di comiciare a "sentire" cosa vi succede attorno. Spesso, per capire cosa combinano i programmi nel vostro computer, non e' indispensabile disassemblarli, ma e' sufficiente vedere come si comportano nei confronti dell'ambiente in cui girano: a quali file accedono, quali voci di registro (sotto windoze) consultano, quali stringhe mostrano a schermo e cosi' via. I cosiddetti monitor, quei programmi cioe' che vi permettono di monitorare il funzionamento di un'applicazione, sono molto importanti e ad essi e' dedicata un'intera lezione; d'altra parte, a dispetto della loro importanza, sono di solito programmi abbastanza semplici da usare, quindi avrete tutti modo di divertirvi, imparando a usarli in breve tempo. Se a questo punto comincerete a sentirvi ammaliati dal lato oscuro della Forza, aspettate di seguire la lezione sul cracking nella quale imparerete a proteggere (un po' meglio) i vostri programmi... studiando gli errori degli altri. Il cracking, paragonato al reversing, riveste (anche dal punto di vista tecnico) un'importanza minima: perche' limitarsi a sproteggere un programma, quando si e' in grado di fargli fare qualsiasi cosa si desideri? E' proprio a questo punto che arrivano le ultime lezioni, che vi insegneranno le tecniche -un po' piu' complesse delle precedenti- per aggiungere nuove funzioni ai programmi, per reversare praticamente qualsiasi cosa vi si pari davanti (sia essa una CGI, un protocollo, una pagina Web) e per giocare con gli eseguibili facendogli fare cose divertenti. ============================================================================= BIBLIOGRAFIA ============================================================================= Essendo questa una lezione introduttiva al corso, la documentazione che e' stata utilizzata non e' ancora molto corposa: tuttavia, per comprendere al meglio le basi su cui lavoreremo nelle prossime lezioni e la terminologia che verra' utilizzata in futuro, potete consultare i lucidi in html che salveremo nella sezione corsi del sito del LOA e all'interno del Reversing CD (edizione corso).