Slijede razlike između dviju inačica stranice.
Starije izmjene na obje strane Starija izmjena Novija izmjena | Starija izmjena | ||
racfor_wiki:seminari:analiza_datotecnog_formata_elf [2023/01/12 20:25] mf51454 [Analiza ELF datoteke] |
racfor_wiki:seminari:analiza_datotecnog_formata_elf [2023/06/19 18:17] (trenutno) |
||
---|---|---|---|
Redak 1: | Redak 1: | ||
===== Sažetak ===== | ===== Sažetak ===== | ||
- | Format ELF (engl. // | + | Format ELF (engl. // |
===== Uvod ===== | ===== Uvod ===== | ||
Redak 12: | Redak 13: | ||
Svaka ELF datoteka sastoji se ELF zaglavlja (koje je obavezno), nakon kojeg slijede dvije tablice: //program header table// i //section header table//. Te dvije tablice dalje pobliže opisuju strukturu datoteke. | Svaka ELF datoteka sastoji se ELF zaglavlja (koje je obavezno), nakon kojeg slijede dvije tablice: //program header table// i //section header table//. Te dvije tablice dalje pobliže opisuju strukturu datoteke. | ||
+ | |||
+ | **Slika 1** prikazuje grubu strukturu tipične ELF datoteke. Na početku (bez odmaka) se nalazi ELF zaglavlje. Na određenom odmaku od ELF zaglavlja nalazi se tablica //program header table// koja opisuje različite segmente. Na nekom drugom odmaku od ELF zaglavlja nalazi se tablica //section header table// koja pak opisuje različite sekcije datoteke. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | **Slika 1**: Općenita struktura ELF datoteke [[https:// | ||
==== ELF zaglavlje ==== | ==== ELF zaglavlje ==== | ||
Redak 32: | Redak 39: | ||
i još toga. Detaljniji opis strukture ELF zaglavlja može se pronaći u [1] i [2]. | i još toga. Detaljniji opis strukture ELF zaglavlja može se pronaći u [1] i [2]. | ||
+ | ==== Program header table ==== | ||
+ | //Program header table// sastoji se od niza zaglavlja, svako naziva //program header//. Broj tih zaglavlja ovisi o datoteci, a može ih biti prisutno nula ili više. | ||
+ | Zaglavlja tipa //program header// opisuju informacije koje su bitne za pokretanje i izvođenje datoteke, tj. za njen // | ||
+ | Konkretnije, | ||
+ | |||
+ | Detaljniji opis strukture tablice //program header table// može se pronaći u [1] i [2]. | ||
+ | |||
+ | ==== Section header table ==== | ||
+ | |||
+ | //Section header table// čini nula ili više zaglavlja tipa //section header//. Ta zaglavlja sadrže informacije o sekcijama datoteke. Naime, dok segmenti nose informacije bitne za // | ||
+ | |||
+ | Tipovi sekcija koji se mogu najčešće naći u izvršnim datotekama jesu: | ||
+ | * //.text// - sadrži instrukcije, | ||
+ | * //.data// - predstavlja inicijalizirane statičke varijable, | ||
+ | * //.rodata// - predstavlja konstante, | ||
+ | * //.bss// - predstavlja neinicijalizirane statičke varijable. | ||
+ | |||
+ | Detaljniji opis strukture tablice //section header table// može se pronaći u [1] i [2]. | ||
===== Analiza ELF datoteke ===== | ===== Analiza ELF datoteke ===== | ||
+ | Poznavanje strukture ELF datoteka osobito je korisno za forenziku datoteka. Kao što je već opisano, ELF datoteke specifično su posložene i sadrže brojne podatke na temelju kojih forenzičari mogu izvući korisne informacije o datoteci, a koje nisu očigledne na prvi pogled. U nastavku je stoga navedeno nekoliko primjera analize ELF datoteka. | ||
+ | Iako je za analizu ELF datoteke moguće upotrijebiti običan //hex editor//, postoje i alati koji mogu olakšati taj proces. Neki od jednostavnijih i popularnijih alata za tu svrhu su: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | Analize u nastavku fokusiraju se na korištenje alata '' | ||
+ | Kao radni primjer poslužit će jednostavan "Hello World" program, napisan u programskom jeziku C. | ||
+ | <file c hello.c> | ||
+ | #include < | ||
+ | int main(void) | ||
+ | { | ||
+ | printf(" | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
- | ===== Zaključak ===== | + | ==== Primjer 1 ==== |
+ | Ovaj primjer ilustrira analizu tipa ELF datoteke. Naime, promatranjem vrijednosti iz ELF zaglavlja moguće je odrediti radi li se o izvršnoj datoteci, objektnoj datoteci ili nekom drugom tipu datoteke. | ||
+ | Prevedimo za početak program '' | ||
+ | |||
+ | < | ||
+ | gcc hello.c -o hello | ||
+ | </ | ||
+ | |||
+ | Također, transformirajmo program u čisti objektni kod: | ||
+ | |||
+ | < | ||
+ | gcc -c hello.c | ||
+ | </ | ||
+ | |||
+ | Time je nastala datoteka '' | ||
+ | |||
+ | Tu razliku očekujemo vidjeti i analizom njihovih ELF zaglavlja. | ||
+ | |||
+ | Alat '' | ||
+ | |||
+ | < | ||
+ | $ file hello | ||
+ | hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter / | ||
+ | </ | ||
+ | |||
+ | Isti alat za objektnu datoteku '' | ||
+ | |||
+ | < | ||
+ | $ file hello.o | ||
+ | hello.o: ELF 64-bit LSB relocatable, | ||
+ | </ | ||
+ | |||
+ | Dakle, jasno je vidljiva razlika, izvršna datoteka '' | ||
+ | |||
+ | Ista je razlika vidljiva ako se za provjeru koristi alat '' | ||
+ | |||
+ | Ispis za datoteku '' | ||
+ | |||
+ | < | ||
+ | $ readelf -h hello | ||
+ | ELF Header: | ||
+ | Magic: | ||
+ | Class: | ||
+ | Data: 2's complement, little endian | ||
+ | Version: | ||
+ | OS/ | ||
+ | ABI Version: | ||
+ | Type: DYN (Position-Independent Executable file) | ||
+ | Machine: | ||
+ | Version: | ||
+ | Entry point address: | ||
+ | Start of program headers: | ||
+ | Start of section headers: | ||
+ | Flags: | ||
+ | Size of this header: | ||
+ | Size of program headers: | ||
+ | Number of program headers: | ||
+ | Size of section headers: | ||
+ | Number of section headers: | ||
+ | Section header string table index: 30 | ||
+ | </ | ||
+ | |||
+ | Ispis za datoteku '' | ||
+ | |||
+ | < | ||
+ | $ readelf -h hello.o | ||
+ | ELF Header: | ||
+ | Magic: | ||
+ | Class: | ||
+ | Data: 2's complement, little endian | ||
+ | Version: | ||
+ | OS/ | ||
+ | ABI Version: | ||
+ | Type: REL (Relocatable file) | ||
+ | Machine: | ||
+ | Version: | ||
+ | Entry point address: | ||
+ | Start of program headers: | ||
+ | Start of section headers: | ||
+ | Flags: | ||
+ | Size of this header: | ||
+ | Size of program headers: | ||
+ | Number of program headers: | ||
+ | Size of section headers: | ||
+ | Number of section headers: | ||
+ | Section header string table index: 13 | ||
+ | </ | ||
+ | |||
+ | Ipak, ovdje je dodatno vidljiva još jedna zanimljivost, | ||
+ | |||
+ | ==== Primjer 2 ==== | ||
+ | |||
+ | |||
+ | Ovaj primjer ilustrira razliku između statički povezane izvršne datoteke i dinamički povezane izvršne datoteke. | ||
+ | |||
+ | Statički povezanu izvršnu datoteku moguće je dobiti predajom zastavice '' | ||
+ | |||
+ | < | ||
+ | gcc -static hello.c -o hello_static | ||
+ | </ | ||
+ | |||
+ | Dobivenu datoteku najlakše je analizirati alatom '' | ||
+ | |||
+ | < | ||
+ | $ file hello_static | ||
+ | hello_static: | ||
+ | </ | ||
+ | |||
+ | Dinamički povezanu izvršnu datoteku zapravo ne treba posebno pripremati jer je to zadano ponašanje alata '' | ||
+ | |||
+ | Vidljivo je da alat '' | ||
+ | ===== Zaključak ===== | ||
+ | |||
+ | Kao što je pokazano na primjerima, iz ELF datoteka moguće je izvući brojne korisne informacije. Primjerice, može se identificirati tip datoteke ili arhitektura za koju je datoteka pripremljena. Od naprednijih pristupa, poznavanjem ulazne točke programa u kombinaciji s informacijama o segmentima, moguće je odrediti (ili barem procijeniti) kako će datoteka biti učitana u memoriju i na koje lokacije te kako će se ponašati prilikom izvršavanja. Dakako, moguće su još i razne druge, složenije analize. Razumijevanje strukture ELF datoteka stoga je vrijedna vještina za forenzičare. | ||
===== Literatura ===== | ===== Literatura ===== | ||
Redak 57: | Redak 211: | ||
[5] [[https:// | [5] [[https:// | ||
+ | |||
+ | [6] [[https:// | ||