ELF

Suprasti ELF failo formatą

Suprasti ELF failo formatą

Nuo šaltinio kodo iki dvejetainio kodo

Programavimas prasideda nuo sumanios idėjos, šaltinio kodo rašymo pasirinkta programavimo kalba, pavyzdžiui, C, ir šaltinio kodo išsaugojimo faile. Tinkamo kompiliatoriaus, pavyzdžiui, GCC, pagalba jūsų šaltinio kodas pirmiausia paverčiamas objekto kodu. Galų gale, susiejiklis paverčia objekto kodą į dvejetainį failą, kuris susieja objekto kodą su nurodytomis bibliotekomis. Šiame faile yra vienos instrukcijos kaip kompiuterio kodas, kurias supranta procesorius ir kurios vykdomos iškart paleidus kompiliuotą programą.

Pirmiau minėtas dvejetainis failas atitinka tam tikrą struktūrą, o vienas iš labiausiai paplitusių pavadinamas ELF, kuris sutrumpina vykdomąjį ir susietąjį formatą. Jis plačiai naudojamas vykdomiems failams, perkeliamiems objektų failams, bendroms bibliotekoms ir pagrindiniams sąvartynams.

Prieš dvidešimt metų - 1999 m. - „86open“ projektas pasirinko ELF kaip standartinį dvejetainio failo formatą, skirtą „Unix“ ir „Unix“ tipo sistemoms „x86“ procesoriuose. Laimei, ELF formatas anksčiau buvo dokumentuotas tiek „System V Application“ dvejetainėje sąsajoje, tiek įrankių sąsajos standarte [4]. Šis faktas labai supaprastino standartizacijos susitarimą tarp skirtingų „Unix“ pagrindu veikiančių operacinių sistemų pardavėjų ir kūrėjų.

Šio sprendimo priežastis buvo ELF dizainas - lankstumas, išplėtimas ir įvairių platformų palaikymas skirtingiems galutiniams formatams ir adresų dydžiams. ELF dizainas neapsiriboja konkrečiu procesoriumi, instrukcijų rinkiniu ar aparatūros architektūra. Norėdami išsamiai palyginti vykdomųjų failų formatus, žiūrėkite čia [3].

Nuo tada ELF formatą naudoja kelios skirtingos operacinės sistemos. Be kitų dalykų, tai apima „Linux“, „Solaris / Illumos“, „Free-“, „Net-“ ir „OpenBSD“, „QNX“, „BeOS / Haiku“ ir „Fuchsia OS“ [2]. Be to, jį rasite mobiliuosiuose įrenginiuose, kuriuose veikia „Android“, „Maemo“ ar „Meego OS / Sailfish OS“, taip pat žaidimų konsolėse, tokiose kaip „PlayStation Portable“, „Dreamcast“ ir „Wii“.

Specifikacija nepaaiškina ELF failų plėtinio. Naudojamas įvairus raidžių derinys, pvz .axf, .šiukšliadėžė, .elfas, .o, .prx, .pūsti, .ko, .taip ir .mod, arba nė vieno.

ELF bylos struktūra

„Linux“ terminale komanda „man elf“ pateikia jums patogią ELF failo struktūros santrauką:

1 sąrašas: ELF struktūros puslapis

$ vyras elfas
ELF (5) „Linux“ programuotojo vadovas ELF (5)
VARDAS
elf - vykdomojo ir susiejančio formato (ELF) failų formatas
SINOPSIS
# įtraukti
APIBŪDINIMAS
Antraštės failas apibrėžia ELF vykdomojo dvejetainio formato
failus. Tarp šių failų yra įprasti vykdomieji failai, kuriuos galima perkelti
objektų failai, pagrindiniai failai ir bendros bibliotekos.
Vykdomą failą, kuriame naudojamas ELF failo formatas, sudaro ELF antraštė,
po kurios seka programos antraštės lentelė arba skyrių antraštės lentelė, arba abu.
ELF antraštė visada yra nulio failo poslinkis. Programa
antraštės lentelė ir skyriaus antraštės lentelės poslinkis faile yra
apibrėžta ELF antraštėje. Dvi lentelės apibūdina likusius
bylos ypatumus.

Kaip matote iš aukščiau pateikto aprašymo, ELF failą sudaro du skyriai - ELF antraštė ir failo duomenys. Failo duomenų skiltį gali sudaryti programos antraštės lentelė, apibūdinanti nulį ar daugiau segmentų, sekcijos antraštės lentelė, apibūdinanti nulį ar daugiau sekcijų, po kurios seka duomenys, nurodomi įrašais iš programos antraštės lentelės, ir skyrių antraštės lentelė. Kiekviename segmente yra informacija, reikalinga vykdant failą vykdymo metu, o skyriuose yra svarbių duomenų susiejimui ir perkėlimui. 1 paveiksle tai pavaizduota schematiškai.

ELF antraštė

ELF antraštė yra 32 baitų ilgio ir nurodo failo formatą. Jis prasideda keturių unikalių baitų seka, kurios yra 0x7F, po kurios seka 0x45, 0x4c ir 0x46, kurios paverčiamos trimis raidėmis E, L ir F. Be kitų reikšmių, antraštėje taip pat nurodoma, ar tai ELF failas, skirtas 32, ar 64 bitų formatui, ar naudojamas mažas, ar didelis endianiškumas, rodoma ELF versija, taip pat kuriai operacinei sistemai failas buvo sudarytas, kad būtų galima sąveikauti su dešinioji programos dvejetainė sąsaja (ABI) ir procesorių instrukcijų rinkinys.

Dvejetainio failo palietimo šešiakampis vaizdas atrodo taip:

.2 sąrašas: dvejetainio failo „hexdump“

$ hd / usr / bin / touch | galva -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 | [saugoma el. Paštu] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [saugoma el. Paštu] |

Debian GNU / Linux siūlo komandą readelf, pateiktą GNU „binutils“ pakete. Kartu su jungikliu -h (trumpa „-file-header“ versija) jis gražiai parodo ELF failo antraštę. 3 sąrašas tai iliustruoja palietus komandą.

.3 sąrašas: rodomas ELF failo antraštė

$ readelf -h / usr / bin / touch
ELF antraštė:
Magija: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Klasė: ELF64
Duomenys: 2 papildymas, mažasis endianas
Versija: 1 (dabartinė)
OS / ABI: UNIX - V sistema
ABI versija: 0
Tipas: EXEC (vykdomas failas)
Mašina: Pažangūs „Micro Devices X86-64“
Versija: 0x1
Įėjimo taško adresas: 0x4025e3
Programos antraščių pradžia: 64 (baitai į failą)
Skilties antraščių pradžia: 58408 (baitai į failą)
Vėliavos: 0x0
Šios antraštės dydis: 64 (baitai)
Programos antraščių dydis: 56 (baitai)
Programos antraščių skaičius: 9
Skyrių antraščių dydis: 64 (baitai)
Skyrių antraščių skaičius: 27
Skilties antraštės eilutės lentelės rodyklė: 26

Programos antraštė

Programos antraštėje rodomi segmentai, naudojami vykdymo metu, ir nurodoma sistemai, kaip sukurti proceso vaizdą. 2 sąrašo antraštė rodo, kad ELF failą sudaro 9 programos antraštės, kurių kiekvienos dydis yra 56 baitai, o pirmoji antraštė prasideda nuo 64 baito.

Vėlgi, komanda readelf padeda išgauti informaciją iš ELF failo. Jungiklis -l (trumpas programos antraštėms arba -segmentams) atskleidžia daugiau informacijos, kaip parodyta 4 sąraše.

.4 sąrašas: rodykite informaciją apie programos antraštes

$ readelf -l / usr / bin / touch
Elf failo tipas yra EXEC (vykdomas failas)
Įėjimo taškas 0x4025e3
Yra 9 programos antraštės, pradedant 64 poslinkiu
Programos antraštės:
Tipas Offset VirtAddr PhysAddr
„FileSiz“ „MemSiz“ vėliavos lygiuoti
PHDR 0x000000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Prašanti programos vertėjo: / lib64 / ld-linux-x86-64.taip.2]
APKROVA 0x000000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
APKROVA 0x00000000000000de10 0x000000000060601010xx0000000000606010
0x0000000000000524 0x0000000000000748 RW 200000
DYNAMIC 0x00000000000000dede 0x00000000006060de28 0x0000000000606028
0x00000000000001d0 0x00000000000001d0 RW 8
PASTABA 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x00000000000000bc40 0x000000000040bc40 0x00000000004040cc40
0x00000000000003a4 0x00000000000003a4 R 4
GNU_STACK 0x000000000000000000 0x000000000000000000 0x000000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x00000000000000de10 0x00000000000060de10 0x0000000000606010
0x00000000000001f0 0x00000000000001f0 R 1
Skirstymas į segmentų atvaizdavimą:
Segmentuoti segmentus ..
00
01 .interp
02 .interp .pastaba.ABI žymė .pastaba.gnu.komponavimo ID .gnu.maišos .dynsym .dynstr .gnu.versija .gnu.versija_r .rela.dinam .rela.plt .inic .plt .teksto .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dinamiškas .gavo .gavo.plt .duomenis .bss
04 .dinamiškas
05 .pastaba.ABI žymė .pastaba.gnu.komponavimo ID
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dinamiškas .gavo

Skilties antraštė

Trečioji ELF struktūros dalis yra skyriaus antraštė. Jis skirtas išvesti atskirus dvejetainio skyrelius. Jungiklyje -S (sutrumpintai skirsnių antraštėms arba sekcijoms) pateikiamos skirtingos antraštės. Kalbant apie komandą „touch“, yra 27 skyrių antraštės, o 5 sąraše rodomi tik pirmieji keturi iš jų ir paskutinis. Kiekvienoje eilutėje nurodomas sekcijos dydis, skyriaus tipas, adresas ir atminties poslinkis.

.5 sąrašas: skyrių išsami informacija atskleidžiama savarankiškai

$ readelf -S / usr / bin / touch
Yra 27 skyrių antraštės, pradedant nuo 0xe428 poslinkio:
Skyrių antraštės:
[Nr] Pavadinimo tipas Adreso poslinkis
Dydis „EntSize“ žymi nuorodos nuorodos informaciją
[0] NULL 000000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2] .pastaba.„ABI-tag“ PASTABA 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .pastaba.gnu.„build-i“ PASTABA 0000000000400274 00000274


[26] .shstrtab STRTAB 000000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
Vėliavų raktas:
W (rašyti), A (paskirstyti), X (vykdyti), M (sujungti), S (eilutės), l (didelis)
I (informacija), L (susiejimo tvarka), G (grupė), T (TLS), E (neįtraukti), x (nežinoma)
O (reikalingas papildomas OS apdorojimas) o (specifinis OS), p (specifinis procesoriui)

Įrankiai, skirti ELF failui analizuoti

Kaip jau pastebėjote iš aukščiau pateiktų pavyzdžių, GNU / Linux yra papildyta daugeliu naudingų įrankių, kurie padės analizuoti ELF failą. Pirmasis kandidatas, kurį pažvelgsime, yra failų įrankis.

faile rodoma pagrindinė informacija apie ELF failus, įskaitant komandų rinkinio architektūrą, kuriai skirtas perkeltino, vykdomojo ar bendro objekto failo kodas. 6 sąraše nurodoma, kad / bin / touch yra 64 bitų vykdomasis failas, sekantis „Linux Standard Base“ (LSB), dinamiškai susietas ir sukurtas GNU / Linux branduolio 2 versijai.6.32.

.6 sąrašas: pagrindinė informacija naudojant failą

$ file / bin / touch
/ bin / touch: ELF 64 bitų LSB vykdomoji versija, x86-64, 1 versija (SYSV), dinamiškai susieta, vertėjas / lib64 / l,
skirta GNU / Linux 2.6.32, „BuildID“ [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, nuimtas
$

Antrasis kandidatas yra laisvas. Čia pateikiama išsami informacija apie ELF failą. Jungiklių sąrašas yra palyginti ilgas ir apima visus ELF formato aspektus. Naudojant jungiklį -n (trumpas - užrašams) 7 sąraše rodomi tik pastabos skyriai, esantys failo palietime - ABI versijos žyma ir komponavimo ID bitų eilutė.

.7 sąrašas: rodyti pasirinktas ELF failo dalis

$ readelf -n / usr / bin / touch
Rodomos pastabos, rastos failo poslinkyje 0x00000254, ilgis 0x00000020:
Savininko duomenų dydis Aprašymas
GNU 0x00000010 NT_GNU_ABI_TAG (ABI versijos žyma)
OS: „Linux“, ABI: 2.6.32
Rodomos pastabos, rastos failo poslinkyje 0x00000274, ilgis 0x00000024:
Savininko duomenų dydis Aprašymas
GNU 0x00000014 NT_GNU_BUILD_ID (unikalios versijos ID bitų eilutė)
Komponavimo ID: ec08d609e9e8e73d4be6134541a472ad0ea34502

Atkreipkite dėmesį, kad sistemose „Solaris“ ir „FreeBSD“ naudingumas elfdump [7] atitinka readelf. Nuo 2019 m. Nebuvo jokio naujo leidimo ar atnaujinimo nuo 2003 m.

Trečiasis numeris yra paketas pavadinimu elfutils [6], kuris yra grynai prieinamas „Linux“. Tai suteikia alternatyvių įrankių GNU „Binutils“, taip pat leidžia patvirtinti ELF failus. Atminkite, kad visi pakete pateikiami komunalinių paslaugų pavadinimai prasideda „elf utils“.

Paskutinis, bet ne mažiau svarbus dalykas - paminėsime objdump. Šis įrankis yra panašus į „selfelf“, bet sutelktas į objektų failus. Čia pateikiama panaši informacija apie ELF failus ir kitus objektų formatus.

.8 sąrašas: failo informacija, išgauta objdump

$ objdump -f / bin / touch
/ bin / touch: failo formatas elf64-x86-64
architektūra: i386: x86-64, vėliavos 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
pradžios adresas 0x00000000004025e3
$

Taip pat yra programinės įrangos paketas, vadinamas „elfkickers“ [9], kuriame yra įrankiai, skirti skaityti ELF failo turinį ir juo manipuliuoti. Deja, leidimų skaičius yra gana mažas, todėl mes jį tiesiog paminime ir nerodome kitų pavyzdžių.

Kaip kūrėjas galite pažvelgti į „pax-utils“ [10,11]. Šis komunalinių paslaugų rinkinys suteikia daugybę įrankių, kurie padeda patvirtinti ELF failus. Kaip pavyzdį, dumpelf analizuoja ELF failą ir pateikia C antraštės failą, kuriame yra išsami informacija - žr. 2 paveikslą.

Išvada

Dėl sumanaus dizaino ir puikios dokumentacijos derinio ELF formatas veikia labai gerai ir vis dar naudojamas po 20 metų. Aukščiau pateiktos komunalinės paslaugos leidžia įžvalgą apie ELF failą ir leidžia suprasti, ką daro programa. Tai yra pirmieji programinės įrangos analizės žingsniai - laimingas įsilaužimas!

Nuorodos ir nuorodos
  • [1] Vykdomas ir susietas formatas (ELF), Vikipedija
  • [2] „Fuchsia OS“
  • [3] Vykdomųjų failų formatų palyginimas, Vikipedija
  • [4] „Linux Foundation“, nurodytos specifikacijos
  • [5] Ciro Santilli: ELF „Hello World“ pamoka
  • [6] elfutils Debian paketas
  • [7] elfdump
  • [8] Michaelas Boelenas: 101 „ELF“ failas sistemoje „Linux“: supratimas ir analizė
  • [9] elfkickers
  • [10] „Hardened / PaX Utilities“
  • [11] pax-utils, Debian paketas
Padėkos

Rašytojas norėtų padėkoti Axelui Beckertui už paramą rengiant šį straipsnį.

Kaip pakeisti kairįjį ir dešinįjį pelės mygtukus „Windows 10“ kompiuteryje
Gana įprasta, kad visi kompiuterio pelės įrenginiai yra ergonomiškai sukurti dešiniarankiams. Tačiau yra pelių prietaisų, specialiai sukurtų kairiaran...
Mėgdžiokite pelės paspaudimus, užveskite pelės žymeklį naudodami pelę „Clickless Mouse“ sistemoje „Windows 10“
Pelės ar klaviatūros naudojimas netinkamoje laikysenoje, kai naudojama per daug, gali sukelti daug sveikatos problemų, įskaitant įtampą, riešo kanalo ...
Pridėkite pelės gestus prie „Windows 10“ naudodami šiuos nemokamus įrankius
Pastaraisiais metais kompiuteriai ir operacinės sistemos labai išsivystė. Buvo laikas, kai vartotojai turėjo naudoti komandas naršydami per failų tvar...