Reverse engineering: disassembly

Похожие документы
Stack-based buffer overflow

La protezione dai memory error exploit

Reverse engineering: executable file format

L insieme delle istruzioni (6)

Cenni ad Assembly Intel

Scrivere uno shellcode da zero

Processore PC. Spazio di indirizzamento. la ALU (Arithmetic and Logic Unit) la FPU (Floating Point Unit)

Assembly. Modello x86

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Tutta la famiglia dei processori Intel (x86) si basa ed e' compatibile con il primo processore di questo tipo: l'8086.

Architettura di una CPU

L assembler INTEL IA32. Luigi Palopoli

1 Esercizi con architettura a 1 bus

Strutture di controllo in C++

Programmazione Assembly per 8088: Esercizi svolti

Capire e sfruttare gli stack buffer overflows

Il livello architettura e set di istruzioni

L ambiente di simulazione SPIM

Bypassare la richiesta di serial di un gioco

Lecture 2: Prime Istruzioni

Reverse engineering: executable file format

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

PROGRAMMAZIONE MISTA. G. Frosini Programmazione mista Slide 1

ASM: catena di compilazione

Hardware di un Computer

Istruzioni di modifica della sequenza di elaborazione

Allocazione dinamica della memoria

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Esercizi su microistruzioni. 1 Esercizi con architettura a 1 bus

Linguaggio macchina e linguaggio assembly

Riassunto. Riassunto. Ciclo fetch&execute. Concetto di programma memorizzato. Istruzioni aritmetiche add, sub, mult, div

Architettura del Set di Istruzioni (ISA)

COMPITINO #1 di CALCOLATORI ELETTRONICI 1 del COGNOME NOME

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Esercitazione n. 3. Dott. Salvatore Pontarelli

Linguaggio C - sezione dichiarativa: costanti e variabili

Malware. Roberto Paleari, Alessandro Rinaldi

Architettura degli Elaboratori

Perché il linguaggio C?

Linguaggio macchina e linguaggio assembler

Primi passi col linguaggio C

Programmazione Assembly

Corso di Sicurezza Informatica

1 ocean, MOCA Introduzione all'analisi dei malware

A#acchi Base: Buffer Overflow

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

PASSI DI SVILUPPO DI UN PROGRAMMA: ESEMPIO

Architettura degli Elaboratori

Gestione dei file. File di testo e binari

Interazione con il DOS e il BIOS

Excel & VBA. Excel e Visual Basic for Application

Il linguaggio assembly

Scrittura formattata - printf

Consideriamo un vettore allocato dinamicamente

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Il linguaggio C. Notate che...

Processore Danilo Dessì. Architettura degli Elaboratori.

Le costanti Le modalità di indirizzamento L assembly del MIPS

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Linguaggio Assembler Intel 80x86. Calcolatori Elettronici B a.a. 2004/2005 Massimiliano Giacomin

Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j

Транскрипт:

Università degli Studi di Milano Facoltà di Scienze e Tecnologie Dipartimento di Informatica Reverse engineering: disassembly Lanzi Andrea <andrew@security.di.unimi.it> A.A. 2014 2015 Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 1 / 16

Tecniche statiche Disassembly Cos è? stream of bytes disassembly sequence of assembly instructions Esempio $ echo -ne "\x89\x04\x24\xc3" ndisasm -u - 00000000 890424 mov [esp],eax 00000003 C3 ret Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 2 / 16

Tecniche statiche Disassembly Indecidibilità della separazione tra codice e dati Intel x86: 248/256 byte rappresentano l inizio di un istruzione valida Esempio... 0x81 0xc3 0x90 0x90 0x90 0x90... se consideriamo il byte 0x81 come codice: $ echo -ne \x81\xc3\x90\x90\x90\x90 ndisasm -b32-00000000 81C390909090 add ebx,0x90909090 se consideriamo il byte 0x81 come data e il byte 0xc3 come codice: $ echo -ne \xc3\x90\x90\x90\x90 ndisasm -b32-00000000 C3 ret 00000001 90 nop 00000002 90 nop 00000003 90 nop 00000004 90 nop Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 3 / 16

Disassembly Problema: esplosione di complessità 1 int main(int argc, char argv) 2 { 3 int num; 4 5 scanf( %d, &num); 6 7 if(num == 1234) 8 printf( ok\n ); 9 else 10 printf( no\n ); 11 12 return 0; 13 } Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 4 / 16

Disassembly Problema: esplosione di complessità push %ebp push %ebx leave lea -1(%eax),%esi add $0xc,%esp mov %esp,%ebp sub $0x4,%esp ret nop cmp $-1,%esi pop %ebx sub $0x8,%esp call 8048310 push %ebp je 8048419 pop %esi call 8048304 pop %ebx call 8048360 mov %esp,%ebp lea 0x0(%esi),%esi pop %edi add $0x12c8,%ebx call *(%edi,%esi,4) call 8048490 mov -4(%ebx),%edx sub $0x18,%esp pop %ebp leave dec %esi ret test %edx,%edx and $-16,%esp ret cmp $-1,%esi mov (%esp),%ebx pushl 0x80495dc je 8048326 mov $0x0,%eax jne 8048410 ret jmp *0x80495e0 call 80482d0 add $0xf,%eax lea 0x0(%esi),%esi nop... add %al,(%eax) pop %eax add $0xf,%eax call 80484c4 push %ebp jmp *0x80495e4 pop %ebx shr $0x4,%eax add $0xc,%esp mov %esp,%ebp push $0x0 leave shl $0x4,%eax pop %ebx ret push %ebx jmp 8048290 sub %eax,%esp nop pop %esi jmp *0x80495e8... sub $0x4,%esp lea -4(%ebp),%eax pop %edi push %ebp mov 0x80494f8,%eax push $0x8 mov %eax,0x4(%esp) pop %ebp jmp 8048290 mov %esp,%ebp cmp $-1,%eax movl $0x80484e8,(%esp) ret jmp *0x80495ec sub $0x8,%esp je 80484bd call 80482b0 lea 0x0(%esi),%esi push $0x10 cmpb $0x0,0x8049600 mov -4(%ebp),%eax mov $0x80494f8,%ebx push %ebp jmp 8048290 je 804834b cmp $0x4d2,%eax lea 0x0(%esi),%esi mov %esp,%ebp jmp *0x80495f0 jmp 804835d jne 80483cb lea 0x0(%edi),%edi push %edi push $0x18 add $0x4,%eax call *%eax movl $0x80484eb,(%esp) push %esi mov -4(%ebx),%eax jmp 8048290 mov %eax,0x80495fc call 80482a0 xor %ebp,%ebp call *%edx jmp 80483d7 push %ebx sub $0x4,%ebx call 8048483 mov 0x80495fc,%eax movl $0x80484ee,(%esp) cmp $-1,%eax pop %esi add $0x119d,%ebx mov (%eax),%edx call 80482a0 jne 80484b0 mov %esp,%ecx sub $0xc,%esp test %edx,%edx mov $0x0,%eax pop %eax and $-16,%esp jne 8048341 leave call 8048278 push %eax ret lea -224(%ebx),%eax pop %ebx movb $0x1,0x8049600 nop push %esp leave... lea -224(%ebx),%edx pop %ebp push %edx ret push %ebp sub %edx,%eax ret nop nop mov %esp,%ebp sar $0x2,%eax... push $0x80483e0 push %ebp mov %eax,-16(%ebp) push %ebp push %edi push $0x8048430 mov %esp,%ebp je 804847b mov %esp,%ebp push %esi push %ecx sub $0x8,%esp xor %edi,%edi push %ebx push %ebx push %esi mov 0x8049508,%eax mov %edx,%esi sub $0x4,%esp call 8048483 push $0x8048384 test %eax,%eax add $0x11ed,%ebx lea 0x0(%esi),%esi call 80484d0 call 80482c0 je 8048381 sub $0xc,%esp lea 0x0(%edi),%edi pop %ebx hlt nop mov $0x0,%eax inc %edi add $0x1108,%ebx lea -224(%ebx),%eax nop test %eax,%eax call *(%esi) call 8048330 lea -224(%ebx),%edi push %ebp je 8048381 add $0x4,%esi pop %ecx sub %edi,%eax mov %esp,%ebp movl $0x8049508,(%esp) cmp %edi,-16(%ebp) pop %ebx sar $0x2,%eax jne 8048470 leave call *%eax ret Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 4 / 16

Disassembly Instruction set istruzioni a lunghezza fissa ogni istruzione inizia ad un indirizzo multiplo della sua lunghezza istruzioni a lunghezza variabile disassembly difficoltoso il processo di disassembly può desincronizzarsi Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 5 / 16

Disassembly Instruction set istruzioni a lunghezza fissa ogni istruzione inizia ad un indirizzo multiplo della sua lunghezza istruzioni a lunghezza variabile disassembly difficoltoso il processo di disassembly può desincronizzarsi Problemi interposizione di dati e istruzioni nello stesso address space (come distinguerli?) istruzioni di lunghezza variabile trasferimenti di controllo indiretti (function pointer, dynamic linking, jump table,... ) Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 5 / 16

Disassembly Problemi 2 Nella fase di compilazione si perdono: nomi delle variabili informazioni sui tipi concetto di blocco macro commenti Problemi 3 riconoscere i limiti delle funzioni distinguere i parametri delle funzioni Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 6 / 16

Disassembly Sintassi AT&T vs Intel $ objdump -M att -d /bin/ls... push %ebp xor %ecx,%ecx mov %esp,%ebp sub $0x8,%esp mov %ebx,(%esp) mov 0x8(%ebp),%ebx mov %esi,0x4(%esp) mov 0xc(%ebp),%esi mov (%ebx),%edx mov 0x4(%ebx),%eax xor 0x4(%esi),%eax xor (%esi),%edx or %edx,%eax je 8049c60 <exit@plt+0x13c> mov %ecx,%eax mov (%esp),%ebx mov 0x4(%esp),%esi mov %ebp,%esp pop %ebp ret $ objdump -M intel -d /bin/ls... push ebp xor ecx,ecx mov ebp,esp sub esp,0x8 mov DWORD PTR [esp],ebx mov ebx,dword PTR [ebp+0x8] mov DWORD PTR [esp+0x4],esi mov esi,dword PTR [ebp+0xc] mov edx,dword PTR [ebx] mov eax,dword PTR [ebx+0x4] xor eax,dword PTR [esi+0x4] xor edx,dword PTR [esi] or eax,edx je 8049c60 <exit@plt+0x13c> mov eax,ecx mov ebx,dword PTR [esp] mov esi,dword PTR [esp+0x4] mov esp,ebp pop ebp ret Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 7 / 16

Disassembly Esempio 08048350 B8 66 83 04 08 mov $0x8048366,%eax 08048355 FF D0 call *%eax 08048357 C3 ret 08048358 48 65 6C 6C 6F 20 57 (data) 0804835F 6F 72 6C 64 21 0A 0D (data) 08048366 BA 0E 00 00 00 mov $0xe,%edx 0804836B B9 58 83 04 08 mov $0x8048358,%ecx 08048370 BB 00 00 00 00 mov $0x0,%ebx 08048375 B8 04 00 00 00 mov $0x4,%eax 0804837A CD 80 int $0x80 0804837C B8 00 00 00 00 mov $0x0,%eax 08048381 C3 ret Tecniche utilizzate linear sweep disassembly recursive traversal disassembly Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 8 / 16

Linear sweep disassembly (e.g., objdump) inizia al primo byte del segmento testo procedi decodificando un istruzione dopo l altra $ objdump -D file assunzione: istruzioni memorizzate in locazioni adiacenti 08048350 B8 66 83 04 08 mov $0x8048366,%eax 08048355 FF D0 call *%eax 08048357 C3 ret 08048358 48 dec %eax 08048359 65 gs 0804835A 6C insb (%dx),%es:(%edi) 0804835B 6C insb (%dx),%es:(%edi) 0804835C 6F outsl %ds:(%esi),(%dx) 0804835D 20 57 6F and %dl,0x6f(%edi) 08048360 72 6C jb 0x80483ce 08048362 64 21 0A and %ecx,%fs:(%edx) 08048365 0D BA 0E 00 00 or $0xeba,%eax 0804836A 00 B9 58 83 04 08 add %bh,0x8(%ecx) 08048370 BB 00 00 00 00 mov $0x0,%ebx 08048375 B8 04 00 00 00 mov $0x4,%eax 0804837A CD 80 int $0x80 0804837C B8 00 00 00 00 mov $0x0,%eax 08048381 C3 ret Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 9 / 16

Linear sweep disassembly (e.g., objdump) inizia al primo byte del segmento testo procedi decodificando un istruzione dopo l altra $ objdump -D file assunzione: istruzioni memorizzate in locazioni adiacenti 08048350 B8 66 83 04 08 mov $0x8048366,%eax 08048355 FF D0 call *%eax 08048357 C3 ret 08048358 48 dec %eax IA-32 disassembly 08048359 65 gs 0804835A 6C insb (%dx),%es:(%edi) è self-repairing 0804835B 6C insb (%dx),%es:(%edi) 0804835C 6F outsl %ds:(%esi),(%dx) 0804835D 20 57 6F and %dl,0x6f(%edi) 08048360 72 6C jb 0x80483ce 08048362 64 21 0A and %ecx,%fs:(%edx) 08048365 0D BA 0E 00 00 or $0xeba,%eax 0804836A 00 B9 58 83 04 08 add %bh,0x8(%ecx) 08048370 BB 00 00 00 00 mov $0x0,%ebx 08048375 B8 04 00 00 00 mov $0x4,%eax 0804837A CD 80 int $0x80 0804837C B8 00 00 00 00 mov $0x0,%eax 08048381 C3 ret Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 9 / 16

Recursive traversal disassembly (e.g., IDA Pro) 1 inizia dall entry point 2 quando incontri un istruzione di branch: determina possibili successori riprendi il disassemby a questi indirizzi 08048350 B8 66 83 04 08 mov $0x8048366,%eax 08048355 FF D0 call *%eax 08048357 C3 ret Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 10 / 16

Control flow graph Cos è? struttura fondamentale in program analysis grafo orientato in cui: nodi: computazioni (basic block) archi: possibili flussi di esecuzione Basic block sequenza non interrompibile di istruzioni singolo entry point singolo exit point Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 11 / 16

B1: if n<=0 goto B2 1 int find max(int v, int n) 2 { 3 unsigned int max, i; 4 int ris; 5 6 if(n <= 0) 7 ris = 1; 8 else { 9 max = v[0]; 10 i = 1; 11 while(i < n) { 12 if(v[i] > max) 13 max = v[i]; 14 i = i + 1; 15 } 16 ris = max; 17 } 18 return ris; 19 } True B2: ris := -1 False B6: ris := max B3: max := v[0] i = 1 B4: if i<n goto B5 B5: if v[i]>max goto B7 True B7: max := v[i] False True False B9: ret ris B8: i := i + 1

Call graph Cos è? grafo orientato C = (R, F ) i nodi rappresentano procedure gli archi sono relazioni chiamante-chiamato se (r i, r j ) R, nel corso di r i si ha almeno una chiamata a r j Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 13 / 16

Call graph Cos è? grafo orientato C = (R, F ) i nodi rappresentano procedure gli archi sono relazioni chiamante-chiamato se (r i, r j ) R, nel corso di r i si ha almeno una chiamata a r j Esempio P 1 P 3 P 2 P 4 Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 13 / 16

Memorabilia Regola #1 di IDA Everything you see and you do, you are working on the database. Changes are NOT automatically reflected to the binary. Regola #2 di IDA There are plenty of things you can do. But there is no undo. sub xxxx: a function at address xxxx loc xxxx: an instruction at address xxxx (byte word dword) xxxx: data at address xxxx var xx: local variable at EBP-xx arg n: argument at EBP+8+n https://www.hex-rays.com/products/ida/support/ freefiles/ida_pro_shortcuts.pdf Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 14 / 16

Homework #3 http://security.di.unimi.it/sicurezza1314/homeworks/homework3.tar.gz U tilizzando IDA (!hexrays), reversare gli ELF scaricati. Ogni programma contiene una chiave che può essere individuata staticamente e confermata eseguendo il programma e fornendo in input la chiave. Scrivere una breve relazione (pdf/txt), contenente, programma: la chiave individuata come l avete individuata/estratta descrizione alto livello del programma Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 15 / 16

Bibliografia & Utilities G. Vigna Malware Detection, chapter Static Disassembly and Code Analysis C. Eagle The IDA Pro Book: The Unofficial Guide to the World s Most Popular Disassembler Intel 64 and IA-32 Architectures Software Developers Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, A-Z http://ref.x86asm.net/coder32.html Andrea Lanzi Reverse engineering: disassembly A.A. 2014 2015 16 / 16