ELF

Pochopenie formátu súboru ELF

Pochopenie formátu súboru ELF

Od zdrojového kódu po binárny kód

Programovanie začína múdrym nápadom, napísaním zdrojového kódu v programovacom jazyku podľa vášho výberu, napríklad C, a uložením zdrojového kódu do súboru. Pomocou adekvátneho kompilátora, napríklad GCC, sa váš zdrojový kód najskôr preloží do objektového kódu. Nakoniec linker preloží kód objektu do binárneho súboru, ktorý prepojí kód objektu s odkazovanými knižnicami. Tento súbor obsahuje jednotlivé pokyny ako strojový kód, ktorým procesor rozumie, a vykonajú sa hneď po spustení kompilovaného programu.

Vyššie uvedený binárny súbor má špecifickú štruktúru a jeden z najbežnejších je pomenovaný ELF, ktorý skracuje skratku Executable and Linkable Format. Je široko používaný pre spustiteľné súbory, súbory premiestniteľných objektov, zdieľané knižnice a základné výpisy.

Pred dvadsiatimi rokmi - v roku 1999 - si projekt 86open vybral ELF ako štandardný formát binárneho súboru pre Unix a systémy podobné Unixu na procesoroch x86. Našťastie bol formát ELF predtým zdokumentovaný v aplikačnom binárnom rozhraní systému V aj v štandarde nástroja pre rozhranie [4]. Táto skutočnosť nesmierne zjednodušila dohodu o štandardizácii medzi rôznymi dodávateľmi a vývojármi operačných systémov založených na systéme Unix.

Dôvodom tohto rozhodnutia bol návrh ELF - flexibilita, rozšíriteľnosť a podpora viacerých platforiem pre rôzne formáty endian a veľkosti adries. Dizajn ELF sa neobmedzuje na konkrétny procesor, inštrukčnú sadu alebo hardvérovú architektúru. Podrobné porovnanie formátov spustiteľných súborov nájdete tu [3].

Odvtedy formát ELF používa niekoľko rôznych operačných systémov. Patria sem okrem iného systémy Linux, Solaris / Illumos, Free-, Net- a OpenBSD, QNX, BeOS / Haiku a Fuchsia OS [2]. Ďalej ho nájdete na mobilných zariadeniach s operačným systémom Android, Maemo alebo Meego OS / Sailfish OS a tiež na herných konzolách ako PlayStation Portable, Dreamcast a Wii.

Špecifikácia neobjasňuje príponu súboru pre súbory ELF. Používa sa rôzne kombinácie písmen, ako napr .axf, .kôš, .elf, .o, .prx, .bafať, .ko, .tak, a .mod, alebo žiadny.

Štruktúra súboru ELF

Na termináli Linux vám príkaz man elf poskytne užitočné zhrnutie o štruktúre súboru ELF:

Výpis 1: Stránka štruktúry ELF

$ človek elf
ELF (5) Príručka programátora Linuxu ELF (5)
NÁZOV
elf - formát spustiteľného súboru a súboru ELF (Linking Format)
SYNOPSIS
#include
POPIS
Hlavičkový súbor definuje formát spustiteľného binárneho súboru ELF
súbory. Medzi týmito súbormi sú bežné spustiteľné súbory, ktoré sa dajú premiestniť
objektové súbory, základné súbory a zdieľané knižnice.
Spustiteľný súbor vo formáte súboru ELF pozostáva z hlavičky ELF,
za ktorým nasleduje tabuľka hlavičiek programu alebo tabuľka hlavičiek sekcií alebo obidve.
Hlavička ELF je vždy na nule s offsetom súboru. Program
tabuľka hlavičiek a posun tabuľky hlavičky sekcie v súbore sú
definované v hlavičke ELF. Dve tabuľky popisujú zvyšok
osobitosti spisu.

Ako vidíte z vyššie uvedeného popisu, súbor ELF sa skladá z dvoch častí - hlavičky ELF a údajov súboru. Sekcia údajov o súbore môže pozostávať z tabuľky hlavičiek programu popisujúcej nula alebo viac segmentov, tabuľky hlavičiek sekcií popisujúcich nula alebo viac sekcií, za ktorou nasledujú údaje, na ktoré odkazujú položky z tabuľky hlavičiek programu, a tabuľky hlavičiek sekcií. Každý segment obsahuje informácie potrebné na spustenie súboru za behu, zatiaľ čo sekcie obsahujú dôležité údaje na prepojenie a premiestnenie. Obrázok 1 to schematicky ilustruje.

Hlavička ELF

Hlavička ELF je dlhá 32 bajtov a identifikuje formát súboru. Začína sa to sekvenciou štyroch jedinečných bajtov, ktoré sú 0x7F, za ktorými nasledujú 0x45, 0x4c a 0x46, čo sa prekladá do troch písmen E, L a F. Okrem iných hodnôt hlavička tiež označuje, či sa jedná o súbor ELF pre 32 alebo 64-bitový formát, používa malú alebo veľkú endianness, zobrazuje verziu ELF a tiež pre aký operačný systém bol súbor zostavený, aby spolupracoval s správne aplikačné binárne rozhranie (ABI) a inštrukčná sada procesora.

Hexdump dotyku binárneho súboru vyzerá takto:

.Výpis 2: Hexdump binárneho súboru

$ hd / usr / bin / touch | hlava -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 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 | [chránené e-mailom] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [chránené e-mailom] |

Debian GNU / Linux ponúka príkaz readelf, ktorý je poskytovaný v balíku GNU 'binutils'. V sprievode prepínača -h (krátka verzia pre „-file-header“) pekne zobrazí hlavičku súboru ELF. Zoznam 3 to ilustruje pre príkazový dotyk.

.Výpis 3: Zobrazenie hlavičky súboru ELF

$ readelf -h / usr / bin / touch
Hlavička ELF:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Trieda: ELF64
Údaje: doplnok 2, malý endian
Verzia: 1 (aktuálna)
OS / ABI: UNIX - systém V
Verzia ABI: 0
Typ: EXEC (spustiteľný súbor)
Stroj: Advanced Micro Devices X86-64
Verzia: 0x1
Adresa vstupného bodu: 0x4025e3
Začiatok hlavičky programu: 64 (bajtov do súboru)
Začiatok hlavičiek sekcií: 58408 (bajtov do súboru)
Vlajky: 0x0
Veľkosť tejto hlavičky: 64 (bajtov)
Veľkosť hlavičiek programu: 56 (bajtov)
Počet hlavičiek programov: 9
Veľkosť hlavičiek sekcií: 64 (bajtov)
Počet hlavičiek sekcií: 27
Index tabuľky reťazcov hlavičky oddielu: 26

Hlavička programu

Hlavička programu zobrazuje segmenty použité za behu a informuje systém, ako vytvoriť obraz procesu. Hlavička z výpisu 2 ukazuje, že súbor ELF pozostáva z 9 programových hlavičiek, ktoré majú každý veľkosť 56 bajtov a prvá hlavička začína na bajte 64.

Príkaz readelf opäť pomáha extrahovať informácie zo súboru ELF. Prepínač -l (skratka pre -hlavičky programu alebo -segmenty) odhalí ďalšie podrobnosti, ako je uvedené v zozname 4.

.Výpis 4: Zobrazenie informácií o hlavičkách programov

$ readelf -l / usr / bin / touch
Typ súboru Elf je EXEC (spustiteľný súbor)
Vstupný bod 0x4025e3
K dispozícii je 9 hlavičiek programov, počnúc offsetom 64
Hlavičky programu:
Typ Posunutie VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Žiadajúci tlmočník programu: / lib64 / ld-linux-x86-64.tak.2]
ZAŤAŽENIE 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
ZAŤAŽENIE 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x0000000000000524 0x0000000000000748 RW 200000
DYNAMICKÉ 0x000000000000de28 0x000000000060de28 0x000000000060de28
0x00000000000001d0 0x00000000000001d0 RW 8
POZNÁMKA 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
Mapovanie sekcií k segmentom:
Segmentové sekcie ..
00
01 .interp
02 .interp .Poznámka.Značka ABI .Poznámka.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.verzia .gnu.verzia_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynamický .mám .mám.plt .údaje .bss
04 .dynamický
05 .Poznámka.Značka ABI .Poznámka.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dynamický .mám

Hlavička oddielu

Treťou časťou štruktúry ELF je hlavička sekcie. Má to byť zoznam jednotlivých častí binárneho súboru. Prepínač -S (skratka pre -section-headers alebo -sections) vypíše rôzne hlavičky. Pokiaľ ide o dotykový príkaz, existuje 27 hlavičiek sekcií a zoznam 5 zobrazuje prvé štyri z nich plus poslednú, iba. Každý riadok pokrýva veľkosť oddielu, typ oddielu, ako aj jeho adresu a posunutie pamäte.

.Výpis 5: Podrobnosti sekcie odhalil sám

$ readelf -S / usr / bin / touch
Existuje 27 hlavičiek sekcií, počnúc offsetom 0xe428:
Hlavičky sekcií:
[Nr] Názov Typ Adresa Ofset
Veľkosť Príznaky Veľkosti Odkaz Informácie Zarovnať
[0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2] .Poznámka.Značka ABI POZNÁMKA 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .Poznámka.gnu.build-i POZNÁMKA 0000000000400274 00000274


[26] .shstrtab STRTAB 0000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
Kľúč k vlajkam:
W (zápis), A (pridelenie), X (vykonanie), M (zlúčenie), S (reťazce), l (veľké)
I (informácie), L (poradie odkazov), G (skupina), T (TLS), E (vylúčiť), x (neznáme)
O (vyžaduje sa ďalšie spracovanie OS) o (špecifické pre OS), p (špecifické pre procesor)

Nástroje na analýzu súboru ELF

Ako ste si mohli všimnúť z vyššie uvedených príkladov, GNU / Linux je obohatený o množstvo užitočných nástrojov, ktoré vám pomôžu analyzovať súbor ELF. Prvý kandidát, ktorého sa pozrieme, je obslužný program súborov.

súbor zobrazuje základné informácie o súboroch ELF vrátane architektúry inštrukčnej sady, pre ktorú je určený kód v súbore premiestniteľného, ​​spustiteľného alebo zdieľaného objektu. V zozname 6 vám hovorí, že / bin / touch je 64-bitový spustiteľný súbor nasledujúci po Linux Standard Base (LSB), dynamicky prepojený a vytvorený pre jadro GNU / Linux verzie 2.6.32.

.Výpis 6: Základné informácie pomocou súboru

$ súbor / kôš / dotyk
/ bin / touch: ELF 64-bit LSB spustiteľný, x86-64, verzia 1 (SYSV), dynamicky prepojený, tlmočník / lib64 / l,
pre GNU / Linux 2.6.32, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, odstránené
$

Druhým kandidátom je sám seba. Zobrazuje podrobné informácie o súbore ELF. Zoznam prepínačov je porovnateľne dlhý a pokrýva všetky aspekty formátu ELF. Pomocou prepínača -n (skratka pre -notes) Výpis 7 zobrazuje iba sekcie poznámok, ktoré existujú v dotyku súboru - značka verzie ABI a bitstring ID zostavy.

.Výpis 7: Zobrazenie vybratých častí súboru ELF

$ readelf -n / usr / bin / touch
Zobrazenie poznámok nájdených pri offsetu súboru 0x00000254 s dĺžkou 0x00000020:
Veľkosť údajov vlastníka Popis
GNU 0x00000010 NT_GNU_ABI_TAG (značka verzie ABI)
OS: Linux, ABI: 2.6.32
Zobrazenie poznámok nájdených pri offsetu súboru 0x00000274 s dĺžkou 0x00000024:
Veľkosť údajov vlastníka Popis
GNU 0x00000014 NT_GNU_BUILD_ID (jedinečný bitstring ID zostavy)
ID zostavy: ec08d609e9e8e73d4be6134541a472ad0ea34502

Upozorňujeme, že v systémoch Solaris a FreeBSD zodpovedá obslužný program elfdump [7] príkazu readelf. Od roku 2019 nebude k dispozícii nové vydanie ani aktualizácia od roku 2003.

Číslo tri je balík s názvom elfutils [6], ktorý je čisto dostupný pre Linux. Poskytuje alternatívne nástroje k GNU Binutils a tiež umožňuje overovanie súborov ELF. Upozorňujeme, že všetky názvy pomôcok poskytovaných v balíku začínajú na eu pre „elf utils“.

V neposlednom rade spomenieme objdump. Tento nástroj je podobný nástroju readelf, ale zameriava sa na súbory objektov. Poskytuje podobný rozsah informácií o súboroch ELF a iných formátoch objektov.

.Výpis 8: Informácie o súbore extrahované objdump

$ objdump -f / bin / touch
/ bin / touch: formát súboru elf64-x86-64
architektúra: i386: x86-64, príznaky 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
začiatočná adresa 0x00000000004025e3
$

Existuje aj softvérový balík s názvom „elfkickers“ [9], ktorý obsahuje nástroje na čítanie obsahu súboru ELF a na jeho manipuláciu. Bohužiaľ, počet vydaní je dosť nízky, a preto ho len spomenieme a neuvádzame ďalšie príklady.

Ako vývojár sa môžete radšej pozrieť na „pax-utils“ [10,11]. Táto sada pomocných programov poskytuje množstvo nástrojov, ktoré pomáhajú validovať súbory ELF. Napríklad dumpelf analyzuje súbor ELF a vráti súbor hlavičky C obsahujúci podrobnosti - pozri obrázok 2.

Záver

Vďaka kombinácii dômyselného dizajnu a vynikajúcej dokumentácie funguje formát ELF veľmi dobre a stále sa používa aj po 20 rokoch. Vyššie uvedené nástroje vám umožňujú nahliadnuť do súboru ELF a umožňujú vám zistiť, čo program robí. Toto sú prvé kroky pre analýzu softvéru - šťastné hackovanie!

Odkazy a referencie
  • [1] Spustiteľný a prepojiteľný formát (ELF), Wikipedia
  • [2] Fuchsia OS
  • [3] Porovnanie formátov spustiteľných súborov, Wikipedia
  • [4] Linux Foundation, referenčné špecifikácie
  • [5] Ciro Santilli: Výukový program Hello World ELF
  • [6] balíček elfutils Debian
  • [7] elfdump
  • [8] Michael Boelen: 101 súborov ELF v systéme Linux: porozumenie a analýza
  • [9] elfkickers
  • [10] Tvrdené / PaX nástroje
  • [11] pax-utils, balík Debian
Poďakovanie

Autor chce poďakovať Axelovi Beckertovi za podporu pri príprave tohto článku.

Hry Výukový program Battle for Wesnoth
Výukový program Battle for Wesnoth
Battle for Wesnoth je jednou z najpopulárnejších open source strategických hier, ktoré si v súčasnosti môžete zahrať. Táto hra bola nielen vyvinutá ve...
Hry 0 A.D. Výukový program
0 A.D. Výukový program
Z mnohých strategických hier je tu 0 A.D. dokáže vyniknúť ako komplexný titul a veľmi hlboká, taktická hra napriek tomu, že je otvoreným zdrojom. Vývo...
Hry Výukový program pre Unity3D
Výukový program pre Unity3D
Úvod do Unity 3D Unity 3D je výkonný nástroj na vývoj hier. Je to multiplatforma, ktorá vám umožňuje vytvárať hry pre mobilné telefóny, web, počítače ...