ELF

ELF-tiedostomuodon ymmärtäminen

ELF-tiedostomuodon ymmärtäminen

Lähdekoodista binaarikoodiksi

Ohjelmointi alkaa älykkäästä ideasta, lähdekoodin kirjoittamisesta valitsemallesi ohjelmointikielellä, esimerkiksi C, ja lähdekoodin tallentamisesta tiedostoon. Riittävän kääntäjän, esimerkiksi GCC: n avulla lähdekoodisi käännetään ensin objektikoodiksi. Lopulta linkki kääntää objektikoodin binääritiedostoksi, joka linkittää objektikoodin viitattuihin kirjastoihin. Tämä tiedosto sisältää yksittäiset ohjeet konekoodina, jotka CPU ymmärtää ja jotka suoritetaan heti, kun käännetty ohjelma on suoritettu.

Edellä mainittu binaaritiedosto noudattaa tiettyä rakennetta, ja yksi yleisimmistä tiedostoista on nimeltään ELF, joka lyhentää suoritettavaa ja linkitettävää muotoa. Sitä käytetään laajalti suoritettaviin tiedostoihin, siirrettäviin objektitiedostoihin, jaettuihin kirjastoihin ja ydinjätteisiin.

Kaksikymmentä vuotta sitten - vuonna 1999 - 86open-projekti valitsi ELF: n standardiksi binääritiedostomuodoksi Unix- ja Unix-tyyppisille järjestelmille x86-prosessoreissa. Onneksi ELF-muoto oli aiemmin dokumentoitu sekä System V -sovelluksen binaariliitännässä että Tool Interface Standardissa [4]. Tämä tosiasia yksinkertaisti valtavasti standardointisopimusta Unix-pohjaisten käyttöjärjestelmien eri toimittajien ja kehittäjien välillä.

Syy päätökseen oli ELF: n suunnittelu - joustavuus, laajennettavuus ja alustojen välinen tuki erilaisille endian-muodoille ja osoitekokoille. ELF: n suunnittelu ei rajoitu tiettyyn prosessoriin, käskyjoukkoon tai laitteistoarkkitehtuuriin. Katso tarkempi suoritettavien tiedostomuotojen vertailu täältä [3].

Siitä lähtien ELF-muoto on ollut käytössä useissa eri käyttöjärjestelmissä. Tähän kuuluvat muun muassa Linux, Solaris / Illumos, Free-, Net- ja OpenBSD, QNX, BeOS / Haiku ja Fuchsia OS [2]. Lisäksi löydät sen mobiililaitteista, joissa on Android, Maemo tai Meego OS / Sailfish OS, sekä pelikonsoleista, kuten PlayStation Portable, Dreamcast ja Wii.

Määritelmä ei selvennä ELF-tiedostojen tiedostopääte. Käytössä on useita kirjainyhdistelmiä, kuten .axf, .bin, .tonttu, .o, .prx, .pullistaa, .ko, .niin, ja .mod, tai ei mitään.

ELF-tiedoston rakenne

Linux-päätelaitteessa komento man tonttu antaa sinulle kätevän yhteenvedon ELF-tiedoston rakenteesta:

Listaus 1: ELF-rakenteen sivu

$ mies tonttu
ELF (5) Linux-ohjelmoijan opas ELF (5)
NIMI
elf - suoritettavien ja linkittävien tiedostomuotojen (ELF) tiedostomuoto
YHTEENVETO
#sisältää
KUVAUS
Otsikkotiedosto määrittää ELF-suoritettavan binäärimuodon muodon
tiedostot. Näiden tiedostojen joukossa on tavallisia suoritettavia tiedostoja, jotka voidaan siirtää uudelleen
objektitiedostot, ydintiedostot ja jaetut kirjastot.
ELF-tiedostomuotoa käyttävä suoritettava tiedosto koostuu ELF-otsikosta,
jota seuraa ohjelman otsikkotaulukko tai osion otsikkotaulukko tai molemmat.
ELF-otsikko on aina tiedoston nollapisteen ulkopuolella. Ohjelma
otsikkotaulukko ja osion otsikkotaulukon siirtymä tiedostossa ovat
määritelty ELF-otsikossa. Kaksi taulukkoa kuvaavat loput
asiakirjan erityispiirteet.

Kuten yllä olevasta kuvauksesta näet, ELF-tiedosto koostuu kahdesta osasta - ELF-otsikosta ja tiedostotiedoista. Tiedostodataosa voi koostua ohjelman otsikkotaulukosta, joka kuvaa nollaa tai useampaa segmenttiä, jakson otsikkotaulukosta, joka kuvaa nollaa tai useampaa osaa, jota seuraavat tiedot, joihin viitataan ohjelman otsikkotaulukon merkinnöistä, ja osion otsikkotaulukosta. Jokainen segmentti sisältää tietoja, jotka ovat välttämättömiä tiedoston ajonaikaiselle suoritukselle, kun taas osiot sisältävät tärkeitä tietoja linkittämistä ja uudelleensijoittamista varten. Kuva 1 havainnollistaa tätä kaavamaisesti.

ELF-otsikko

ELF-otsikko on 32 tavua pitkä ja tunnistaa tiedoston muodon. Se alkaa neljän ainutlaatuisen tavun sekvenssillä, jotka ovat 0x7F, joita seuraavat 0x45, 0x4c ja 0x46, mikä tarkoittaa kolmea kirjainta E, L ja F. Muiden arvojen lisäksi otsikko osoittaa myös, onko kyseessä 32- tai 64-bittinen ELF-tiedosto, käyttääkö se vähän tai paljon endiinejä, näyttää ELF-version sekä minkä käyttöjärjestelmän tiedosto on koottu toimiakseen yhdessä oikea sovelluksen binäärirajapinta (ABI) ja prosessorikäskyjoukko.

Binaaritiedoston kosketuksen hexdump näyttää seuraavalta:

.Listaus 2: Binaaritiedoston hexdump

$ hd / usr / bin / touch | pää -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 | [sähköposti suojattu] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [sähköposti suojattu] |

Debian GNU / Linux tarjoaa readelf-komennon, joka on paketissa GNU 'binutils'. Kytkimen -h (lyhyt versio “-file-header”) mukana se näyttää hienosti ELF-tiedoston otsikon. Listaus 3 kuvaa tätä komentokosketusta varten.

.Listaus 3: ELF-tiedoston otsikon näyttäminen

$ readelf -h / usr / bin / touch
ELF-otsikko:
Taika: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Luokka: ELF64
Tiedot: 2: n komplementti, pieni endiaani
Versio: 1 (nykyinen)
OS / ABI: UNIX - järjestelmä V
ABI-versio: 0
Tyyppi: EXEC (suoritettava tiedosto)
Kone: Advanced Micro Devices X86-64
Versio: 0x1
Tulopisteen osoite: 0x4025e3
Ohjelman otsikkojen alku: 64 (tavua tiedostoon)
Lohkon otsikkojen alku: 58408 (tavua tiedostoon)
Liput: 0x0
Tämän otsikon koko: 64 (tavua)
Ohjelman otsikkojen koko: 56 (tavua)
Ohjelman otsikkojen lukumäärä: 9
Osion otsikkojen koko: 64 (tavua)
Osa-otsikoiden lukumäärä: 27
Osiotunnisteiden merkkijonotaulukko: 26

Ohjelman otsikko

Ohjelman otsikko näyttää ajon aikana käytetyt segmentit ja kertoo järjestelmälle prosessikuvan luomisen. Listauksen 2 otsikko osoittaa, että ELF-tiedosto koostuu yhdeksästä ohjelman otsikosta, joiden koko on 56 tavua, ja ensimmäinen otsikko alkaa tavusta 64.

Jälleen readelf-komento auttaa poimimaan tietoja ELF-tiedostosta. Kytkin -l (lyhenne ohjelmien otsikoista tai -segmenteistä) paljastaa lisätietoja, kuten luettelossa 4 on esitetty.

.Listaus 4: Näytä tiedot ohjelman otsikoista

$ readelf -l / usr / bin / touch
Tontun tiedostotyyppi on EXEC (suoritettava tiedosto)
Lähtökohta 0x4025e3
Ohjelman otsikoita on 9, alkaen siirtymästä 64
Ohjelman otsikot:
Tyyppi Offset VirtAddr PhysAddr
FileSiz MemSiz Liput kohdistetaan
PHDR 0x000000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Pyydettävä ohjelmatulkki: / lib64 / ld-linux-x86-64.niin.2]
LOAD 0x000000000000000000 0x000000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
LOAD 0x00000000000000de10 0x000000000060601010 0x0000000000606010
0x0000000000000524 0x0000000000000748 RW 200000
DYNAMIC 0x00000000000000de28 0x00000000006060de28 0x00000000006060de28
0x00000000000001d0 0x00000000000001d0 RW 8
HUOMAUTUS 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x000000000000bc40 0x000000000040bc40 0x000000000040bc40
0x00000000000003a4 0x00000000000003a4 R 4
GNU_STACK 0x000000000000000000 0x000000000000000000 0x000000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x00000000000000de10 0x00000000000060de10 0x0000000000606010
0x00000000000001f0 0x00000000000001f0 R 1
Osio segmenttien kartoitukseen:
Segmenttiosastot…
00
01 .interp
02 .interp .merkintä.ABI-tunniste .merkintä.gnu.koontitunnus .gnu.hash .dynsym .dynstr .gnu.versio .gnu.versio_r .rela.dyn .rela.plt .sen sisällä .plt .teksti .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynaaminen .sai .sai.plt .tiedot .bss
04 .dynaaminen
05 .merkintä.ABI-tunniste .merkintä.gnu.koontitunnus
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dynaaminen .sai

Osion otsikko

ELF-rakenteen kolmas osa on jakson otsikko. Sen on tarkoitus luetella binäärin yksittäiset osat. Kytkin -S (lyhenne osio-otsikoista tai jaksoista) listaa eri otsikot. Kosketuskomennon kohdalla on 27 osiootsikkoa, ja Listaus 5 näyttää neljä ensimmäistä plus viimeinen vain. Jokainen rivi kattaa osan koon, osion tyypin sekä sen osoitteen ja muistin siirtymän.

.Listaus 5: Osion yksityiskohdat ilmoittavat itsensä

$ readelf -S / usr / bin / touch
Osio-otsikoita on 27, siirtymästä 0xe428 alkaen:
Osion otsikot:
[Nr] Nimi Tyyppi Osoitteen siirtymä
Koko EntSize Liput Linkin tiedot tasaa
[0] NULL 000000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .Interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2] .merkintä.ABI-tag HUOMAUTUS 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .merkintä.gnu.build-i HUOMAUTUS 0000000000400274 00000274


[26] .shstrtab STRTAB 000000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
Avain lippuihin:
W (kirjoitus), A (allokointi), X (suorita), M (yhdistäminen), S (merkkijonot), l (iso)
I (info), L (linkkijärjestys), G (ryhmä), T (TLS), E (poissuljettu), x (tuntematon)
O (tarvitaan käyttöjärjestelmän ylimääräinen käsittely) o (käyttöjärjestelmäkohtainen), p (prosessorikohtainen)

Työkalut ELF-tiedoston analysointiin

Kuten olet ehkä huomannut yllä olevista esimerkeistä, GNU / Linux täydennetään useilla hyödyllisillä työkaluilla, jotka auttavat sinua analysoimaan ELF-tiedostoa. Ensimmäinen ehdokas, jonka tarkastelemme, on tiedostoapuohjelma.

tiedosto näyttää perustiedot ELF-tiedostoista, mukaan lukien käskysarjaarkkitehtuuri, jolle siirrettävän, suoritettavan tai jaetun objektitiedoston koodi on tarkoitettu. Luettelossa 6 se kertoo, että / bin / touch on 64-bittinen suoritettava tiedosto, joka seuraa Linux Standard Base (LSB) -sovellusta, dynaamisesti linkitetty ja rakennettu GNU / Linux-ytimen versiolle 2.6.32.

.Listaus 6: Perustiedot tiedoston avulla

$ tiedosto / bin / kosketa
/ bin / touch: ELF 64-bittinen suoritettava LSB-tiedosto, x86-64, versio 1 (SYSV), dynaamisesti linkitetty, tulkki / lib64 / l,
GNU / Linux 2: lle.6.32, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, riisuttu
$

Toinen ehdokas on valmis. Se näyttää yksityiskohtaiset tiedot ELF-tiedostosta. Kytkinten luettelo on verrattain pitkä ja kattaa kaikki ELF-muodon näkökohdat. Kytkimen -n (lyhyt -merkinnät) käyttäminen Listaus 7 näyttää vain tiedostokosketuksessa olevat muistiinpanot - ABI-versiotunnisteen ja koontitunnuksen bittijonon.

.Listaus 7: Näytä valitut ELF-tiedoston osat

$ readelf -n / usr / bin / touch
Näytetään muistiinpanot, jotka löytyvät tiedostopoikkeamasta 0x00000254 ja pituus 0x00000020:
Omistajan tietojen koko Kuvaus
GNU 0x00000010 NT_GNU_ABI_TAG (ABI-versiotagi)
Käyttöjärjestelmä: Linux, ABI: 2.6.32
Näytetään muistiinpanot, jotka löytyvät tiedostopoikkeamasta 0x00000274 ja pituus 0x00000024:
Omistajan tietojen koko Kuvaus
GNU 0x00000014 NT_GNU_BUILD_ID (yksilöllinen koontitunnuksen bittijono)
Koontiversio: ec08d609e9e8e73d4be6134541a472ad0ea34502

Huomaa, että Solaris- ja FreeBSD-käyttöjärjestelmissä apuohjelma elfdump [7] vastaa readelf-tiedostoa. Vuodesta 2019 lähtien uutta versiota tai päivitystä ei ole ollut vuodesta 2003 lähtien.

Numero kolme on paketti nimeltä elfutils [6], joka on puhtaasti saatavana Linuxille. Se tarjoaa vaihtoehtoisia työkaluja GNU Binutilsille ja sallii myös ELF-tiedostojen vahvistamisen. Huomaa, että kaikki paketissa olevien apuohjelmien nimet alkavat "elf utils" -nimellä eu.

Viimeisenä mutta ei vähäisimpänä mainitsemme objdumpin. Tämä työkalu on samanlainen kuin valmius, mutta keskittyy objektitiedostoihin. Se tarjoaa samanlaisen valikoiman tietoja ELF-tiedostoista ja muista objektimuodoista.

.Listaus 8: Objdumpin purkamat tiedostotiedot

$ objdump -f / bin / touch
/ bin / touch: tiedostomuoto elf64-x86-64
arkkitehtuuri: i386: x86-64, liput 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
aloitusosoite 0x00000000004025e3
$

Mukana on myös ohjelmistopaketti nimeltä 'elfkickers' [9], joka sisältää työkalut ELF-tiedoston sisällön lukemiseen ja käsittelyyn. Valitettavasti julkaisujen määrä on melko pieni, ja siksi me vain mainitsemme sen, emmekä näytä muita esimerkkejä.

Kehittäjänä saatat katsoa sen sijaan 'pax-utils' [10,11]. Tämä joukko apuohjelmia tarjoaa useita työkaluja, jotka auttavat vahvistamaan ELF-tiedostoja. Esimerkiksi dumpelf analysoi ELF-tiedoston ja palauttaa C-otsikkotiedoston, joka sisältää tiedot - katso kuva 2.

Johtopäätös

Älykkään suunnittelun ja erinomaisen dokumentoinnin yhdistelmän ansiosta ELF-muoto toimii erittäin hyvin ja on edelleen käytössä 20 vuoden jälkeen. Yllä esitettyjen apuohjelmien avulla saat käsityksen ELF-tiedostosta ja voit selvittää, mitä ohjelma tekee. Nämä ovat ensimmäiset vaiheet ohjelmistojen analysoimiseksi - onnellinen hakkerointi!

Linkit ja viitteet
  • [1] Suoritettava ja linkitettävä muoto (ELF), Wikipedia
  • [2] Fuksia OS
  • [3] Suoritettavien tiedostomuotojen vertailu, Wikipedia
  • [4] Linux Foundation, viitatut tekniset tiedot
  • [5] Ciro Santilli: ELF Hello World -opastus
  • [6] elfutils Debian-paketti
  • [7] elfdump
  • [8] Michael Boelen: 101 ELF-tiedostoa Linuxissa: ymmärtäminen ja analyysi
  • [9] jalkapalloilijat
  • [10] Karkaistu / PaX-apuohjelmat
  • [11] pax-utils, Debian-paketti
Kiitokset

Kirjoittaja haluaa kiittää Axel Beckertiä tuesta tämän artikkelin valmistelussa.

Asenna uusin Dolphin Emulator for Gamecube & Wii Linuxiin
Dolphin-emulaattorin avulla voit pelata valitsemiasi Gamecube & Wii -pelejä Linux-henkilökohtaisilla tietokoneilla (PC). Koska Dolphin Emulator on va...
Kuinka käyttää GameConqueror-huijausmoottoria Linuxissa
Artikkelissa on opas GameConqueror-huijausmoottorin käytöstä Linuxissa. Monet Windows-pelejä pelaavat käyttäjät käyttävät "Cheat Engine" -sovellusta m...
Parhaat pelikonsoliemulaattorit Linuxille
Tässä artikkelissa luetellaan suositut pelikonsolin emulointiohjelmistot, jotka ovat saatavana Linuxille. Emulointi on ohjelmistojen yhteensopivuusker...