Reverse Engineering Per Principianti
Total Page:16
File Type:pdf, Size:1020Kb
____ | _ \ _____ _____ _ __ ___ ___ | |_) / _ \ \ / / _ \ '__/ __|/ _ \ | _ < __/\ V / __/ | \__ \ __/ |_| \_\___| \_/ \___|_| |___/\___| _____ _ _ | ____|_ __ __ _(_)_ __ ___ ___ _ __(_)_ __ __ _ | _| | '_ \ / _` | | '_ \ / _ \/ _ \ '__| | '_ \ / _` | | |___| | | | (_| | | | | | __/ __/ | | | | | | (_| | |_____|_| |_|\__, |_|_| |_|\___|\___|_| |_|_| |_|\__, | |___/ |___/ __ / _| ___ _ __ | |_ / _ \| '__| | _| (_) | | |_| \___/|_| ____ _ | __ ) ___ __ _(_)_ __ _ __ ___ _ __ ___ | _ \ / _ \/ _` | | '_ \| '_ \ / _ \ '__/ __| | |_) | __/ (_| | | | | | | | | __/ | \__ \ |____/ \___|\__, |_|_| |_|_| |_|\___|_| |___/ |___/ i Reverse Engineering per Principianti (Capire il linguaggio Assembly) Perchè due titoli? Leggi qua: on page viii. Dennis Yurichev <[email protected]> cba ©2013-2020, Dennis Yurichev. Questo lavoro è rilasciato sotto licenza Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). Per vedere la copia di questa licenza visita il sito https://creativecommons.org/licenses/by-sa/4.0/. Teston (6 settembre 2021). L’ultima versione (e l’edizione Russa) del testo sono accessibili al seguente sito: https://beginners.re/. Cerchiamo traduttori! Puoi aiutare a tradurre questo progetto in linguaggi diversi dall’Inglese ed il Russo. Basta inviarmi un qualsiasi pezzo di testo tradotto (non importa quanto è lungo) e lo aggiungerò al mio codice sorgente scritto in LaTeX. Leggi qui. La velocità non è importante, perchè è un progetto Open Source, dopo tutto. Il tuo nome sarà menzionato come Contributore del progetto. Coreano, Cinese e Persiano sono linguaggi reservati ai publisher. Le versioni in Inglese e Russo le traduco da solo, ma il mio Inglese è ancora terribile, quindi vi sono grato ad ogni correzione sulla mia grammatica, ecc... Anche il mio Russo non è ancora perfetto, quindi sono felice di ricevere correzioni anche per il Russo! Non esitate a contattarmi: <[email protected]>. Sommario 1 Pattern di codice 1 2 Italian text placeholder 281 3 285 4 Java 286 5 297 6 Strumenti 301 7 306 8 Libri/blog da leggere 307 9 Community 310 Afterword 312 Appendice 314 Acronimi utilizzati 321 Glossario 324 Indice analitico 326 ii iii Indice 1 Pattern di codice 1 1.1 Il metodo ......................................... 1 1.2 Alcune basi teoriche .................................. 2 1.2.1 Una breve introduzione alla CPU ...................... 2 1.2.2 Qualche parola sulle diverse ISA1 ..................... 3 1.2.3 Sistemi di numerazione ........................... 4 1.2.4 Convertire da una radice ad un’altra ................... 4 1.3 Una funzione vuota .................................. 8 1.3.1 x86 ........................................ 8 1.3.2 ARM ........................................ 8 1.3.3 MIPS ........................................ 8 1.3.4 Le funzioni vuote in pratica ......................... 9 1.4 Ritornare valori ..................................... 10 1.4.1 x86 ........................................ 10 1.4.2 ARM ........................................ 11 1.4.3 MIPS ........................................ 11 1.5 Hello, world! ....................................... 12 1.5.1 x86 ........................................ 12 1.5.2 x86-64 ...................................... 20 1.5.3 ARM ........................................ 24 1.5.4 MIPS ........................................ 33 1.5.5 Conclusione ................................... 39 1.5.6 Esercizi ...................................... 39 1.6 Prologo ed epilogo delle funzioni .......................... 40 1.6.1 Ricorsione .................................... 40 1.7 Una Funzione Vuota: redux ............................. 40 1.8 Valori di Ritorno: redux ................................ 41 1.9 Stack ........................................... 41 1.9.1 Perchè lo stack cresce al contrario? .................... 42 1.9.2 Per cosa viene usato lo stack? ....................... 42 1.9.3 Una tipico layout dello stack ........................ 51 1.9.4 Rumore nello stack .............................. 51 1.9.5 Esercizi ...................................... 56 1.10 Una funzione quasi vuota ............................. 56 1.11 printf() con più argomenti ............................. 57 1.11.1 x86 ....................................... 57 1.11.2 ARM ....................................... 72 1Instruction Set Architecture iv 1.11.3 MIPS ....................................... 80 1.11.4 Conclusione .................................. 88 1.11.5 A proposito .................................. 89 1.12 scanf() .......................................... 89 1.12.1 Un semplice esempio ............................ 89 1.12.2 Il classico errore ...............................101 1.12.3 Varibili globali .................................102 1.12.4 scanf() .....................................114 1.12.5 Esercizio ....................................127 1.13 Degno di nota: variabili globali vs locali . 128 1.14 Accesso agli argomenti ...............................128 1.14.1 x86 .......................................128 1.14.2 x64 .......................................131 1.14.3 ARM .......................................135 1.14.4 MIPS .......................................139 1.15 Ulteriori considerazioni sulla restituzione dei risultati . 141 1.15.1 Tentativo di utilizzare il risultato di una funzione che resituisce void ........................................141 1.15.2 Che succede se il risultato della funzione non viene usato? . 143 1.15.3 Restituire una struttura . 143 1.16 Puntatori ........................................145 1.16.1 Ritornare valori ................................145 1.16.2 Valori di input in Swap . 155 1.17 L’operatore GOTO ..................................156 1.17.1 Dead code ...................................159 1.17.2 Esercizio ....................................160 1.18 Jump condizionali ...................................160 1.18.1 Esempio semplice ..............................160 1.18.2 Calcolo del valore assoluto . 181 1.18.3 Operatore ternario ..............................184 1.18.4 Ottenere i valori massimo e minimo . 188 1.18.5 Conclusione ..................................194 1.18.6 Esercizio ....................................196 1.19 Software cracking ..................................196 1.20 Impossible shutdown practical joke (Windows 7) . 198 1.21 switch()/case/default ................................199 1.21.1 Pochi casi ...................................199 1.21.2 Molti casi ....................................214 1.21.3 Ancora più istruzioni case in un unico blocco . 228 1.21.4 Fall-through ..................................233 1.21.5 Esercizi .....................................235 1.22 Cicli ...........................................236 1.22.1 Semplice esempio ..............................236 1.22.2 Routine di copia blocchi di memoria . 250 1.22.3 Controllo condizione .............................253 1.22.4 Conclusione ..................................254 1.22.5 Esercizi .....................................257 1.23 Maggiori informazioni sulle stringhe . 257 1.23.1 strlen() .....................................257 v 1.23.2 Delimitazione delle stringhe . 271 1.24 Sostituzione di istruzioni aritmetiche con altre . 271 1.24.1 Moltiplicazioni .................................271 1.24.2 Divisioni ....................................278 1.24.3 Esercizio ....................................279 1.25 Array ...........................................279 1.25.1 ..........................................279 1.25.2 ..........................................279 1.25.3 Esercizi .....................................279 1.26 Strutture ........................................280 1.26.1 UNIX: struct tm ................................280 1.26.2 ..........................................280 1.26.3 Esercizi .....................................280 1.27 ..............................................280 1.27.1 ..........................................280 2 Italian text placeholder 281 2.1 Endianness ........................................281 2.1.1 Big-endian ....................................281 2.1.2 Little-endian ...................................281 2.1.3 Esempio .....................................282 2.1.4 Bi-endian .....................................282 2.1.5 Converting data ................................282 2.2 Memoria .........................................283 2.3 CPU ............................................284 2.3.1 Branch predictors ...............................284 2.3.2 Data dependencies ..............................284 3 285 4 Java 286 4.1 Java ............................................286 4.1.1 Introduzione ...................................286 4.1.2 Ritornare un valore ..............................287 4.1.3 Semplici funzioni di calcolo . 293 4.1.4 ...........................................296 4.1.5 ...........................................296 4.1.6 ...........................................296 5 297 5.1 Linux ...........................................297 5.1.1 LD_PRELOAD hack in Linux . 297 5.2 Windows NT .......................................300 5.2.1 Windows SEH ..................................300 6 Strumenti 301 6.1 Analisi di Binari .....................................301 6.1.1 Disassemblers .................................302 6.1.2 Decompilers ...................................302 6.1.3 Comparazione Patch/diffing . 302 vi 6.2 Analisi live ........................................302 6.2.1 Debuggers ....................................302 6.2.2 Tracciare chiamate alle librerie . 303 6.2.3