ELF -tiedostomuodon ymmärtäminen

Understanding Elf File Format



Lähdekoodista binaarikoodiin

Ohjelmointi alkaa fiksusta ideasta ja lähdekoodin kirjoittamisesta valitsemallasi 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 linkitin kääntää objektikoodin binääritiedostoksi, joka linkittää objektikoodin viitattuihin kirjastoihin. Tämä tiedosto sisältää yksittäiset ohjeet konekoodina, jotka CPU ymmärtää ja suoritetaan heti, kun käännetty ohjelma suoritetaan.

Edellä mainittu binaaritiedosto noudattaa tiettyä rakennetta, ja yksi yleisimmistä 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 on valinnut ELF: n vakiotiedostomuodoksi Unix- ja Unix-tyyppisille järjestelmille x86-prosessoreilla. Onneksi ELF -muoto oli aiemmin dokumentoitu sekä System V -sovelluksen binaariliitännässä että Tool Interface Standardissa [4]. Tämä tosiasia yksinkertaisti huomattavasti Unix-pohjaisten käyttöjärjestelmien eri toimittajien ja kehittäjien välistä standardointisopimusta.



Syy tähän päätökseen oli ELF: n suunnittelu-joustavuus, laajennettavuus ja eri alustojen välinen tuki erilaisille endialaisille muodoille ja osoitteille. ELF: n suunnittelu ei rajoitu tiettyyn suorittimeen, käskyjoukkoon tai laitteistoarkkitehtuuriin. Katso suoritettavien tiedostomuotojen yksityiskohtainen vertailu täältä [3].



Siitä lähtien useat eri käyttöjärjestelmät ovat käyttäneet ELF -muotoa. Tähän kuuluvat muun muassa Linux, Solaris/Illumos, Free-, Net- ja OpenBSD, QNX, BeOS/Haiku ja Fuchsia OS [2]. Lisäksi se löytyy mobiililaitteista, joissa on Android-, Maemo- tai Meego OS/Sailfish -käyttöjärjestelmä, sekä pelikonsoleista, kuten PlayStation Portable, Dreamcast ja Wii.





Tekniset tiedot eivät selvennä ELF -tiedostojen tiedostotunnistetta. Käytössä on erilaisia ​​kirjainyhdistelmiä, kuten .axf, .bin, .elf, .o, .prx, .puff, .ko, .so ja .mod tai ei mitään.

ELF -tiedoston rakenne

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



Listaus 1: ELF -rakenteen manpage

$ mies yksitoista

ELF (5) Linux -ohjelmoijan käsikirja ELF (5)

NIMI
elf - suoritettavien ja linkitysmuotojen (ELF) tiedostojen muoto

SYNOPSIS
#sisältää

KUVAUS
Otsikkotiedosto määrittää ELF -suoritettavan binäärimuodon muodon
tiedostot. Näiden tiedostojen joukossa on tavallisia suoritettavia tiedostoja, jotka voidaan siirtää
objektitiedostoja, ydintiedostoja ja jaettuja kirjastoja.

Suoritettava tiedosto, joka käyttää ELF -tiedostomuotoa, koostuu ELF -otsikosta,
jota seuraa ohjelman otsikkotaulukko tai osion otsikkotaulukko tai molemmat.
ELF -otsikko on aina tiedoston nollakohdassa. Ohjelma
otsikkotaulukko ja osion otsikkotaulukon siirtymä tiedostossa ovat
määritetty ELF -otsikossa. Kaksi taulukkoa kuvaavat loput
tiedoston erityispiirteet.

...

Kuten yllä olevasta kuvauksesta näet, ELF -tiedosto koostuu kahdesta osasta - ELF -otsikosta ja tiedostotiedoista. Tiedostotieto -osio voi koostua ohjelman otsikkotaulukosta, joka kuvaa nollaa tai useampia segmenttejä, osion otsikkotaulukosta, joka kuvaa nolla tai useampia osia, jota seuraa tiedot, joihin viitataan ohjelman otsikkotaulukon merkinnöistä, ja osion otsikkotaulukosta. Jokainen segmentti sisältää tietoja, joita tarvitaan tiedoston suorittamiseen ajon aikana, kun taas osiot sisältävät tärkeitä tietoja linkittämistä ja siirtämistä 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, jota seuraa 0x45, 0x4c ja 0x46, mikä tarkoittaa kolmea kirjainta E, L ja F. Muiden arvojen lisäksi otsikko osoittaa myös, onko kyseessä ELF -tiedosto 32- vai 64-bittinen muoto, käyttää vain vähän tai suurta endianssia, näyttää ELF-version sekä sen, mihin käyttöjärjestelmään tiedosto on koottu, jotta se voi toimia yhdessä oikean sovelluksen binääriliittymän (ABI) ja suorittimen ohjeiden kanssa.

Binaaritiedoston kosketusnäytön heksdump näyttää seuraavalta:

.Listaus 2: Binääritiedoston kuusikulma

$ hd/usr/bin/touch | pää -5
00000000 7f 45 4c 46 02 01 01 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 | @ ....... (....... |
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 | | [sähköposti suojattu] |

Debian GNU/Linux tarjoaa readelf -komennon, joka sisältyy GNU -pakettiin binutils. Kytkimen -h (lyhyt versio –file -header) mukana se näyttää hienosti ELF -tiedoston otsikon. Listaus 3 havainnollistaa tätä komennon kosketuksessa.

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

$ readelf -h/usr/bin/touch
ELF -otsikko:
Taikuus: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Luokka: ELF64
Data: 2: n täydennys, 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 otsikoiden alku: 64 (tavua tiedostoon)
Osion otsikoiden alku: 58408 (tavua tiedostoon)
Liput: 0x0
Tämän otsikon koko: 64 (tavua)
Ohjelman otsikoiden koko: 56 (tavua)
Ohjelmaotsikoiden määrä: 9
Osien otsikoiden koko: 64 (tavua)
Osien otsikoiden lukumäärä: 27
Osion otsikon merkkijonotaulukon hakemisto: 26

Ohjelman otsikko

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

Readelf -komento auttaa jälleen poimimaan tiedot ELF -tiedostosta. Kytkin -l (lyhenne sanoista –program -headers tai –segments) paljastaa lisätietoja luettelossa 4 esitetyllä tavalla.

.Lista 4: Näytä ohjelman otsikoiden tiedot

$ readelf -l/usr/bin/touch

Elf -tiedostotyyppi on EXEC (suoritettava tiedosto)
Tulopiste 0x4025e3
Ohjelmaotsikoita on yhdeksän, alkaen sivusta 64

Ohjelman otsikot:
Tyyppi Offset VirtAddr PhysAddr
FileSiz MemSiz -liput kohdista
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Pyynnön tulkki: /lib64/ld-linux-x86-64.so.2]
KUORMA 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
LATAA 0x000000000000de10 0x000000000060de10 0x000000000060de10
0x0000000000000524 0x0000000000000748 RW 200000
DYNAAMINEN 0x000000000000de28 0x000000000060de28 0x000000000060de28
0x00000000000001d0 0x00000000000001d0 RW 8
HUOMAUTUS 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

Osasta segmenttikartoitukseen:
Segmenttiosiot ...
00
01 .väli
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini. rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
04. Dynaaminen
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dynamic .got

Osion otsikko

ELF -rakenteen kolmas osa on osion otsikko. Tarkoituksena on luetella binäärin yksittäiset osat. Kytkin -S (lyhenne –section -headers tai –sections) luettelee eri otsikot. Kosketuskomennossa on 27 osion otsikkoa, ja luettelo 5 näyttää vain neljä ensimmäistä niistä ja viimeisen. Jokainen rivi kattaa osan koon, osan tyypin sekä sen osoitteen ja muistin siirtymän.

Luettelo 5: Osan tiedot, jotka paljastetaan itse

$ readelf -S/usr/bin/touch
Osiootsikoita on 27, alkaen offsetista 0xe428:

Osioiden otsikot:
[Nr] Nimi Tyyppi Osoite Siirtymä
Koko EntSize Liput Linkin tiedot Kohdista
[0] NULL 0000000000000000 00000000
0000000000000000 000000000000000000 0 0 0
[1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2]. Huomautus. ABI-tunniste HUOMAUTUS 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .note.gnu.build-i HUOMAUTUS 0000000000400274 00000274
...
...
[26] .shstrtab STRTAB 0000000000000000 0000e334
00000000000000ef 0000000000000000 0 0 1
Avain lippuihin:
W (kirjoitus), A (allokointi), X (suorita), M (yhdistäminen), S (merkkijonot), l (suuri)
I (info), L (linkkijärjestys), G (ryhmä), T (TLS), E (poissulje), x (tuntematon)
O (vaaditaan käyttöjärjestelmän lisäkäsittely) o (käyttöjärjestelmäkohtainen), p (prosessorikohtainen)

Työkalut ELF -tiedoston analysointiin

Kuten olet ehkä huomannut yllä olevista esimerkeistä, GNU/Linux sisältää monia hyödyllisiä työkaluja, jotka auttavat sinua analysoimaan ELF -tiedostoa. Ensimmäinen ehdokas, jota tarkastellaan, on tiedostoapuohjelma.

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

Luettelo 6: Perustiedot tiedoston avulla

$ file /bin /touch
/bin/touch: ELF 64-bittinen suoritettava LSB, x86-64, versio 1 (SYSV), dynaamisesti linkitetty, tulkki/lib64/l,
GNU/Linux 2.6.32, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, poistettu
$

Toinen ehdokas on itse. Se näyttää yksityiskohtaisia ​​tietoja ELF -tiedostosta. Kytkimien luettelo on verrattain pitkä ja kattaa kaikki ELF -muodon näkökohdat. Kytkimen -n (lyhenne sanoista –notes) käyttäminen Listaus 7 näyttää vain muistiinpano -osiot, jotka ovat tiedoston kosketuksessa -ABI -versiotunniste ja rakennustunnuksen bittijono.

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

$ readelf -n/usr/bin/touch

Näytetään muistiinpanot, jotka on löydetty tiedostonsiirrosta 0x00000254 ja joiden pituus on 0x00000020:
Omistaja Tietojen koko Kuvaus
GNU 0x00000010 NT_GNU_ABI_TAG (ABI -versiotunniste)
Käyttöjärjestelmä: Linux, ABI: 2.6.32

Näytetään muistiinpanot, jotka on löydetty tiedostonsiirrosta 0x00000274 ja joiden pituus on 0x00000024:
Omistaja Tietojen koko Kuvaus
GNU 0x00000014 NT_GNU_BUILD_ID (ainutlaatuinen koontitunnuksen bittijono)
Rakennustunnus: ec08d609e9e8e73d4be6134541a472ad0ea34502

Huomaa, että Solaris- ja FreeBSD -käyttöjärjestelmissä apuohjelma elfdump [7] vastaa readelfiä. Vuodesta 2019 lähtien uutta julkaisua tai päivitystä ei ole julkaistu vuoden 2003 jälkeen.

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

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

.Lista 8: Objdumpin poimimat 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

$

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

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

Johtopäätös

Älykkään suunnittelun ja erinomaisen dokumentaation yhdistelmän ansiosta ELF -muoto toimii erittäin hyvin ja on edelleen käytössä 20 vuoden jälkeen. Yllä esitetyt apuohjelmat antavat sinulle käsityksen ELF -tiedostosta ja voit selvittää, mitä ohjelma tekee. Nämä ovat ensimmäiset vaiheet ohjelmistojen analysointiin - onnellista hakkerointia!

Linkit ja viitteet
Kiitokset

Kirjoittaja haluaa kiittää Axel Beckertia hänen tuestaan ​​tämän artikkelin valmistelussa.