Reverse engineering: executable file format

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Reverse engineering: executable file format"

Transcript

1 Università degli Studi di Milano Facoltà di Scienze Matematiche, Fisiche e Naturali Reverse engineering: executable file format Alessandro Reina <ale@security.dico.unimi.it> Aristide Fattori<joystick@security.dico.unimi.it> A.A Alessandro Reina Reverse engineering: executable file format A.A / 60

2 Introduzione Reverse engineering [1] reverse engineering is the process of extracting the knowledge or design blueprints from anything man-made contesti differenti (e.g., elettronica, informatica,... ) Alessandro Reina Reverse engineering: executable file format A.A / 60

3 Disassembly Theory a step backward first-generation language: consistono di 0 e 1 spesso rappresentati in forma esadicimale (machine language, bytecode) second-generation language: mapping di pattern specifici di bit, opcode, in forma di caratteri facilmente memorizzabili (mnemonics) rappresentanti istruzioni (assembly languages). L assembler è un tool utilizzato per la traduzione di programmi assembly in linguaggio macchina. third-generation language: introduzione di keyword e costrutti utilizzati come building block per la scrittura di un programma. Tali linguaggi, spesso, sono platform independent (e.g. C, Fortran, Java,... ). I compilatori traducono tali programmi in linguaggio assembly oppure fino al linguaggio macchina. Alessandro Reina Reverse engineering: executable file format A.A / 60

4 The What of Disassembly Traditional model Sviluppo del software, compilatori, assembler, e linker sono utilizzati per la creazione di un programma eseguibile. The way backwards: reverse engineering (assebly)undo = disassembler(bin); (high-level language)undo = decompiler(bin); source-code recovery: hard compilazione può perdere informazioni (e.g. nomi di variabili, nomi di funzioni,... ) compilazione di file sorgente può essere tradotto in assembly, così come da linguaggio macchina a sorgente, in modi differenti decompilatori dipendenti dal linguaggio e dalle librerie utilizzate necessità di un perfetto compilatore Alessandro Reina Reverse engineering: executable file format A.A / 60

5 The Why of Disassembly Why? Scopo dei disassembler è facilitare la comprensione di programmi quando il codice sorgente non è disponibile. Alessandro Reina Reverse engineering: executable file format A.A / 60

6 The Why of Disassembly Why? Scopo dei disassembler è facilitare la comprensione di programmi quando il codice sorgente non è disponibile. Casi: analisi di malware (static/dynamic analysis) analisi di closed-source software per vulnerabilità (vuln. discovery vuln. analysis exploit dev.) analisi di closed-source software per interoperabilità (driver, plugin, WINE, ReactOS, samba,... ) analisi di codice generato dal compilatore per valutare correttezza e performance visualizzazione delle istruzioni assembly durante debugging Alessandro Reina Reverse engineering: executable file format A.A / 60

7 The Why of Disassembly Why? Scopo dei disassembler è facilitare la comprensione di programmi quando il codice sorgente non è disponibile. Casi: analisi di malware (static/dynamic analysis) analisi di closed-source software per vulnerabilità (vuln. discovery vuln. analysis exploit dev.) analisi di closed-source software per interoperabilità (driver, plugin, WINE, ReactOS, samba,... ) analisi di codice generato dal compilatore per valutare correttezza e performance visualizzazione delle istruzioni assembly durante debugging cracking :-) Alessandro Reina Reverse engineering: executable file format A.A / 60

8 The How of Disassembly... and now? Prossima lezione ;-) Alessandro Reina Reverse engineering: executable file format A.A / 60

9 ... btw... What is this thing? OMG this is an unknown file, and so what? Tool l estensione del file non determina necessariamente che file sia realmente le estensioni dei file sono inutili un file, ASCII e non-ascii, si identifica sulla base di specifici campi al suo interno magic numbers: uno speciale TAG, se richiesto dalle specifiche di formato del file, che indentifica se il file è conforme a tali specifiche (solitamente uniche per un determinato tipo di file) file è una utility (*NIX) che permette di identificare il tipo di file in base a particolari regole stabilite in un magic file (e.g /usr/share/file/magic, /usr/share/misc/magic) Alessandro Reina Reverse engineering: executable file format A.A / 60

10 what s inside a file? Esempio taryn:downloads ale$ file./secuinside/bin.exe && hexdump -C./secuinside/bin.exe head -n2./secuinside/bin.exe: PE32 executable for MS Windows (console) Intel bit d 5a ff ff MZ b @. taryn:~ ale$ file /tmp/asd && hexdump -C /tmp/asd head -n2 /tmp/asd: Mach-O 64-bit executable x86_ cf fa ed fe d ale@iron3:~$ file /bin/ls && hexdump -C /bin/ls head -n2 /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux , BuildID[sha1]=0x5a659f89602a2a59f8ba3fafeb5d7a99ac2d9c39, stripped f 45 4c ELF e >..P%@.. ale@iron3:~$ file asd && hexdump -C asd head -n2 asd: JPEG image data, JFIF standard ff d8 ff e a JFIF ff e1 10 ee d 4d. Exif..MM Tuttavia nella pratica del reverse engineering: mai fidarsi completamente dell output di qualsiasi tool finché non si è correlato l output con il risultato di diversi tool insieme ad analisi manuale Alessandro Reina Reverse engineering: executable file format A.A / 60

11 Software reverse engineering Tecniche statiche il programma non viene eseguito documentazione codice sorgente analisi di stringhe, simboli, funzioni di libreria disassembly e analisi codice assembly Tecniche dinamiche esecuzione (monitorata) dell applicazione interazioni con l ambiente (e.g., file system, rete, registro) interazioni con il sistema operativo (system call) debugging Alessandro Reina Reverse engineering: executable file format A.A / 60

12 Analisi di codice binario Tecniche statiche 1 analisi meta-informazioni dell eseguibile funzioni di libreria utilizzate simboli informazioni di debugging... 2 disassembly call graph analisi codice assembly... Alessandro Reina Reverse engineering: executable file format A.A / 60

13 Struttura file eseguibili file eseguibili moderni hanno una struttura complessa Linux Executable and Linkable Format (ELF) Windows Portable Executable (PE) Alessandro Reina Reverse engineering: executable file format A.A / 60

14 Struttura file eseguibili file eseguibili moderni hanno una struttura complessa Linux Executable and Linkable Format (ELF) Windows Portable Executable (PE) Un po di storia... MS-DOS formato COM no header, no meta-data solo codice e dati, in un unico segmento problemi max 0xff00 byte non rilocabile niente dynamic linking... Alessandro Reina Reverse engineering: executable file format A.A / 60

15 ELF: Executable and Linkable Format Tipologie di file ELF [4] 1 relocatable 2 executable 3 shared object Esempio ale@iron3:/tmp$ gcc -c test.c -o test.o ale@iron3:/tmp$ file test.o test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV) ale@iron3:/tmp$ gcc test.c -o test ale@iron3:/tmp$ file test test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV) ale@iron3:/tmp$ gcc -shared test.c -o test.so ale@iron3:/tmp$ file test.so test.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV) Alessandro Reina Reverse engineering: executable file format A.A / 60

16 ELF: Executable and Linkable Format Struttura file ELF ELF header Program header table Section 1... Section n Informazioni sull organizzazione del file... Section header table ELF executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

17 ELF: Executable and Linkable Format Struttura file ELF ELF header Program header table Section 1... Section n Dettagli su come creare l immagine in memoria... Section header table ELF executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

18 ELF: Executable and Linkable Format Struttura file ELF ELF header Program header table Section 1... Section n... Contengono i dati effettivi (e.g., istruzioni, dati, symbol table) Section header table ELF executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

19 ELF: Executable and Linkable Format Struttura file ELF ELF header Program header table Section 1... Section n Informazioni relative alle sezioni (e.g., nome, dimensione)... Section header table ELF executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

20 ELF: Executable and Linkable Format ELF header Elf32 Ehdr in /usr/include/linux/elf.h magic number (\x7felf), ELF type & version architettura & endianness entry point (virtual address) offset (nel file) di program & section header table... Esempio readelf -h test ELF Header: Magic: 7f 45 4c Type: EXEC (Executable file) Machine: Intel Version: 0x1 Entry point address: 0x80482f0 Alessandro Reina Reverse engineering: executable file format A.A / 60

21 ELF: Executable and Linkable Format Section header table Array di Elf32 Shdr in /usr/include/linux/elf.h specifica, per ogni sezione nome (i.e., indice nella section header string table) posizione nel file e memoria dimensione... Esempio ale@iron3:/tmp$ objdump -h test Idx Name Size VMA LMA File off Algn 0.interp **0 CONTENTS, ALLOC, LOAD, READONLY, DATA 12.text c f f f0 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 22.data a a a4 2**2 CONTENTS, ALLOC, LOAD, DATA 23.bss ac ac ac 2**2 ALLOC Alessandro Reina Reverse engineering: executable file format A.A / 60

22 ELF: Executable and Linkable Format Program header table Array di Elf32 Phdr in /usr/include/linux/elf.h array di strutture, ciascuna delle quali definisce Esempio un segmento (i.e., 1 + sezioni in memoria); oppure, altre informazioni necessarie per organizzare l immagine in memoria ale@iron3:/tmp$ objdump -p test Program Header: PHDR off 0x vaddr 0x paddr 0x align 2**2 filesz 0x000000e0 memsz 0x000000e0 flags r-x INTERP off 0x vaddr 0x paddr 0x align 2**0 filesz 0x memsz 0x flags r-- LOAD off 0x vaddr 0x paddr 0x align 2**12 filesz 0x000004a4 memsz 0x000004a4 flags r-x LOAD off 0x000004a4 vaddr 0x080494a4 paddr 0x080494a4 align 2**12 filesz 0x memsz 0x flags rw- DYNAMIC off 0x000004b8 vaddr 0x080494b8 paddr 0x080494b8 align 2**2 filesz 0x000000d0 memsz 0x000000d0 flags rw- NOTE off 0x vaddr 0x paddr 0x align 2**2 filesz 0x memsz 0x flags r-- STACK off 0x vaddr 0x paddr 0x align 2**2 filesz 0x memsz 0x flags rw- Alessandro Reina Reverse engineering: executable file format A.A / 60

23 ELF: Executable and Linkable Format Symbol table Esempio sezione con una entry per simbolo debugging, dynamic linking, relocation,... readelf -s test Symbol table.dynsym contains 5 entries: Num: Value Size Type Bind Vis Ndx Name 0: NOTYPE LOCAL DEFAULT UND 3: FUNC GLOBAL DEFAULT UND puts@glibc_2.0 (2) 4: c 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used Symbol table.symtab contains 74 entries: Num: Value Size Type Bind Vis Ndx Name 0: NOTYPE LOCAL DEFAULT UND 1: SECTION LOCAL DEFAULT 1 70: ac 0 NOTYPE GLOBAL DEFAULT ABS _edata 71: a 0 FUNC GLOBAL HIDDEN 13 i686.get_pc_thunk.bx 72: a4 38 FUNC GLOBAL DEFAULT 13 main 73: FUNC GLOBAL DEFAULT 11 _init Alessandro Reina Reverse engineering: executable file format A.A / 60

24 ELF: Executable and Linkable Format Symbol table Esempio sezione con una entry per simbolo debugging, dynamic linking, relocation,... readelf -S test grep \.symtab [34].symtab SYMTAB strip test readelf -s test Symbol table.dynsym contains 5 entries: Num: Value Size Type Bind Vis Ndx Name 0: NOTYPE LOCAL DEFAULT UND 3: FUNC GLOBAL DEFAULT UND puts@glibc_2.0 (2) 4: c 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used ale@iron3:/tmp$ readelf -S test grep \.symtab ale@iron3:/tmp$ Alessandro Reina Reverse engineering: executable file format A.A / 60

25 ELF: Executable and Linkable Format What do linkers and loaders do? Linker: combina più object file in un unico file Loader: prende gli object file e li carica in memoria Permettono di scrivere programmi utilizzando nomi astratti perché la loro preoccupazione è associare nomi astratti a nomi concreti. Linking vs. Loading Efettuano operazioni correlate tra loro ma concettualmente separate. program loading: copia di un programma dalla memoria secondaria alla memoria principale configurando l ambiente per l esecuzione. relocation: compilatori ed assembler generalmente creano object file con indirizzi di programma a partire da 0. La rilocazione è il processo di assegnamento degli indirizzi di caricamento alle varie parti che compongono il programma modificando codice e dati per riflettere gli indirizzi assegnati. In altre parole: determina il valore di X e mettilo nel binario all offset Y. symbol resolution: un programma è spesso composto da più oggetti, i riferimenti ai nomi degli oggetti sono fatti mediante simboli. Il linker risolve i simboli modificando il codice del chiamante in modo tale che la chiamata si riferisca alla locazione a cui il simbolo fa riferimento (patch object code). Alessandro Reina Reverse engineering: executable file format A.A / 60

26 ELF: Executable and Linkable Linker two-pass linking Linker prende in input un insieme di object file, librerie e produce in output un nuovo object file o eseguibile. ogni file contiene un insieme di segmenti ed almeno una symbol table (simboli importati ed esportati). il linker scansiona i file in input, determina la dimensione dei segmenti e colleziona definizioni e riferimenti di tutti i simboli. il linker assegna locazioni numeriche ai simboli, determina la dimensione e la locazione dei segmenti nello spazio di indirizzamento di output e definisce dove ogni parte deve risiedere nel file di output. le informazioni collezionate sono utilizzate nel reale processo di linking. Il linker legge e riloca il codice oggetto sostituendo simboli con indirizzi di memoria, sistema codice e dati per riflettere i cambiamente dovuti alla rilocazione dei segmenti. se il programma utilizza dynmic linking la symbol table conterrà le informazioni che il runtime linker avrà bisogno per risolvere i simboli dinamicamente. Alessandro Reina Reverse engineering: executable file format A.A / 60

27 ELF: Executable and Linkable Linker Relocation entry Le relocation entry sono utilizzate con una duplice funzionalità: quando una sezione di codice è rilocata ad un differente base address, le relocation entry marcano tale posizione nel codice per essere modificata in un file linkable le relocation entry marcano riferimenti a simboli non definiti in modo tale che il linker/loader conosca le posizioni da modificare quando viene fatta la risoluzione del simbolo Alessandro Reina Reverse engineering: executable file format A.A / 60

28 ELF: Executable and Linkable Compiling & Linking Hello World.data msg:.string Hello World! len=.-msg # section containing initialized data.text.global _start # linker needs it to find the entry point _start: ## write to standard output movl $4, %eax # syscall write movl $1, %ebx # file descriptor stdout movl $msg, %ecx # offset of the message movl $len, %edx # len of the message int $0x80 ## exit gracefully :-) movl $1,%eax # syscall exit movl $0,%ebx # return value int $0x80 ale@iron3:~/rev1/example1$ as hello.s -32 -o hello.out Alessandro Reina Reverse engineering: executable file format A.A / 60

29 ELF: Executable and Linkable Compiling & Linking Disassembly & Relocation objdump -D hello.out <_start>: 0: b mov $0x4,%eax 5: bb mov $0x1,%ebx a: b mov $0x0,%ecx # movl $msg, %ecx f: ba 0e mov $0xe,%edx 14: cd 80 int $0x80 16: b mov $0x1,%eax 1b: bb mov $0x0,%ebx 20: cd 80 int $0x80 ale@iron3:~/rev1/example1$ readelf hello.out -a ELF Header: Magic: 7f 45 4c Relocation section.rel.text at offset 0x258 contains 1 entries: Offset Info Type Sym.Value Sym. Name b R_386_ data Alessandro Reina Reverse engineering: executable file format A.A / 60

30 ELF: Executable and Linkable Loading & Running Program Header ld -m elf_i386 -o hello hello.out readelf -l hello Elf file type is EXEC (Executable file) Entry point 0x There are 2 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x x x x x00096 R E 0x1000 LOAD 0x x x x0000e 0x0000e RW 0x1000 Section to Segment mapping: Segment Sections 00.text 01.data code segment sarà caricato dal file all offset 0x in una regione di memoria (RE) mappata nell address space del processo all indirizzo 0x con dimensione pari a 0x00096 byte e page-aligned (0x1000). data segment sarà caricato dal file all offset 0x Alessandro Reina Reverse engineering: executable file format A.A / 60

31 ELF: Executable and Linkable Shared Library Why? Una shared library (shared object) è un file che può essere condiviso da file eseguibili o altri shared object caricate a load time o run time piuttosto che essere copiate dal linker all interno di un file eseguibile possono essere statically linked, riferimenti risolti a compile time, oppure dynamically linked dove il linking è posticipato al caricamento o la risoluzione degli indirizzi posticipata al momento della prima chiamate (lazy linking) Loading shared library load-time relocation position independet code (PIC) Alessandro Reina Reverse engineering: executable file format A.A / 60

32 ELF: Executable and Linkable Loading shared library reloc.c int rel global = 0x1337C0D3; int rel function(int a, int b) { rel global += a; return b + rel global; } ale@iron3: /rev1/example2$ gcc c reloc.c o reloc.o m32 Alessandro Reina Reverse engineering: executable file format A.A / 60

33 ELF: Executable and Linkable Load-time relocation gcc -shared -o libreloc.so reloc.o -m32 readelf -h libreloc.so ELF Header: Magic: 7f 45 4c Class: ELF32 Type: DYN (Shared object file) Machine: Intel Version: 0x1 Entry point address: 0x3b0 Il linker linka lo shared object a partire dall indirizzo 0x La sezione.text inizia all indirizzo 0x3b0. ale@iron3:~/rev1/example2$ readelf -t libreloc.so grep -A2.text [12].text PROGBITS b0 0003b [ ]: ALLOC, EXEC Alessandro Reina Reverse engineering: executable file format A.A / 60

34 ELF: Executable and Linkable Load-time relocation objdump -d libreloc.so libreloc.so: file format elf32-i c <rel_function>: 46c: 55 push %ebp 46d: 89 e5 mov %esp,%ebp 46f: a mov 0x0,%eax 474: add 0x8(%ebp),%eax 477: a mov %eax,0x0 47c: a mov 0x0,%eax 481: c add 0xc(%ebp),%eax 484: 5d pop %ebp 485: c3 ret 486: 90 nop Alessandro Reina Reverse engineering: executable file format A.A / 60

35 ELF: Executable and Linkable Load-time relocation objdump -d libreloc.so libreloc.so: file format elf32-i c <rel_function>: 46c: 55 push %ebp 46d: 89 e5 mov %esp,%ebp 46f: a mov 0x0,%eax 474: add 0x8(%ebp),%eax 477: a mov %eax,0x0 47c: a mov 0x0,%eax 481: c add 0xc(%ebp),%eax 484: 5d pop %ebp 485: c3 ret 486: 90 nop Dopo le prime due istruzioni che identificano il prologo troviamo l istruzione rel_global += a. Il valore di rel_global viene preso dalla memoria e salvato nel registro %eax, quindi incrementato di a cioè 0x8(%ebp) e salvato nuovamente in memoria. Alessandro Reina Reverse engineering: executable file format A.A / 60

36 ELF: Executable and Linkable Load-time relocation objdump -d libreloc.so libreloc.so: file format elf32-i c <rel_function>: 46c: 55 push %ebp 46d: 89 e5 mov %esp,%ebp 46f: a mov 0x0,%eax 474: add 0x8(%ebp),%eax 477: a mov %eax,0x0 47c: a mov 0x0,%eax 481: c add 0xc(%ebp),%eax 484: 5d pop %ebp 485: c3 ret 486: 90 nop Dopo le prime due istruzioni che identificano il prologo troviamo l istruzione rel_global += a. Il valore di rel_global viene preso dalla memoria e salvato nel registro %eax, quindi incrementato di a cioè 0x8(%ebp) e salvato nuovamente in memoria.?!? Ma l istruzione mov dove prende rel_global? Alessandro Reina Reverse engineering: executable file format A.A / 60

37 ELF: Executable and Linkable Load-time relocation :-) Il valore dell operando dell istruzione mov è proprio 0x0 o meglio questo è come funziona la rilocazione. L assemblatore/linker inserisce dei valori provvisori nel codice e per ognuno di essi crea una relocation entry che si riferisce alle posizioni in cui sono stati inseriti. ale@iron3:~/rev1/example2$ readelf -r libreloc.so Relocation section.rel.dyn at offset 0x304 contains 7 entries: Offset Info Type Sym.Value Sym. Name R_386_RELATIVE a01 R_386_ c rel_global a01 R_386_ c rel_global d 00000a01 R_386_ c rel_global La sezione.rel.dyn di un ELF è riservata per le rilocazioni dinamiche (load-time) che vengono utilizzate dal dynamic loader. Alessandro Reina Reverse engineering: executable file format A.A / 60

38 ELF: Executable and Linkable Load-time relocation Rilocazione La seconda entry nella relocation section indica: vai all offset 0x470 nella shared library ed applica il tipo di rilocazione R_386_32 (S + A) che signfica: prendi il valore del simbolo il cui indice risiede nella relocation entry e somma l addend usato per calcolare il valore del relocation field ehm, what??!? :-( Alessandro Reina Reverse engineering: executable file format A.A / 60

39 ELF: Executable and Linkable Load-time relocation Rilocazione La seconda entry nella relocation section indica: vai all offset 0x470 nella shared library ed applica il tipo di rilocazione R_386_32 (S + A) che signfica: prendi il valore del simbolo il cui indice risiede nella relocation entry e somma l addend usato per calcolare il valore del relocation field ehm, what??!? :-( 46f: a mov 0x0,%eax a1 rappresenta l opcode dell istruzione mov che inizia all indirizzo 0x46f, mentre l operando risiede al byte successivo 0x470 con valore 0x0 (A = addend). R_386_32 definisce la seguente operazione: somma l indirizzo di rel_global (S = symbol value, cioè base address + prev. sym val) all operando dell istruzione mov, cioè 0x0. Questo dice al dynamic loader: quando effettui l assegnamento dell indirizzo, salva l indirizzo reale di rel_global all offset 0x470 sostituendo il vecchio operando della mov con quello nuovo. Sym. Value rappresenta l offset di rel_global nell immagine della memoria virtuale della shared library. Alessandro Reina Reverse engineering: executable file format A.A / 60

40 ELF: Executable and Linkable Load-time relocation run the binary readelf --segment libreloc.so Elf file type is DYN (Shared object file) Entry point 0x3b0 There are 6 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x x x x x00534 R E 0x1000 LOAD 0x x x x0010c 0x00114 RW 0x1000 DYNAMIC 0x x x x000d0 0x000d0 RW 0x4 NOTE 0x0000f4 0x000000f4 0x000000f4 0x x00024 R 0x4 GNU_EH_FRAME 0x0004e4 0x000004e4 0x000004e4 0x x00014 R 0x4 GNU_STACK 0x x x x x00000 RW 0x4 Section to Segment mapping: Segment Sections 00.note.gnu.build-id.hash.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.plt.text.fini.eh_frame_hdr.eh_frame 01.ctors.dtors.jcr.dynamic.got.got.plt.data.bss 02.dynamic 03.note.gnu.build-id 04.eh_frame_hdr 05 Alessandro Reina Reverse engineering: executable file format A.A / 60

41 ELF: Executable and Linkable Load-time relocation run the binary in Section to Segment mapping il segmento 01 contiene la sezione.data dove risiede rel_global VirtAddr specifica che il segmento 01 inizia a 0x con dimensione su file pari 0x0010c byte; include pertanto rel_global che ha offset nell immagine della memoria virtuale della shared library 0x163c Alessandro Reina Reverse engineering: executable file format A.A / 60

42 ELF: Executable and Linkable Load-time relocation run the binary in Section to Segment mapping il segmento 01 contiene la sezione.data dove risiede rel_global VirtAddr specifica che il segmento 01 inizia a 0x con dimensione su file pari 0x0010c byte; include pertanto rel_global che ha offset nell immagine della memoria virtuale della shared library 0x163c?!? C è un bug in readelf, gcc, ld,...? Come mai FileSiz e MemSiz non coincidono?! In memoria il segmento è più grande della dimensione su file!? Alessandro Reina Reverse engineering: executable file format A.A / 60

43 ELF: Executable and Linkable Load-time relocation walk through list of shared objects #define GNU SOURCE #include <link.h> #include <stdlib.h> #include <stdio.h> static int callback(struct dl phdr info info, size t size, void data) { int j; printf( %s (%d segments) at address %p\n, info >dlpi name, info >dlpi phnum, (void )info >dlpi addr); for (j = 0; j < info >dlpi phnum; j++) { printf( \t\t header %2d: start at address %10p\n, j, (void ) (info >dlpi addr + info >dlpi phdr[j].p vaddr)); } printf( \n ); return 0; } extern int rel functin(int, int); int main(int argc, const char argv[]) { dl iterate phdr(callback, NULL); int res = rel function(argc, argc); return 0; } Alessandro Reina Reverse engineering: executable file format A.A / 60

44 ELF: Executable and Linkable Load-time relocation gdb -q driver Reading symbols from /home/ale/rev1/example2/driver(no debugging symbols found)done. (gdb) b rel_function Breakpoint 1 at 0x80484cc (gdb) r /home/ale/rev1/example2/libreloc.so (6 segments) at address 0xb7fde000 header 0: start at address 0xb7fde000 header 1: start at address 0xb7fdf534 header 2: start at address 0xb7fdf548 header 3: start at address 0xb7fde0f4 header 4: start at address 0xb7fde4e4 header 5: start at address 0xb7fde000 Il programma precedente riporta tutte le librerie che ha caricato. Possiamo notare che i 6 segmenti visualizzati sono gli stessi riportati da readelf ma rilocati agli indirizzi di memoria finali. libreloc.so è stata posizionata all indirizzo virtuale 0xb7fde000 con readelf il secondo segmento era posizionato all offset 0x mentre in memoria è stato caricato all indirizzo virtuale 0xb7fdf534 la variable globale rel_global, prima del caricamento, risiedeva all offset 0x163c (il linker assume che che la shared library sia stata caricata all indirizzo 0x0) pertanto se la shared library è stata carita all indirizzo 0xb7fde000 allora la variabile globale rel_global risiede all indirizzo 0xb7fde x163c = 0xb7fdf63c Alessandro Reina Reverse engineering: executable file format A.A / 60

45 ELF: Executable and Linkable Load-time relocation gdb -q driver (gdb) p/x &rel_global $1 = 0xb7fdf63c (gdb) p/x rel_global $2 = 0x1337c0d3 (gdb) disassemble rel_function Dump of assembler code for function rel_function: 0xb7fde46c <+0>: push %ebp 0xb7fde46d <+1>: mov %esp,%ebp => 0xb7fde46f <+3>: mov 0xb7fdf63c,%eax 0xb7fde474 <+8>: add 0x8(%ebp),%eax 0xb7fde477 <+11>: mov %eax,0xb7fdf63c 0xb7fde47c <+16>: mov 0xb7fdf63c,%eax 0xb7fde481 <+21>: add 0xc(%ebp),%eax 0xb7fde484 <+24>: pop %ebp 0xb7fde485 <+25>: ret End of assembler dump. L indirizzo reale di rel_global in memoria virtuale è stato correttamente sostituito in ogni punto specificato dalle relocation entry Alessandro Reina Reverse engineering: executable file format A.A / 60

46 ELF: Executable and Linkable Load-time relocation Relocation function call int rel global = 0x1337C0D3; int rel call function(void) { return 0xcd9a000d; } int rel function(int a, int b) { rel global ˆ= rel call function(); rel global += a; return b + rel global; } Alessandro Reina Reverse engineering: executable file format A.A / 60

47 ELF: Executable and Linkable Load-time relocation Relocation function call b6 <rel_function>: 4b6: 55 push %ebp 4b7: 89 e5 mov %esp,%ebp 4b9: e8 fc ff ff ff call 4ba <rel_function+0x4> 4be: 8b mov 0x0,%edx 4c4: 31 d0 xor %edx,%eax 4c6: a mov %eax,0x0 4cb: a mov 0x0,%eax 4d0: add 0x8(%ebp),%eax 4d3: a mov %eax,0x0 4d8: a mov 0x0,%eax 4dd: c add 0xc(%ebp),%eax 4e0: 5d pop %ebp 4e1: c3 ret 4e2: 90 nop Alessandro Reina Reverse engineering: executable file format A.A / 60

48 ELF: Executable and Linkable Load-time relocation Relocation function call readelf -r libreloc.so Relocation section.rel.dyn at offset 0x330 contains 10 entries: Offset Info Type Sym.Value Sym. Name c R_386_RELATIVE ba R_386_PC ac rel_call_function c b01 R_386_ c4 rel_global c b01 R_386_ c4 rel_global L entry 0x000004ba è l argomento dell istruzione call di tipo R_386_PC32 (S + A - P). Il tipo R_386_PC32 significa somma il valore del simbolo (S) con il valore contenuto all offset specificato nella relocation entry (A) meno l indirizzo dove si deve applicare la rilocazione (P) (indirizzi a load-time). Alessandro Reina Reverse engineering: executable file format A.A / 60

49 ELF: Executable and Linkable Load-time relocation Relocation function call (gdb) disassemble /r rel_function Dump of assembler code for function rel_function: 0xb7fde4b6 <+0>: 55 push %ebp 0xb7fde4b7 <+1>: 89 e5 mov %esp,%ebp => 0xb7fde4b9 <+3>: e8 ee ff ff ff call 0xb7fde4ac <rel_call_function> 0xb7fde4be <+8>: 8b 15 c4 f6 fd b7 mov 0xb7fdf6c4,%edx 0xb7fde4c4 <+14>: 31 d0 xor %edx,%eax 0xb7fde4c6 <+16>: a3 c4 f6 fd b7 mov %eax,0xb7fdf6c4 0xb7fde4cb <+21>: a1 c4 f6 fd b7 mov 0xb7fdf6c4,%eax 0xb7fde4d0 <+26>: add 0x8(%ebp),%eax 0xb7fde4d3 <+29>: a3 c4 f6 fd b7 mov %eax,0xb7fdf6c4 0xb7fde4d8 <+34>: a1 c4 f6 fd b7 mov 0xb7fdf6c4,%eax 0xb7fde4dd <+39>: c add 0xc(%ebp),%eax 0xb7fde4e0 <+42>: 5d pop %ebp 0xb7fde4e1 <+43>: c3 ret End of assembler dump. Quindi applicando il tipo di rilocazone R_386_PC32 si ottiene: 0xb7fde4ac + 0xfffffffc - 0xb7fde4ba = 0xffffffee. Alessandro Reina Reverse engineering: executable file format A.A / 60

50 ELF: Executable and Linkable Dynamic linking Problema Se la shared library è utilizzata da molti processi (code sharing) quali problemi possono esserci? Alessandro Reina Reverse engineering: executable file format A.A / 60

51 ELF: Executable and Linkable Dynamic linking Problema Se la shared library è utilizzata da molti processi (code sharing) quali problemi possono esserci? il code segment deve essere read/exec il data segment non deve essere condiviso Alessandro Reina Reverse engineering: executable file format A.A / 60

52 ELF: Executable and Linkable Dynamic linking Problema Se la shared library è utilizzata da molti processi (code sharing) quali problemi possono esserci? il code segment deve essere read/exec il data segment non deve essere condiviso allora è necessaria la rilocazione come si può effettuare il patching del codice se è read? Alessandro Reina Reverse engineering: executable file format A.A / 60

53 ELF: Executable and Linkable Dynamic linking Problema Se la shared library è utilizzata da molti processi (code sharing) quali problemi possono esserci? il code segment deve essere read/exec il data segment non deve essere condiviso allora è necessaria la rilocazione come si può effettuare il patching del codice se è read? data segment è ad un offset conosciuto rispetto al code segment, quindi need_address = current_eip + known_offset Alessandro Reina Reverse engineering: executable file format A.A / 60

54 ELF: Executable and Linkable Dynamic linking Shared object Linux permette l uso di PIC (Position Independent Code). Shared object che sono stati compilati PIC non richiedono rilocazione a load-time. Purtroppo in x86 non esiste un modo immediato per accedere alla memoria in modo relativo rispetto all instruction pointer (contrariamente a amd64). Alessandro Reina Reverse engineering: executable file format A.A / 60

55 ELF: supporto al dynamic linking GOT e PLT: cosa sono? Global Offset Table e Procedure Linkage Table La GOT redirige indirizzi position-independent ad indirizzi assoluti. La PLT redirige chiamate a funzioni position-independent ad indirizzi assoluti. sezioni (.got e.plt) presenti in eseguibili che utilizzano dynamic linking l indirizzo della GOT è relativo al codice che lo referenzia PLT aggiunge un livello di indirettezza alle chiamate a funzione, consentendo anche il lazy binding dei relativi indirizzi Alessandro Reina Reverse engineering: executable file format A.A / 60

56 ELF: supporto al dynamic linking Algoritmo 1 il sistema operativo mappa il loader in memoria e lo esegue 2 il linker riloca e risolve i riferimenti alle proprie funzioni 3 il linker esplora la.dynamic section per enumerare tutte le librerie necessarie al caricamento dell eseguibile 4 dopo aver verificato l esistenza della libreria sul filesystem procede al mapping della stessa in memoria e carica ricorsivamente tutte le sue dipendenze 5 il linker effettua le rilocazioni necessarie e completa la GOT 6 se la variabile d ambiente LD_BIND_NOW è configurata opportunamente il linker completa sin dal caricamento anche la PLT altrimenti farà lazy linking Alessandro Reina Reverse engineering: executable file format A.A / 60

57 ELF: supporto al dynamic linking Esempio objdump -h -j.plt -j.got which ls /bin/ls: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn 12.plt a a a8 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 22.got **2 CONTENTS, ALLOC, LOAD, DATA Alessandro Reina Reverse engineering: executable file format A.A / 60

58 ELF: supporto al dynamic linking GOT e PLT: come funzionano? Chiamata ad una funzione shared 1 chiamata f() shared chiamata ad una entry della PLT 2 PLT: jmp indiretto ad una entry della GOT che conterrà: la prima volta, l indirizzo di una entry della PLT che trasferisce il controllo al linker, per risoluzione e aggiornamento della GOT successivamente, l indirizzo effettivo della shared function Esempio ale@iron3:~/rev1/example4$ objdump -d test e8 <puts@plt-0x10>: 80482e8: ff pushl 0x # GOT + 4 (link_map) 80482ee: ff jmp *0x # GOT + 8 (runtime linker) 80482f4: add %al,(%eax) f8 <puts@plt>: 80482f8: ff 25 0c jmp *0x804960c 80482fe: push $0x : e9 e0 ff ff ff jmp 80482e8 <_init+0x30> e4 <main>: 80483f4: e8 ff fe ff ff call 80482f8 <puts@plt> Alessandro Reina Reverse engineering: executable file format A.A / 60

59 ELF: supporto al dynamic linking Esempio.got e.plt call jmp *<GOT+n> linker.plt <GOT+n>: Alessandro Reina Reverse engineering: executable file format A.A / 60

60 ELF: supporto al dynamic linking Esempio.got e.plt call 1 jmp *<GOT+n> linker.plt <GOT+n>: Alessandro Reina Reverse engineering: executable file format A.A / 60

61 ELF: supporto al dynamic linking Esempio.got e.plt call 1 jmp *<GOT+n> linker.plt 2 <GOT+n>: <puts@plt+6>.got Alessandro Reina Reverse engineering: executable file format A.A / 60

62 ELF: supporto al dynamic linking Esempio.got e.plt call 1 jmp *<GOT+n> linker.plt 2 <GOT+n>: <puts>.got Alessandro Reina Reverse engineering: executable file format A.A / 60

63 ELF: supporto al dynamic linking Esempio.got e.plt 3 call <puts@plt>.text <puts@plt>+0: jmp *<GOT+n> <puts@plt>+6: linker.plt <GOT+n>: <puts>.got Alessandro Reina Reverse engineering: executable file format A.A / 60

64 ELF: supporto al dynamic linking readelf -r mix.o Relocation section.rel.text at offset 0x3ec contains 6 entries: Offset Info Type Sym.Value Sym. Name b 00000f02 R_386_PC i686.get_pc_thunk.bx a R_386_GOTPC _GLOBAL_OFFSET_TABLE_ e04 R_386_PLT rel_function f R_386_GOTOFF rodata c03 R_386_GOT rel_global b04 R_386_PLT printf Alessandro Reina Reverse engineering: executable file format A.A / 60

65 ELF: supporto al dynamic linking <main>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 53 push %ebx 4: 83 e4 f0 and $0xfffffff0,%esp 7: 83 ec 20 sub $0x20,%esp a: e8 fc ff ff ff call b <main+0xb> f: 81 c add $0x2,%ebx 15: c fe af dc movl $0xbadcaffe,0x4(%esp) 1c: ba 1d: c be ba fe ca movl $0xcafebabe,(%esp) 24: e8 fc ff ff ff call 25 <main+0x25> 29: c mov %eax,0x1c(%esp) 2d: 8d lea 0x0(%ebx),%eax 33: 8b mov 0x0(%ebx),%edx 39: mov %edx,0x4(%esp) 3d: mov %eax,(%esp) 40: e8 fc ff ff ff call 41 <main+0x41> 45: b mov $0x0,%eax 4a: 8b 5d fc mov -0x4(%ebp),%ebx 4d: c9 leave 4e: c3 ret Alessandro Reina Reverse engineering: executable file format A.A / 60

66 ELF: supporto al dynamic linking < i686.get_pc_thunk.bx>: 0: 8b 1c 24 mov (%esp),%ebx 3: c3 ret i686.get_pc_thunk.bx stub utilizzato per emulare indirizzamento pc-relative salva nel registro ebx l indirizzo di ritorno, cioè l indirizzo dell istruzione successiva alla call (shellcode-like) ebx contiene il l indirizzo di memoria dell istruzione add che deve essere rilocata per mezzo della GOT tipo di rilocazione applicato: R_386_GOTPC (GOT + A - P) quando il linker costruisce la GOT (executable o shared library) conosce l indirizzo virtuale della GOT stessa Se la GOT si trova all indirizzo virtuale 0x080497c8 ed il base address è 0x si ottiene che R_386_GOTPC = 0x080497c8 + 0x02 - (0x x11) = 0x1285 Alessandro Reina Reverse engineering: executable file format A.A / 60

67 ELF: supporto al dynamic linking Dump of assembler code for function main: 0x <+0>: push %ebp 0x <+1>: mov %esp,%ebp 0x <+3>: push %ebx 0x <+4>: and $0xfffffff0,%esp 0x b <+7>: sub $0x20,%esp 0x e <+10>: call 0x < i686.get_pc_thunk.bx> => 0x <+15>: add $0x1285,%ebx 0x <+21>: movl $0xbadcaffe,0x4(%esp) 0x <+29>: movl $0xcafebabe,(%esp) 0x <+36>: call 0x x d <+41>: mov %eax,0x1c(%esp) 0x <+45>: lea -0x1178(%ebx),%eax 0x <+51>: mov -0x4(%ebx),%edx 0x d <+57>: mov %edx,0x4(%esp) 0x <+61>: mov %eax,(%esp) 0x <+64>: call 0x x <+69>: mov $0x0,%eax 0x e <+74>: mov -0x4(%ebp),%ebx 0x <+77>: leave 0x <+78>: ret End of assembler dump. (gdb) p/x $ebx $1 = 0x (gdb) si 0x in main () (gdb) p/x $ebx $2 = 0x80497c8 (gdb) x/4x 0x80497c8 0x80497c8 <_GLOBAL_OFFSET_TABLE_>: 0x080496e8 0xb7fff918 0xb7ff60b0 0x e (gdb) x/s 0x80497c8-0x1178 0x : &rel_global = %p\n Alessandro Reina Reverse engineering: executable file format A.A / 60

68 ELF: supporto al dynamic linking Lazy binding: performance $ time (mplayer >/dev/null) real 0m0.039s user 0m0.024s sys 0m0.012s $ time (LD_BIND_NOW=1 mplayer >/dev/null) real 0m0.141s user 0m0.100s sys 0m0.016s Esempio: dump librerie e dynamic loader ale@iron3:~/rev1/example4$ ldd test libc.so.6 => /lib32/libc.so.6 (0xb765c000) /lib/ld-linux.so.2 (0xb77c1000) ale@iron3:~/rev1/example4$ readelf./test -x.interp Hex dump of section.interp : 0x f6c6962 2f6c642d 6c696e75 782e736f /lib/ld-linux.so 0x e Alessandro Reina Reverse engineering: executable file format A.A / 60

69 PE: Portable Executable Tipologie di file PE [2, 3] 1 executable 2 object 3 DLL 4 COM files, OCX controls, CLP applets,.net executables 5 device driver 6... Esempio roby@gandalf:/tmp$ file test.exe test.exe: PE32 executable for MS Windows (console) Intel bit roby@gandalf:/tmp$ file test.o test.o: COFF executable not stripped - version roby@gandalf:/tmp$ file test.dll test.dll: PE32 executable for MS Windows (DLL) (console) Intel roby@gandalf:/tmp$ file test.sys test.sys: PE32 executable for MS Windows (DLL) (native) Intel Alessandro Reina Reverse engineering: executable file format A.A / 60

70 PE: Portable Executable Struttura file PE DOS header DOS stub PE header Section table.text section.data section Per retrocompatibilità PE executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

71 PE: Portable Executable Struttura file PE DOS header DOS stub PE header Section table.text section.data section... Contiene informazioni sull organizzazione del file... PE executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

72 PE: Portable Executable Struttura file PE DOS header DOS stub PE header Section table.text section.data section... Contengono i dati effettivi (e.g., istruzioni, dati, rilocazione)... PE executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

73 PE: Portable Executable Struttura file PE DOS header DOS stub PE header Section table.text section.data section... Informazioni relative alle sezioni (e.g., nome, dimensione)... PE executable file Alessandro Reina Reverse engineering: executable file format A.A / 60

74 PE: Portable Executable Introduzione modulo: file PE caricato in memoria (e riorganizzato dal loader) RVA: Relative Virtual Address indirizzo relativo al base address dell immagine in memoria RVA file offset strutture definite in winnt.h Alessandro Reina Reverse engineering: executable file format A.A / 60

75 PE: Portable Executable DOS header & stub DOS header typedef struct IMAGE DOS HEADER { WORD e magic; LONG e lfanew; } IMAGE DOS HEADER, PIMAGE DOS HEADER; 64 byte, magic number \x4d\x5a ( MZ ) e lfanew: offset PE header segue DOS stub DOS stub This program cannot be run in DOS mode Alessandro Reina Reverse engineering: executable file format A.A / 60

76 PE: Portable Executable PE header typedef struct IMAGE NT HEADERS { DWORD Signature; // \x50\x45\x00\x00 ( PE\x00\x00 ) IMAGE FILE HEADER FileHeader; IMAGE OPTIONAL HEADER OptionalHeader; } IMAGE NT HEADERS32, PIMAGE NT HEADERS32; typedef struct IMAGE FILE HEADER { WORD Machine; WORD NumberOfSections; } IMAGE FILE HEADER, PIMAGE FILE HEADER; typedef struct IMAGE OPTIONAL HEADER { // non e opzionale! DWORD AddressOfEntryPoint; DWORD ImageBase; DWORD SectionAlignment; DWORD FileAlignment; WORD Subsystem; IMAGE DATA DIRECTORY DataDirectory[IMAGE NUMBEROF DIRECTORY ENTRIES]; } IMAGE OPTIONAL HEADER32, PIMAGE OPTIONAL HEADER32; Alessandro Reina Reverse engineering: executable file format A.A / 60

77 PE: Portable Executable Section table typedef struct IMAGE SECTION HEADER { BYTE Name[IMAGE SIZEOF SHORT NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD Characteristics; } IMAGE SECTION HEADER, PIMAGE SECTION HEADER; Alcune sezioni 1 executable code section (.text) (di solito, AddressOfEntryPoint.text) 2 data sections (.data,.rdata,.bss,... ) 3.rsrc,.edata,.reloc,.debug,... Alessandro Reina Reverse engineering: executable file format A.A / 60

78 PE: Portable Executable Import section (.idata) OriginalFirstThunk thunk 1 h 1 name 1 thunk 1 TimeDateStamp thunk 2 thunk n h 2 name 2 thunk 2 thunk n Name h n name n FirstThunk = IMAGE IMPORT DESCRIPTOR = import name table = IMAGE IMPORT BY NAME = import address table Alessandro Reina Reverse engineering: executable file format A.A / 60

79 PE: Portable Executable Import section (.idata) OriginalFirstThunk thunk 1 h 1 name 1 &name 1 TimeDateStamp thunk 2 thunk n h 2 name 2 &name 2 &name n Name h n name n FirstThunk = IMAGE IMPORT DESCRIPTOR = import name table = IMAGE IMPORT BY NAME = import address table Alessandro Reina Reverse engineering: executable file format A.A / 60

80 PE: Portable Executable Import section (.idata) invocazione di funzioni importate d: call c0 < c0 < c0: jmp 0x richiede 1 call + 1 jmp jump stubs.got differenze? Alessandro Reina Reverse engineering: executable file format A.A / 60

81 PE: Portable Executable Import section (.idata) invocazione di funzioni importate d: call c0 < c0 < c0: jmp 0x richiede 1 call + 1 jmp jump stubs.got differenze? : call 0x c solo 1 call declspec(ddlimport) Alessandro Reina Reverse engineering: executable file format A.A / 60

82 Prossima lezione tecniche di disassembly installare IDA Pro! versione freeware: Alessandro Reina Reverse engineering: executable file format A.A / 60

83 Bibliografia I E. Eilam. Reversing: Secrets of Reverse Engineering. Wiley Publishing, Inc., M. Pietrek. An In-Depth Look into the Win32 Portable Executable File Format Part 1. MSDN Magazine, M. Pietrek. An In-Depth Look into the Win32 Portable Executable File Format Part 2. MSDN Magazine, TIS Committee. Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification Version 1.2. May Alessandro Reina Reverse engineering: executable file format A.A / 60

Reverse engineering: executable file format

Reverse engineering: executable file format Università degli Studi di Milano Facoltà di Scienze Matematiche, Fisiche e Naturali Reverse engineering: executable file format Roberto Paleari Emanuele Passerini

Dettagli

Kernel and User space

Kernel and User space Kernel and User space Esercizio Esercizio: Scrivere e compilare un programma che stampi a video "Hello world" (soluzione.c) La compilazione Compilare un sorgente C: $ gcc o main main.c $ file main main:

Dettagli

Stack-based buffer overflow

Stack-based buffer overflow Università degli Studi di Milano Facoltà di Scienze e Tecnologie Stack-based buffer overflow Andrea Lanzi A.A. 2015 2016 Andrea Lanzi Stack-based buffer overflow A.A. 2015 2016 1 / 19 Classificazione attacchi

Dettagli

Reverse engineering: disassembly

Reverse engineering: disassembly Università degli Studi di Milano Facoltà di Scienze Matematiche, Fisiche e Naturali Reverse engineering: disassembly Roberto Paleari Emanuele Passerini

Dettagli

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione Dal sorgente all eseguibile I programmi Assembly Prof. Alberto Borghese Dipartimento di Scienze dell Informazione alberto.borghese@unimi.it Riferimenti sul Patterson: Cap. 2.10 + Appendice B, tranne B.7

Dettagli

Perché il linguaggio C?

Perché il linguaggio C? Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare

Dettagli

Reverse engineering: disassembly

Reverse engineering: disassembly Università degli Studi di Milano Facoltà di Scienze e Tecnologie Dipartimento di Informatica Reverse engineering: disassembly Lanzi Andrea A.A. 2014 2015 Andrea Lanzi Reverse

Dettagli

Compilazione separata

Compilazione separata Compilazione separata 1 Compilazione separata Finora abbiamo trattato solo programmi C contenuti in un unico file define/include typedef variabili globali prototipi F1..FN main def F1 def FN Struttura

Dettagli

ASM: catena di compilazione

ASM: catena di compilazione ASM: catena di compilazione Lorenzo Dematté October 2, 2011 1 La nostra Macchina Virtuale Una macchina virtuale o modello di programmazione è l ambiente nel quale i programmi girano. Di solito si parla

Dettagli

Università degli Studi di Cassino

Università degli Studi di Cassino Corso di Assemblatori, Linker Loader Anno Accademico 2007/2008 Francesco Tortorella Dal produttore all esecutore Prima di essere eseguito, un programma attraversa le seguenti fasi: Traduzione Compilazione

Dettagli

Formato degli Eseguibili e Strumenti Avanzati di Compilazione

Formato degli Eseguibili e Strumenti Avanzati di Compilazione Dipartimento di Informatica e Sistemistica Formato degli Eseguibili e Strumenti Avanzati di Compilazione Alessandro Pellegrini pellegrini@dis.uniroma1.it http://www.dis.uniroma1.it/~pellegrini Processo

Dettagli

Università degli Studi di Cassino e del Lazio Meridionale Corso di Calcolatori Elettronici Assemblatori, Linker Loader

Università degli Studi di Cassino e del Lazio Meridionale Corso di Calcolatori Elettronici Assemblatori, Linker Loader di Cassino e del Lazio Meridionale Corso di Assemblatori, Linker Loader Anno Accademico Francesco Tortorella Dal produttore all esecutore Prima di essere eseguito, un programma attraversa le seguenti fasi:

Dettagli

Calcolatori Elettronici Parte VIII: linguaggi assemblativi

Calcolatori Elettronici Parte VIII: linguaggi assemblativi Anno Accademico 2013/2014 Calcolatori Elettronici Parte VIII: linguaggi assemblativi Prof. Riccardo Torlone Universita di Roma Tre Linguaggi di Programmazione Linguaggi ad alto livello Maggiore espressività

Dettagli

Introduzione a GCC: GNU Compiler Collection

Introduzione a GCC: GNU Compiler Collection Introduzione a GCC: GNU Compiler Collection Caratteristiche di GCC Compilatore multipiattaforma modulare Disponibile per tutti i principali sistemi operativi Può produrre programmi per la maggior parte

Dettagli

Stack-based buffer overflow

Stack-based buffer overflow Università degli Studi di Milano Facoltà di Scienze Matematiche, Fisiche e Naturali Stack-based buffer overflow Roberto Paleari 21-23 Aprile 2009 Roberto Paleari Stack-based

Dettagli

ESP/EBP. ESP Frame func()

ESP/EBP. ESP Frame func() Lo Stack Lo stack e' una porzione dinamica di memoria. Lo stack come detto cresce verso il basso, cioe' verso indirizzi via via minori. La sua politica di gestione interna e' di tipo LIFO. Come sapete

Dettagli

Antifork Research, Inc. HACKERS RESEARCH VIRTUAL LAB. Shellcode Advanced. Angelo Dell'Aera <buffer@antifork.org> Security Date 2004 Ancona 29/04/2004

Antifork Research, Inc. HACKERS RESEARCH VIRTUAL LAB. Shellcode Advanced. Angelo Dell'Aera <buffer@antifork.org> Security Date 2004 Ancona 29/04/2004 Antifork Research, Inc. HACKERS RESEARCH VIRTUAL LAB Shellcode Advanced Angelo Dell'Aera Security Date 2004 Ancona 29/04/2004 Esplorare mondi nuovi... In questa presentrazione analizzeremo

Dettagli

Esercitazione E7 Immagini

Esercitazione E7 Immagini Esercitazione E7 Immagini Sistemi Operativi (9 CFU), CdL Informatica, A. A. 2013/2014 Dipartimento di Scienze Fisiche, Informatiche e Matematiche Università di Modena e Reggio Emilia http://weblab.ing.unimo.it/people/andreolini/didattica/sistemi-operativi

Dettagli

La protezione dai memory error exploit

La protezione dai memory error exploit Università degli Studi di Milano Sommario Introduzione 1 Stack Guard Terminator Canaries Random Canaries 2 3 Buffer Overflow Stack Guard Introduzione Buffer Overflow Condizione anomala. Memorizzazione

Dettagli

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Calcolatori Elettronici Lezione A4 Programmazione a Moduli Calcolatori Elettronici Lezione A4 Programmazione a Moduli Ing. Gestionale e delle Telecomunicazioni A.A. 2007/08 Gabriele Cecchetti Sommario Programmazione a moduli Programmi con linguaggi misti Tempo

Dettagli

Spazio di indirizzamento virtuale

Spazio di indirizzamento virtuale Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 016-01 Spazio di indirizzamento virtuale Pietro Di Lena - pietro.dilena@unibo.it // The function name says it all int stack_overflow (){

Dettagli

Organizzazione di un SO monolitico

Organizzazione di un SO monolitico Organizzazione di un SO monolitico Applicazioni Interprete di comandi (shell) Interfaccia grafica (desktop) Gestore del Gestore delle processore / Gestore della periferiche/ Scheduler(s) memoria dispositivi

Dettagli

Linguaggi di programmazione. Parte VII. Traduzione e collegamento. Interpretazione. Traduzione

Linguaggi di programmazione. Parte VII. Traduzione e collegamento. Interpretazione. Traduzione Linguaggi di programmazione Parte VII Traduzione e collegamento Linguaggi ad alto livello Maggiore espressività Maggiore produttività Migliore leggibilità Facilità di documentazione Minore controllo dell

Dettagli

Capitolo 5 - Funzioni

Capitolo 5 - Funzioni Capitolo 5 - Funzioni Divide and conquer Introduzione Costruire un programma da pezzi più piccoli o da singole componenti Questi pezzi più piccoli sono chiamati moduli Ogni singolo pezzo è più facilmente

Dettagli

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica Dynamic Linking Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica Dynamic Linking Il linking tra i moduli di un programma e le librerie da esso utilizzate può essere Statico

Dettagli

Scrivere uno shellcode da zero

Scrivere uno shellcode da zero Scrivere uno shellcode da zero Requisiti minimi per capire qualcosa in questo tutorial: Una minima conoscenza del C Una buona conoscenza di GNU/Linux Un'ottima conoscenza dell'assembly Molti programmi

Dettagli

Introduzione C++ Il compilatore. La compilazione in g++ Introduzione a C, C++ e Java. C++ C Java 1977 C 1986 C++ Compilatori Librerie Usare oggetti

Introduzione C++ Il compilatore. La compilazione in g++ Introduzione a C, C++ e Java. C++ C Java 1977 C 1986 C++ Compilatori Librerie Usare oggetti Introduzione a C, C++ e Java Introduzione C++ Compilatori Librerie Usare oggetti 1977 C 1986 C++ a better C con estensioni agli oggetti oggi uno standard industriale 1994 Java C ++ -- C++ C Java programmazione

Dettagli

Sistemi Operativi 1. Mattia Monga. a.a. 2013/14. Dip. di Informatica Università degli Studi di Milano, Italia mattia.monga@unimi.it.

Sistemi Operativi 1. Mattia Monga. a.a. 2013/14. Dip. di Informatica Università degli Studi di Milano, Italia mattia.monga@unimi.it. 1 Mattia Monga Dip. di Informatica Università degli Studi di Milano, Italia mattia.monga@unimi.it a.a. 2013/14 1 cba 2008 14 M. Monga. Creative Commons Attribuzione Condividi allo stesso modo 4.0 Internazionale.

Dettagli

Sistema Operativo - Gestione della Memoria per moderne CPU. Address Binding Dinamico in esecuzione mediante Segmentazione, Paginazione e Memoria

Sistema Operativo - Gestione della Memoria per moderne CPU. Address Binding Dinamico in esecuzione mediante Segmentazione, Paginazione e Memoria Sistema Operativo - Gestione della Memoria per moderne CPU. Address Binding Dinamico in esecuzione mediante Segmentazione, Paginazione e Memoria Virtuale (Swap su Disco Lista Argomenti Concetto di Address

Dettagli

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

ToolChain: Come Generare Applicazioni in Linguaggio Macchina ToolChain: Come Generare Applicazioni in Linguaggio Macchina Luca Abeni e Luigi Palopoli March 30, 2015 La Lingua della CPU Una CPU capisce e riesce ad eseguire solo il linguaggio macchina Linguaggio di

Dettagli

Il linguaggio Assembly

Il linguaggio Assembly Il linguaggio Assembly Linguaggio macchina Linguaggio definito da un insieme di istruzioni, codificate come stringhe di bit, che il processore può interpretare ed eseguire direttamente Linguaggio Assembly

Dettagli

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina Il compilatore C Astrazione Linguaggio macchina implica la conoscenza dei metodi usati per la rappresentazione dell informazioni nella CPU Linguaggio Assembly è il linguaggio delle istruzioni che possono

Dettagli

Linguaggi di programmazione

Linguaggi di programmazione Linguaggi di programmazione Fondamenti di Informatica Daniele Loiacono Ho definito un algoritmo e adesso? Daniele Loiacono Dall algoritmo all esecuzione q Come deve essere formalizzato un algoritmo affinché

Dettagli

Dove siamo. Gestione della Memoria (1) Dove siamo. Dove siamo. Operating Systems and Distributed Systems. Operating Systems and Distributed Systems

Dove siamo. Gestione della Memoria (1) Dove siamo. Dove siamo. Operating Systems and Distributed Systems. Operating Systems and Distributed Systems Dove siamo Gestione della Memoria (1) Dove siamo Dove siamo Gestione della memoria (vista utente) exec() shmalloc() sbrk() getrlimit() File Mgr UNIX Device Mgr Mgr Mgr Application Program Hardware Alloc()

Dettagli

Esercitazione n. 3. Dott. Salvatore Pontarelli

Esercitazione n. 3. Dott. Salvatore Pontarelli Esercitazione n. 3 Dott. Salvatore Pontarelli Struttura di un modulo Assembly Assembly è il linguaggio che l ARM assembler (armasm) legge per produrre il codice oggetto. può essere: ARM assembly language

Dettagli

Processore Danilo Dessì. Architettura degli Elaboratori.

Processore Danilo Dessì. Architettura degli Elaboratori. Processore 8088 Architettura degli Elaboratori Danilo Dessì danilo_dessi@unica.it Subroutine Anche nel linguaggio assemblativo è possibile suddividere un programma in subroutine Per invocare una subroutine

Dettagli

Cosa è un programma. Informatica di Base -- R.Gaeta 18

Cosa è un programma. Informatica di Base -- R.Gaeta 18 Cosa è un programma Il programma è la scatola nera che risolve il problema computazionale; Il programma è una sequenza di istruzioni che devono essere eseguite; Il programma è la traduzione per il computer

Dettagli

Linguaggi e moduli. Dott. Franco Liberati

Linguaggi e moduli. Dott. Franco Liberati (canale A-D) A Linguaggi e moduli Dott. Franco Liberati Linguaggi di programmazione Compilatore Assemblatore Linker (collegatore) LINKER COMPILATORE ASSEMBLATORE LINGUAGGI DI PROGRAMMAZIONE Linguaggio

Dettagli

L ambiente di simulazione SPIM

L ambiente di simulazione SPIM Architettura degli Elaboratori e delle Reti Lezione 14 L ambiente di simulazione SPIM Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano L 14 1/20

Dettagli

Lezione 17: Indirizzamento della memoria LC-3

Lezione 17: Indirizzamento della memoria LC-3 Lezione 17: Indirizzamento della memoria LC-3 Laboratorio di Elementi di Architettura e Sistemi Operativi 22 Maggio 2013 Riassunto sull architettura LC-3 1. Organizzazione della memoria: La memoria è composta

Dettagli

Primi passi col linguaggio C

Primi passi col linguaggio C Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Come introdurre un linguaggio di programmazione? Obiettivi: Introduciamo una macchina astratta

Dettagli

COMPILAZIONE. Tarsformazione di linguaggi

COMPILAZIONE. Tarsformazione di linguaggi COMPILAZIONE Tarsformazione di linguaggi Le fasi della compilazione File sorgente Compilazione File sorgente File sorgente File sorgente Compilazione Compilazione Compilazione Libreria di run-time File

Dettagli

Introduzione al linguaggio C Puntatori

Introduzione al linguaggio C Puntatori Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2016

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

Makefile. Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file

Makefile. Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file Makefile Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file make target C./dir in pratica equivale all'esecuzione del comando make target all'interno

Dettagli

PASSI DI SVILUPPO DI UN PROGRAMMA: ESEMPIO

PASSI DI SVILUPPO DI UN PROGRAMMA: ESEMPIO PASSI DI SVILUPPO DI UN PROGRAMMA: ESEMPIO Programma diviso in due moduli: MA.ASM: programma pricipale e funzioni di utilità MB.ASM: sottoprogramma di elaborazione Primo modulo: MA.ASM EXTRN alfa: BYTE

Dettagli

Modificare il flusso dei files eseguibili in ambiente UNIX

Modificare il flusso dei files eseguibili in ambiente UNIX Modificare il flusso dei files eseguibili in ambiente UNIX Disclaimer: questo tutorial è a scopo illustrativo. L'autore NON è responsabile di eventuali usi non legali delle informazioni qui contenute.

Dettagli

C: panoramica. Violetta Lonati

C: panoramica. Violetta Lonati C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati

Dettagli

Gestione dinamica della memoria

Gestione dinamica della memoria Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 2016-2017 Gestione dinamica della memoria Pietro Di Lena - pietro.dilena@unibo.it A pessimistic programmer sees the array as half empty.

Dettagli

GESTIONE DELLA MEMORIA CENTRALE 6.1 D. - UNICAL

GESTIONE DELLA MEMORIA CENTRALE 6.1 D. - UNICAL GESTIONE DELLA MEMORIA CENTRALE 6.1 Gestione della Memoria Background Spazio di indirizzi Swapping Allocazione Contigua Paginazione 6.2 Background Per essere eseguito un programma deve trovarsi (almeno

Dettagli

Sistemi Operativi. Bruschi Martignoni Monga. La gestione. MINIX Architettura I device driver Block device. Memory driver Implementazione

Sistemi Operativi. Bruschi Martignoni Monga. La gestione. MINIX Architettura I device driver Block device. Memory driver Implementazione 1 Mattia Lezione XXVII: Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia mattia.monga@unimi.it a.a. 2008/09 1 c 2009 M.. Creative Commons Attribuzione-Condividi allo stesso

Dettagli

L insieme delle istruzioni (6)

L insieme delle istruzioni (6) L insieme delle istruzioni (6) Architetture dei Calcolatori (lettere A-I) Alcune note conclusive I due principi dell architettura a programma memorizzato Uso di istruzioni indistinguibili dai dati Uso

Dettagli

Seminario AVP: Obfuscation of Executable Code to Improve Resistance to Static Disassembly

Seminario AVP: Obfuscation of Executable Code to Improve Resistance to Static Disassembly Seminario AVP: Obfuscation of Executable Code to Improve Resistance to Static Disassembly Docente: Agostino Cortesi Anno Accademico: 2006-2007 Furlan Fabio Voltini Christian Argomenti Fasi della compilazione

Dettagli

L ambiente di simulazione SPIM

L ambiente di simulazione SPIM Architettura degli Elaboratori e delle Reti Lezione 14 L ambiente di simulazione SPIM Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano L 14 1/28

Dettagli

Introduzione a Visual Studio 2005

Introduzione a Visual Studio 2005 Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009 Introduzione a Visual Studio 2005 Outline Solutions e Projects Visual Studio e il linguaggio C Visual Studio Schermata

Dettagli

Algoritmo. La programmazione. Algoritmo. Programmare. Procedimento di risoluzione di un problema

Algoritmo. La programmazione. Algoritmo. Programmare. Procedimento di risoluzione di un problema Algoritmo 2 Procedimento di risoluzione di un problema La programmazione Ver. 2.4 Permette di ottenere un risultato eseguendo una sequenza finita di operazioni elementari Esempi: Una ricetta di cucina

Dettagli

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Complementi - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Università degli Studi di Brescia Prof. Massimiliano Giacomin

Dettagli

Il C nel C++: Funzioni

Il C nel C++: Funzioni Il C nel C++: Funzioni Funzioni (1) il concetto -> spezzare il programma in parti (procedure) una funzione è un parte di programma dotata di un nome che può essere richiamata in altri punti del programma

Dettagli

La gestione della memoria. Lezione 16 Sistemi Operativi

La gestione della memoria. Lezione 16 Sistemi Operativi La gestione della memoria Lezione 16 Sistemi Operativi La memoria come risorsa La memoria centrale è una risorsa fondamentale di un sistema di calcolo L accesso a memoria centrale è una delle operazioni

Dettagli

Linguaggi di Programmazione

Linguaggi di Programmazione Linguaggi di Programmazione E una notazione con cui e possibile descrivere gli algoritmi. Programma: e la rappresentazione di un algoritmo in un particolare linguaggio di programmazione. In generale, ogni

Dettagli

Informatica Generale 07 - Sistemi Operativi:Gestione dei processi

Informatica Generale 07 - Sistemi Operativi:Gestione dei processi Informatica Generale 07 - Sistemi Operativi:Gestione dei processi Cosa vedremo: Esecuzione di un programma Concetto di processo Interruzioni Sistemi monotasking e multitasking Time-sharing Tabella dei

Dettagli

Memory management. Le attività di memory management del SO per la condivisione da parte di più processi

Memory management. Le attività di memory management del SO per la condivisione da parte di più processi memory management 1 Memory management Le attività di memory management del SO per la condivisione da parte di più processi Ricordare quali parti della memoria sono attualmente in uso e quali no Allocare/disallocare

Dettagli

Programmazione. Andrea Passerini Informatica. Programmazione

Programmazione. Andrea Passerini Informatica. Programmazione Andrea Passerini passerini@disi.unitn.it Informatica Linguaggi di programmazione Il calcolatore è in grado di comprendere solo istruzioni in linguaggio macchina. Il linguaggio macchina non è adatto alla

Dettagli

Interfaccia del file system

Interfaccia del file system Interfaccia del file system Concetto di file Metodi di accesso Struttura delle directory Protezione 1 Concetto di File Insieme di informazioni correlate, registrate in memoria secondaria, con un nome.

Dettagli

Lezione 15 Il Set di Istruzioni (1)

Lezione 15 Il Set di Istruzioni (1) Lezione 15 Il Set di Istruzioni (1) Vittorio Scarano Architettura Corso di Laurea in Informatica Università degli Studi di Salerno Un quadro della situazione Input/Output Sistema di Interconnessione Registri

Dettagli

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggio C - sezione dichiarativa: costanti e variabili Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - sezione dichiarativa: costanti e variabili La presente

Dettagli

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune. Le strutture Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune. Dichiarazione di una struttura: struct point { int x; int y; }; La dichiarazione di una struttura

Dettagli

Macchina di Riferimento: argomenti

Macchina di Riferimento: argomenti Macchina di Riferimento: argomenti L'architettura di una macchina MIPS Organizzazione della memoria I registri della CPU L'esecuzione dei programmi Il ciclo fetch-execute Il simulatore SPIM 1 Architettura

Dettagli

Modi di indirizzamento del processore MC68000 (parte seconda)

Modi di indirizzamento del processore MC68000 (parte seconda) Corso di Calcolatori Elettronici I Modi di indirizzamento del processore MC68000 (parte seconda) Prof. Roberto Canonico Università degli Studi di Napoli Federico II Facoltà di Ingegneria Corso di Laurea

Dettagli

Informatica ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE. Francesco Tura. F. Tura

Informatica ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE. Francesco Tura. F. Tura Informatica ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE Francesco Tura francesco.tura@unibo.it 1 Lo strumento dell informatico: ELABORATORE ELETTRONICO [= calcolatore = computer] Macchina multifunzionale Macchina

Dettagli

Istruzioni di trasferimento dati

Istruzioni di trasferimento dati Istruzioni di trasferimento dati Leggere dalla memoria su registro: lw (load word) Scrivere da registro alla memoria: sw (store word) Esempio: Codice C: A[8] += h A è un array di numeri interi Codice Assembler:

Dettagli

Architettura dei calcolatori e sistemi operativi. M2 Organizzazione della memoria virtuale Struttura dello spazio virtuale kernel e utente

Architettura dei calcolatori e sistemi operativi. M2 Organizzazione della memoria virtuale Struttura dello spazio virtuale kernel e utente Architettura dei calcolatori e sistemi operativi M2 Organizzazione della memoria virtuale Struttura dello spazio virtuale kernel e utente 18.01.2015 Architettura Intel x64 Lo spazio di indirizzamento virtuale

Dettagli

Comandi principali di Linux (1)

Comandi principali di Linux (1) Laboratorio I Comandi principali di Linux (1) Sintassi: [comando] [opzioni] [argomenti] ls mostra il contenuto di una director l versione lunga a mostra anche i files nascosti che iniziano con. t presenta

Dettagli

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Dettagli

Introduzione al Linguaggio C Corso di Informatica Laurea in Fisica

Introduzione al Linguaggio C Corso di Informatica Laurea in Fisica Introduzione al Linguaggio C Corso di Informatica Laurea in Fisica prof. ing. Corrado Santoro A.A. 2009-10 Dai flow-chart ai linguaggi... Abbiamo imparato ad usare uno strumento formale i flowchart per

Dettagli

Strumenti per l Analisi Statica e Dinamica di Eseguibili

Strumenti per l Analisi Statica e Dinamica di Eseguibili Pattern Recognition and Applications Lab Strumenti per l Analisi Statica e Dinamica di Eseguibili Dott. Ing. Davide Maiorca davide.maiorca@diee.unica.it Corso di Sicurezza Informatica A.A. 2014/2015 Dipartimento

Dettagli

Il compilatore Dev-C++

Il compilatore Dev-C++ Il compilatore Dev-C++ Compilatore per Windows: http://www.bloodshed.net/dev/index.html Oppure dal sito: http://web.tiscali.it/no-redirect-tiscali/adinfo/devcpp4970- gcc295.exe Informatica 1 1 Requisiti

Dettagli

Operazioni su file di caratteri

Operazioni su file di caratteri Operazioni su file di caratteri Apertura fopen Chiusura fclose Scrittura fprintf Lettura fscanf Controllo fine file feof Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1 Apertura di un file: Si

Dettagli

Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione

Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione Fabio Scotti (2004-2009) Laboratorio di programmazione per la sicurezza Valentina Ciriani (2005-2009) Laboratorio di programmazione NOTA IMPORTANTE La preparazione del corso è basata sul seguente materiale

Dettagli

Assembler di Spim. Assembler di SPIM. Struttura di un programma assembler. Direttive

Assembler di Spim. Assembler di SPIM. Struttura di un programma assembler. Direttive Assembler di Spim Assembler di SPIM Il programma è organizzato in linee Ogni linea può contenere un commento che parte dal carattere # e si estende fino alla fine della linea Ogni linea che non sia bianca

Dettagli

Sistemi Operativi 1. Mattia Monga. 6 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Sistemi Operativi 1. Mattia Monga. 6 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia 1 Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia mattia.monga@unimi.it 6 marzo 2007 1 c 2007 M. Monga. Creative Commons Attribuzione-Condividi allo stesso modo 2.5 Italia

Dettagli

IDE DevC

IDE DevC IDE DevC++ 4.9.8.1.0 Manuale utente Data ultima revisione: 22/01/2005 Fondamenti di informatica Università Facoltà Corso di laurea Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria

Dettagli

Università degli Studi di Roma La Sapienza

Università degli Studi di Roma La Sapienza Università degli Studi di Roma La Sapienza Architettura degli elaboratori II Introduzione ai concetti ed al simulatore SPIM Indice degli argomenti Introduzione Assembler, compilatore, linker, programma

Dettagli

Java Native Interface Appunti

Java Native Interface Appunti Java Native Interface Appunti Riccardo Rizzo 1/8 Introduzione L'uso delle Java Native Interface e' giustificato tutte quelle volte che una applicazione non puo' essere scritta interamente in Java. Per

Dettagli

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento Architetture degli Elaboratori e delle Reti Lezione 17 Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento Proff. A. Borghese, F. Pedeini Dipaimento di Scienze dell Informazione Univeità

Dettagli

Buffer Overflow Attacchi ai servizi di rete

Buffer Overflow Attacchi ai servizi di rete Argomenti trattati Buffer Overflow Attacchi ai servizi di rete Avella Gianluigi Cerqua Pasquale Crucil Sergio D Alessandro Oreste Internet I servizi di rete Buffer Overflow: teoria, esempi Tecniche di

Dettagli

VARIABILI LOCALI E GLOBALI (ESTERNE)

VARIABILI LOCALI E GLOBALI (ESTERNE) VARIABILI LOCALI E GLOBALI (ESTERNE) Le variabili locali sono definite (ed il loro uso dichiarato) nella funzione (o nel blocco) che le usa; nascono quando la funzione entra in esecuzione e muoiono al

Dettagli

Question 1: introduction to computer programming

Question 1: introduction to computer programming Question 1: introduction to computer programming Question 1: introduction to computer programming What is a compiler? (4 points). Cos è un compilatore? (4 punti). c 2006 Marco Bernardo 1/14 Question 1:

Dettagli

Introduzione al C++ (continua)

Introduzione al C++ (continua) Introduzione al C++ (continua) I puntatori Un puntatore è una variabile che contiene un indirizzo di memoria pi_greco 3.141592 pi_greco_ptr indirizzo di 3.141592 & DEREFERENZIAZIONE RIFERIMENTO * se x

Dettagli

Sistema Operativo - Gestione della Memoria lista argomenti di studio

Sistema Operativo - Gestione della Memoria lista argomenti di studio Sistema Operativo - Gestione della Memoria lista argomenti di studio Istruzioni assembly salti assoluti salti relativi Linking Rilocazione Statica Istruzioni rilocabili (salti relativi) Istruzioni Non

Dettagli

INTRODUZIONE ALLA PROGRAMMAZIONE. Cosimo Laneve

INTRODUZIONE ALLA PROGRAMMAZIONE. Cosimo Laneve INTRODUZIONE ALLA PROGRAMMAZIONE Cosimo Laneve 1 argomenti (Capitolo 1 Savitch) 1. sistemi di calcolo 2. programmazione e problem solving 3. introduzione a C++ 4. testing e debugging 2 sistema di calcolo

Dettagli

prova.c #include <stdio.h> char funzione(char); codice oggetto del main()

prova.c #include <stdio.h> char funzione(char); codice oggetto del main() prova.c #include char funzione(char); {char c= a ; printf( Ecco il carattere: %c\n,c); c=funzione(c); printf( Ecco il carattere modificato: %c\n,c); char funzione(char tmp) {if(tmp

Dettagli

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore Programma del corso Introduzione agli algoritmi Rappresentazione delle Informazioni Architettura del calcolatore Reti di Calcolatori Elementi di Programmazione Algoritmi e programmi Algoritmo Sequenza

Dettagli

LABORATORIO DI ARCHITETTURA DEI CALCOLATORI lezione n 15

LABORATORIO DI ARCHITETTURA DEI CALCOLATORI lezione n 15 LABORATORIO DI ARCHITETTURA DEI CALCOLATORI lezione n 15 Prof. Rosario Cerbone rosario.cerbone@libero.it http://digilander.libero.it/rosario.cerbone a.a. 2005-2006 L'INDIRIZZAMENTO NEL PROCESSORE MC 68000

Dettagli

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli:

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli: Il comando make Sviluppando programmi complessi, si è spesso portati a suddividere il codice sorgente in diversi file. La fase di compilazione quindi richiede maggior tempo, anche se le modifiche apportate

Dettagli

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri Corso di Calcolatori Elettronici I Subroutine in linguaggio macchina: collegamento e passaggio dei parametri Prof. Roberto Canonico Università degli Studi di Napoli Federico II Facoltà di Ingegneria Corso

Dettagli

Caricamento delle librerie Attaccare il codice al punto giusto è fattibile in fase di linking, producendo un.exe che contiene tutto il necessario.

Caricamento delle librerie Attaccare il codice al punto giusto è fattibile in fase di linking, producendo un.exe che contiene tutto il necessario. M11. LIBRERIE DINAMICHE Fino adesso abbiamo creato programmi a partire dai suoi sorgenti, ciascuno dei quali è compilato separatamente. I singoli file.cpp del nostro progetto sono unità di compilazione,

Dettagli

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri. Sottoprogrammi: richiami

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri. Sottoprogrammi: richiami Corso di Calcolatori Elettronici I Subroutine in linguaggio macchina: collegamento e passaggio dei parametri Prof. Roberto Canonico Università degli Studi di Napoli Federico II Facoltà di Ingegneria Corso

Dettagli

Directory. Le directory unix sono file.

Directory. Le directory unix sono file. Le directory unix sono file. Directory Molte system call per i file ordinari possono essere utilizzate per le directory. E.g. open, read, fstat, close. Tuttavia le directory non possono essere create con

Dettagli

Progetto II: Il linguaggio C e le chiamate di sistema sui processi

Progetto II: Il linguaggio C e le chiamate di sistema sui processi Progetto II: Il linguaggio C e le chiamate di sistema sui processi Scrivere un programma C psstat.c che svolga quanto segue: se invocato senza parametri deve stampare su standard output un istogramma orizzontale

Dettagli