Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
Prijevodi ove stranice:

Ovo je stara izmjena dokumenta!


Sažetak

Format ELF (engl. Executable and Linkable Format) glavni je format za izvršne datoteke, objektne datoteke i biblioteke na Linux-u i drugim, UNIX-u sličnim, operacijskim sustavima. Zbog raširenosti ovog formata, važno je poznavati njegova svojstva i strukturu, što može biti od znatne pomoći u forenzici datoteka. Ovdje je stoga opisana općenita struktura ELF datoteka, predstavljeni su alati za njihovu analizu te je objašnjen značaj poznavanja formata ELF iz perspektive računalne forenzike.

Uvod

Format ELF, u kratici za Executable and Linkable Format, datotečni je format koji služi za pohranu izvršnih programa, objektnih datoteka i dijeljenih biblioteka. Svojevrsni je analogon formatu PE kojim su predstavljene izvršne datoteke na operacijskom sustavu Windows.

Umjesto poznate ekstenzije .exe koju koriste izvršne PE datoteke, izvršne ELF datoteke u pravilu uopće nemaju ekstenziju. Ostale ELF datoteke, kojima je predstavljen objektni kod, najčešće imaju ekstenziju .o, dok dijeljene biblioteke najčešće imaju ekstenziju .so. U uporabi su i ekstenzije poput .elf, .bin, i ostalih.

Zbog svoje fleksibilnosti, ELF je danas prisutan na mnogim operacijskim sustavima i arhitekturama. Najčešće ga se može pronaći na operacijskim sustavima naliku na UNIX, kao što su: Linux, FreeBSD, OpenBSD, NetBSD, Solaris, i ostali. (Važno je naglasiti da macOS nije na tom popisu; macOS i iOS koriste poseban format, zvan Mach-O.) Ipak, osim navedenih, ELF se koristi i na mnogim drugim operacijskim sustavima, čak i onima koji ne vuku korijene iz UNIX-a. Osim toga, ELF je prisutan i na nekim igraćim konzolama, kao što su: PlayStation (sve iteracije), Nintendo 64, GameCube, Wii, Wii U, i ostali. Nije začuđujuće da je ELF datoteke moguće pronaći i na mobilnim operacijskim sustavima. Od mobilnih operacijskih sustava koji koriste ELF, Android je trenutno glavni predstavnik.

Struktura ELF 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. Izvor

ELF zaglavlje

ELF zaglavlje duljine je 52 bajta za 32-bitnu arhitekturu, a duljine 64 bajta za 64-bitnu arhitekturu. Prva četiri bajta zaglavlja čini magični broj koji definira da se radi o datoteci formatiranoj u ELF. Ta četiri magična bajta redom su: 0x7F, 0x45, 0x4C, 0x46. To jest, na prvom je mjestu bajt 0x7F, iza kojega slijede znakovi 'E', 'L' i 'F', kodirani u ASCII.

Nastavak zaglavlja opisuje, između ostaloga:

  • arhitekturu (32-bitna ili 64-bitna),
  • informaciju koristi li se vrsta zapisa little-endian ili big-endian,
  • verziju zaglavlja,
  • operacijski sustav, tj. ciljani ABI (engl. application binary interface),
  • tip datoteke (relocatable, executable, shared object ili core file),
  • ciljanu arhitektura procesora, tj. ciljani instruction set architecture,
  • ulaznu točku programa (engl. entry point),
  • početak i veličinu tablice program header table,
  • početak i veličinu tablice section header table,

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 run-time. Pomoću informacija iz tih zaglavlja, operacijski sustav zna kako kreirati proces iz datoteke. Stoga program header table ima smisla samo za izvršne datoteke i dijeljene objektne datoteke.

Konkretnije, svaki program header opisuje jedan memorijski segment, a svaki se pak segment sastoji od nula ili više sekcija. Ti su segmenti zapravo dijelovi koji se učitavaju u memoriju prilikom podizanja datoteke u proces. Način kako se to točno događa detaljnije je opisan u [3].

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 run-time, sekcije pak nose informacije koje se koriste prilikom povezivanja (engl. linking) datoteke.

Tipovi sekcija koji se mogu najčešće naći u izvršnim datotekama jesu:

  • .text - sadrži instrukcije, tj. izvršni kod,
  • .data - predstavlja inicijalizirane statičke varijable,
  • .rodata - predstavlja konstante,
  • .bss - predstavlja neinicijalizirane statičke varijable.

Analiza ELF datoteke

hello.c
#include <stdio.h>
 
int main(void)
{
	printf("Hello World!\n");	
	return 0;
}

Zaključak

Literatura

racfor_wiki/seminari/analiza_datotecnog_formata_elf.1673559576.txt.gz · Zadnja izmjena: 2023/06/19 18:15 (vanjsko uređivanje)
Dieses Dokuwiki verwendet ein von Anymorphic Webdesign erstelltes Thema.
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0