PATULJAK

Razumijevanje ELF formata datoteke

Razumijevanje ELF formata datoteke

Od izvornog koda do binarnog koda

Programiranje započinje pametnom idejom i pisanjem izvornog koda na programskom jeziku po vašem izboru, na primjer C, te spremanjem izvornog koda u datoteku. Uz pomoć odgovarajućeg prevoditelja, na primjer GCC, vaš se izvorni kod prvo prevodi u objektni kod. Na kraju, povezivač prevodi objektni kôd u binarnu datoteku koja povezuje objektni kod s referenciranim knjižnicama. Ova datoteka sadrži pojedinačne upute kao strojni kôd koje CPU razumije i izvršavaju se čim se izvrši kompajlirani program.

Gore spomenuta binarna datoteka slijedi specifičnu strukturu, a jedna od najčešćih naziva je ELF koja skraćuje Izvršni i Povezivi format. Široko se koristi za izvršne datoteke, objektne datoteke koje se mogu premjestiti, zajedničke knjižnice i odlagališta jezgre.

Prije dvadeset godina - 1999. godine - projekt 86open odabrao je ELF kao standardni binarni format datoteke za Unix i Unix-like sustave na x86 procesorima. Srećom, ELF format prethodno je dokumentiran i u binarnom sučelju aplikacije System V i u Standard Interface za alate [4]. Ova činjenica je izuzetno pojednostavila sporazum o standardizaciji između različitih dobavljača i programera operativnih sustava temeljenih na Unixu.

Razlog te odluke bio je dizajn ELF-a - fleksibilnost, proširivost i podrška na više platformi za različite endanske formate i veličine adresa. ELF-ov dizajn nije ograničen na određeni procesor, skup uputa ili hardversku arhitekturu. Za detaljnu usporedbu formata izvršnih datoteka pogledajte ovdje [3].

Od tada, ELF format koristi nekoliko različitih operativnih sustava. Između ostalih, to uključuje Linux, Solaris / Illumos, Free-, Net- i OpenBSD, QNX, BeOS / Haiku i Fuchsia OS [2]. Nadalje, pronaći ćete ga na mobilnim uređajima sa sustavima Android, Maemo ili Meego OS / Sailfish OS, kao i na igraćim konzolama poput PlayStation Portable, Dreamcast i Wii.

Specifikacija ne pojašnjava proširenje naziva datoteke za ELF datoteke. U uporabi su razne kombinacije slova, kao što su .axf, .kanta za smeće, .patuljak, .o, .prx, .napuhati, .ko, .tako, i .mod ili nikakav.

Struktura ELF datoteke

Na Linux terminalu, naredba man elf daje vam praktičan sažetak o strukturi ELF datoteke:

Popis 1: Rukopis ELF strukture

$ man vilenjak
ELF (5) Priručnik za programera za Linux ELF (5)
IME
elf - format izvršnih datoteka i datoteka povezivanja (ELF)
SINOPSIS
#include
OPIS
Datoteka zaglavlja definira format ELF izvršne binarne datoteke
datoteke. Među tim datotekama su normalne izvršne datoteke koje se mogu premjestiti
objektne datoteke, osnovne datoteke i zajedničke knjižnice.
Izvršna datoteka koja koristi format ELF datoteke sastoji se od ELF zaglavlja,
nakon čega slijedi tablica zaglavlja programa ili tablica zaglavlja odjeljka ili oboje.
ELF zaglavlje je uvijek na nuli odmaka datoteke. Program
tablica zaglavlja i pomak tablice zaglavlja odjeljka u datoteci su
definirano u zaglavlju ELF. Dvije tablice opisuju ostatak
posebnosti datoteke.
..

Kao što možete vidjeti iz gornjeg opisa, ELF datoteka sastoji se od dva odjeljka - ELF zaglavlja i podataka datoteke. Odjeljak podataka datoteke može se sastojati od tablice zaglavlja programa koja opisuje nula ili više segmenata, tablice zaglavlja odjeljka koja opisuje nula ili više odjeljaka, nakon čega slijede podaci na koje se pozivaju unosi iz tablice zaglavlja programa i tablice zaglavlja odjeljka. Svaki segment sadrži informacije potrebne za izvršavanje datoteke tijekom izvođenja, dok odjeljci sadrže važne podatke za povezivanje i premještanje. Slika 1 shematski to ilustrira.

ELF zaglavlje

ELF zaglavlje dugo je 32 bajta i identificira format datoteke. Počinje nizom od četiri jedinstvena bajta koji su 0x7F, a zatim 0x45, 0x4c i 0x46 što se prevodi u tri slova E, L i F. Između ostalih vrijednosti, zaglavlje također ukazuje je li riječ o ELF datoteci za 32 ili 64-bitni format, koristi li malo ili veliko trajanje, prikazuje verziju ELF-a, kao i za koji operativni sustav je datoteka sastavljena kako bi se surađivalo desno binarno sučelje aplikacije (ABI) i skup instrukcija CPU-a.

Hexdump dodira binarne datoteke izgleda kako slijedi:

.Popis 2: Hexdump binarne datoteke

$ hd / usr / bin / touch | glava -5
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF… |
00000010 02 00 3e 00 01 00 00 00 e3 25 40 00 00 00 00 00 |…>…% @… |
00000020 40 00 00 00 00 00 00 00 28 e4 00 00 00 00 00 00 | @… (… |
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1b 00 1a 00 | [e-mail zaštićen] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [e-pošta zaštićena] |

Debian GNU / Linux nudi naredbu readelf koja je navedena u GNU 'binutils' paketu. U pratnji preklopnika -h (kratka verzija za "-file-header") lijepo prikazuje zaglavlje ELF datoteke. Popis 3 to ilustrira za naredbu touch.

.Popis 3: Prikaz zaglavlja ELF datoteke

$ readelf -h / usr / bin / touch
ELF zaglavlje:
Magija: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Klasa: ELF64
Podaci: komplement 2, mali endian
Verzija: 1 (trenutna)
OS / ABI: UNIX - sustav V
Verzija ABI: 0
Tip: EXEC (izvršna datoteka)
Stroj: Napredni mikro uređaji X86-64
Verzija: 0x1
Adresa ulazne točke: 0x4025e3
Početak zaglavlja programa: 64 (bajtova u datoteku)
Početak zaglavlja odjeljaka: 58408 (bajtovi u datoteku)
Zastave: 0x0
Veličina ovog zaglavlja: 64 (bajtova)
Veličina zaglavlja programa: 56 (bajtova)
Broj zaglavlja programa: 9
Veličina zaglavlja odjeljaka: 64 (bajtova)
Broj zaglavlja odjeljaka: 27
Indeks tablice niza zaglavlja odjeljka: 26

Zaglavlje programa

Zaglavlje programa prikazuje segmente koji se koriste u vrijeme izvođenja i govori sustavu kako stvoriti sliku procesa. Zaglavlje s popisa 2 pokazuje da se ELF datoteka sastoji od 9 zaglavlja programa koji imaju veličinu od 56 bajtova, a prvo zaglavlje počinje u bajtu 64.

Opet, naredba readelf pomaže u izdvajanju podataka iz ELF datoteke. Prekidač -l (kratica za -programska zaglavlja ili -segmenti) otkriva više detalja kao što je prikazano u Popisu 4.

.Popis 4: Prikažite informacije o zaglavljima programa

$ readelf -l / usr / bin / touch
Vrsta datoteke Elf je EXEC (izvršna datoteka)
Ulazna točka 0x4025e3
Postoji 9 zaglavlja programa, počevši od ofseta 64
Zaglavlja programa:
Unesite Offset VirtAddr PhysAddr
FileSiz MemSiz Zastave Poravnaj
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Zahtjev za tumačem programa: / lib64 / ld-linux-x86-64.tako.2]
OPTEREĆENJE 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
UČITAJ 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x0000000000000524 0x0000000000000748 RW 200000
DINAMIČKI 0x000000000000de28 0x000000000060de28 0x000000000060de28
0x00000000000001d0 0x00000000000001d0 RW 8
NAPOMENA 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x000000000000bc40 0x000000000040bc40 0x000000000040bc40
0x00000000000003a4 0x00000000000003a4 R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x00000000000001f0 0x00000000000001f0 R 1
Presjek preslikavanja segmenata:
Odjeljci segmenta ..
00
01 .interp
02 .interp .Bilješka.ABI-oznaka .Bilješka.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.verzija .gnu.inačica_r .rela.din .rela.plt .u tome .plt .tekst .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dinamičan .dobio .dobio.plt .podaci .bss
04 .dinamičan
05 .Bilješka.ABI-oznaka .Bilješka.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dinamičan .dobio

Zaglavlje odjeljka

Treći dio ELF strukture je zaglavlje odjeljka. Namijenjen je popisivanju pojedinih odjeljaka binarne datoteke. Prekidač -S (kratica za -section-headers ili -sections) navodi različita zaglavlja. Što se tiče naredbe dodir, postoji 27 zaglavlja odjeljaka, a na popisu 5 prikazana su prva četiri, plus samo posljednje. Svaki redak pokriva veličinu odjeljka, vrstu odjeljka kao i njegovu adresu i pomak memorije.

.Popis 5: Detalje o odjeljku otkrio readelf

$ readelf -S / usr / bin / touch
Postoji 27 zaglavlja odjeljaka, počevši od ofseta 0xe428:
Zaglavlja odjeljaka:
[Nr] Ime Vrsta Adresa Pomak
Veličina EntSize Zastave Informacije o vezi Poravnaj
[0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .interp PROGBITI 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2] .Bilješka.ABI-tag NAPOMENA 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .Bilješka.gnu.build-i NAPOMENA 0000000000400274 00000274
..
..
[26] .shstrtab STRTAB 0000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
Ključ za zastave:
W (pisanje), A (dodjela), X (izvršavanje), M (spajanje), S (žice), l (veliko)
I (informacije), L (redoslijed veza), G (grupa), T (TLS), E (izuzima), x (nepoznato)
O (potrebna dodatna obrada OS-a) o (specifično za OS), p (specifično za procesor)

Alati za analizu ELF datoteke

Kao što ste mogli primijetiti iz gornjih primjera, GNU / Linux je predstavljen nizom korisnih alata koji vam pomažu u analiziranju ELF datoteke. Prvi kandidat kojeg ćemo pogledati je uslužni program za datoteke.

datoteka prikazuje osnovne informacije o ELF datotekama, uključujući arhitekturu skupa uputa kojoj je namijenjen kôd u premjestivoj, izvršnoj ili zajedničkoj datoteci objekta. U popisu 6 govori vam da je / bin / touch 64-bitna izvršna datoteka koja slijedi Linux Standard Base (LSB), dinamički povezana i izgrađena za GNU / Linux kernel verziju 2.6.32.

.Popis 6: Osnovni podaci pomoću datoteke

$ datoteka / kanta / dodir
/ bin / touch: ELF 64-bitna LSB izvršna datoteka, x86-64, verzija 1 (SYSV), dinamički povezana, interpreter / lib64 / l,
za GNU / Linux 2.6.32, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, skinut
$

Drugi je kandidat čitatelj. Prikazuje detaljne informacije o ELF datoteci. Popis sklopki usporedno je dugačak i pokriva sve aspekte ELF formata. Korištenje prekidača -n (skraćenica od -notes) Popis 7 prikazuje samo odjeljke bilješki koji postoje u dodiru datoteke - oznaku verzije ABI i bitstring ID-a gradnje.

.Popis 7: Prikažite odabrane odjeljke ELF datoteke

$ readelf -n / usr / bin / touch
Prikazivanje napomena pronađenih u pomaku datoteke 0x00000254 duljine 0x00000020:
Vlasnička veličina podataka Opis
GNU 0x00000010 NT_GNU_ABI_TAG (oznaka verzije ABI)
OS: Linux, ABI: 2.6.32
Prikazuju se bilješke pronađene u pomaku datoteke 0x00000274 duljine 0x00000024:
Vlasnička veličina podataka Opis
GNU 0x00000014 NT_GNU_BUILD_ID (jedinstveni bitstring ID-a gradnje)
ID gradnje: ec08d609e9e8e73d4be6134541a472ad0ea34502

Imajte na umu da se pod Solarisom i FreeBSD uslužni program elfdump [7] podudara s readelf. Od 2019. nije bilo novog izdanja ili ažuriranja od 2003. godine.

Broj tri je paket nazvan elfutils [6] koji je isključivo dostupan za Linux. Pruža alternativne alate za GNU Binutils, a također omogućuje provjeru valjanosti ELF datoteka. Imajte na umu da sva imena uslužnih programa navedena u paketu započinju s eu za "elf utils".

Posljednje, ali ne najmanje važno, spomenut ćemo objdump. Ovaj je alat sličan readelf-u, ali se fokusira na objektne datoteke. Pruža sličan raspon informacija o ELF datotekama i drugim objektnim formatima.

.Popis 8: Podaci o datoteci izvučeni objdumpom

$ objdump -f / bin / touch
/ bin / touch: format datoteke elf64-x86-64
arhitektura: i386: x86-64, zastave 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
početna adresa 0x00000000004025e3
$

Tu je i softverski paket nazvan 'elfkickers' [9] koji sadrži alate za čitanje sadržaja ELF datoteke, kao i za manipulaciju njome. Nažalost, broj izdanja je prilično nizak i zato ga samo spominjemo, a ne prikazujemo daljnje primjere.

Kao programer, možete umjesto toga pogledati 'pax-utils' [10,11]. Ovaj skup uslužnih programa nudi niz alata koji pomažu u provjeri valjanosti ELF datoteka. Kao primjer, dumpelf analizira ELF datoteku i vraća datoteku zaglavlja C koja sadrži detalje - vidi sliku 2.

Zaključak

Zahvaljujući kombinaciji pametnog dizajna i izvrsne dokumentacije, ELF format djeluje vrlo dobro i još uvijek je u upotrebi nakon 20 godina. Gore prikazani uslužni programi omogućuju vam uvid u ELF datoteku i omogućuju vam da shvatite što program radi. Ovo su prvi koraci za analizu softvera - sretno hakiranje!

Poveznice i reference
  • [1] Izvršni i povezivi format (ELF), Wikipedia
  • [2] Fuksija OS
  • [3] Usporedba formata izvršnih datoteka, Wikipedia
  • [4] Linux Foundation, referencirane specifikacije
  • [5] Ciro Santilli: Vodič za ELF Hello World
  • [6] elfutils paket Debian
  • [7] elfdump
  • [8] Michael Boelen: 101 ELF datoteka na Linuxu: Razumijevanje i analiza
  • [9] vilenjaci
  • [10] Stvrdnuti / PaX uslužni programi
  • [11] pax-utils, paket Debian
Zahvalnice

Pisac bi želio zahvaliti Axelu Beckertu na podršci u vezi s pripremom ovog članka.

Microsoft Sculpt Touch bežični miš pregled
Nedavno sam čitao o Microsoft Sculpt Touch bežični miš i odlučio ga kupiti. Nakon što sam ga neko vrijeme koristio, odlučio sam s njim podijeliti svoj...
Trackpad i pokazivač miša na ekranu AppyMouse za Windows tablete
Korisnicima tableta često nedostaje pokazivač miša, posebno kada su navični koristiti prijenosna računala. Pametni telefoni i tableti osjetljivi na do...
Srednja tipka miša ne radi u sustavu Windows 10
The srednja tipka miša pomaže vam u pomicanju kroz dugačke web stranice i zaslone s puno podataka. Ako se to zaustavi, na kraju ćete koristiti tipkovn...