Fra kildekode til binær kode
Programmering starter med å ha en smart idé, og skrive kildekode på et programmeringsspråk etter eget valg, for eksempel C, og lagre kildekoden i en fil. Ved hjelp av en tilstrekkelig kompilator, for eksempel GCC, blir kildekoden din oversatt til objektkode, først. Etter hvert oversetter linkeren objektkoden til en binær fil som kobler objektkoden til de refererte bibliotekene. Denne filen inneholder enkeltinstruksjonene som maskinkode som forstås av CPU, og utføres så snart det sammensatte programmet kjøres.
Den binære filen som er nevnt ovenfor, følger en spesifikk struktur, og en av de vanligste heter ELF som forkorter kjørbart og koblingbart format. Det er mye brukt til kjørbare filer, flyttbare objektfiler, delte biblioteker og kjernedumps.
For tjue år siden - I 1999 - har 86open -prosjektet valgt ELF som standard binære filformat for UNIX og UNIX -lignende systemer på x86 -prosessorer. Heldigvis hadde ELF -formatet tidligere blitt dokumentert i både System V Application Binary Interface, og verktøygrensesnittstandarden [4]. Dette faktum forenklet avtalen om standardisering mellom de forskjellige leverandørene og utviklerne av UNIX-baserte operativsystemer.
Årsaken bak den avgjørelsen var utformingen av ELF - fleksibilitet, utvidbarhet og støtte for plattform for forskjellige endianformater og adressestørrelser. ELFs design er ikke begrenset til en spesifikk prosessor, instruksjonssett eller maskinvarearkitektur. For en detaljert sammenligning av kjørbare filformater, ta en titt her [3].
Siden den gang er ELF -formatet i bruk av flere forskjellige operativsystemer. Blant andre inkluderer dette Linux, Solaris/Illumos, Free-, Net- og OpenBSD, QNX, Beos/Haiku og Fuchsia OS [2]. Videre finner du det på mobile enheter som kjører Android, Maemo eller Meego OS/Sailfish OS, så vel som på spillkonsoller som PlayStation Portable, Dreamcast og Wii.
Spesifikasjonen avklarer ikke filtvengden for ELF -filer. I bruk er en rekke bokstavkombinasjoner, for eksempel .AXF, .søppelkasse, .Alv, .o, .prx, .puff, .ko, .Så, og .mod, eller ingen.
Strukturen til en ELF -fil
På en Linux -terminal gir Command Man Elf deg et nyttig sammendrag om strukturen til en ELF -fil:
Oppføring 1: Manpagen til alvestrukturen
$ mann alvSom du ser fra beskrivelsen over, består en ELF -fil av to seksjoner - en ELF -overskrift og fildata. Fildata -seksjonen kan bestå av en programtabell som beskriver null eller flere segmenter, en tabell for seksjonen som beskriver null eller flere seksjoner, som blir fulgt av data referert til av oppføringer fra programtabellen, og tabellen for seksjon. Hvert segment inneholder informasjon som er nødvendig for utførelse av kjøretid, mens seksjoner inneholder viktige data for kobling og flytting. Figur 1 illustrerer dette skjematisk.
ELF -overskriften
ELF -overskriften er 32 byte lang, og identifiserer formatet til filen. Det starter med en sekvens på fire unike byte som er 0x7F etterfulgt av 0x45, 0x4c og 0x46 som oversettes til de tre bokstavene E, L og F. Blant andre verdier indikerer overskriften også om det er en ELF-fil for 32 eller 64-biters format, bruker liten eller stor endiansness, viser ELF-versjonen så vel som operativsystemet filen ble samlet for for å kunne samarbeide med den Right Application Binary Interface (ABI) og CPU Instruksjonssett.
Hexdump av den binære filen berører som følger:
.Oppføring 2: HexDump av den binære filen
$ HD/usr/bin/touch | Hode -5Debian Gnu/Linux tilbyr lesekommandoen som er gitt i GNU 'Binutils' -pakken. Ledsaget av bryteren -h (kortversjon for "-file-header") viser den pent overskriften til en ELF-fil. Oppføring 3 illustrerer dette for kommandoen berøring.
.Oppføring 3: Viser overskriften til en ELF -fil
$ readelf -h/usr/bin/touchProgramoverskriften
Programoverskriften viser segmentene som brukes ved kjøretid, og forteller systemet hvordan du lager et prosessbilde. Overskriften fra Listing 2 viser at ELF -filen består av 9 programoverskrifter som har en størrelse på 56 byte hver, og den første overskriften starter på Byte 64.
Igjen hjelper lesekommandoen til å trekke ut informasjonen fra ELF -filen. Bryteren -L (forkortelse for -program -headers eller -Segmenter) avslører flere detaljer som vist i oppføring 4.
.Oppføring 4: Vis informasjon om programoverskriftene
$ readelf -l/usr/bin/touchSeksjonshodet
Den tredje delen av ELF -strukturen er seksjonen. Det er ment å liste opp enkeltdelene av det binære. Bryteren -S (forkortelse for -seksjonshoder eller -seksjoner) viser de forskjellige overskriftene. Når det gjelder Touch -kommandoen, er det 27 seksjonsoverskrifter, og liste 5 viser de fire første av dem pluss den siste, bare. Hver linje dekker seksjonsstørrelsen, seksjonstypen så vel som sin adresse og minneforskyvning.
.Oppføring 5: Seksjonsdetaljer avslørt av Readelf
$ readelf -s/usr/bin/touchVerktøy for å analysere en ELF -fil
Som du kanskje har nevnt fra eksemplene ovenfor, blir GNU/Linux utfylt med en rekke nyttige verktøy som hjelper deg å analysere en ELF -fil. Den første kandidaten vi vil se på er filverktøyet.
Fil viser grunnleggende informasjon om ELF -filer, inkludert instruksjonssettarkitekturen som koden i en flyttbar, kjørbar eller delt objektfil er ment. I Listing 6 forteller det deg at/bin/touch er en 64-bits kjørbar fil etter Linux Standard Base (LSB), dynamisk koblet og bygget for GNU/Linux-kjernen versjon 2.6.32.
.Oppføring 6: Grunnleggende informasjon ved hjelp av fil
$ fil /bin /berøringDen andre kandidaten er leself. Den viser detaljert informasjon om en ELF -fil. Listen over brytere er sammenlignbart lang, og dekker alle aspektene ved ELF -formatet. Bruke Switch -N (forkortelse for -noter) Listing 7 viser bare notatseksjonene som finnes i filen Touch -ABI -versjonskoden, og Build ID BitString.
.Oppføring 7: Vis valgte seksjoner av en ELF -fil
$ readelf -n/usr/bin/touchLegg merke til at under Solaris og FreeBSD, tilsvarer verktøyet Elfdump [7]. Fra 2019 har det ikke vært en ny utgivelse eller oppdatering siden 2003.
Nummer tre er pakken som heter Elfutils [6] som er rent tilgjengelig for Linux. Den gir alternative verktøy til GNU Binutils, og tillater også validering av ELF -filer. Merk at alle navnene på verktøyene som er gitt i pakken starter med EU for 'ELF -utils'.
Sist, men ikke minst, vil vi nevne objdump. Dette verktøyet ligner på leself, men fokuserer på objektfiler. Det gir et lignende utvalg av informasjon om ELF -filer og andre objektformater.
.Oppføring 8: Filinformasjon trukket ut av objdump
$ objdump -f /bin /berøringDet er også en programvarepakke kalt 'Elfkickers' [9] som inneholder verktøy for å lese innholdet i en ELF -fil, samt manipulere den. Dessverre er antall utgivelser ganske lavt, og det er derfor vi bare nevner det, og viser ikke ytterligere eksempler.
Som utvikler kan du se på 'PAX-UTILS' [10,11], i stedet. Dette settet med verktøy gir en rekke verktøy som hjelper til med å validere ELF -filer. Som et eksempel analyserer Dumpelf ELF -filen, og returnerer en C -overskriftsfil som inneholder detaljene - se figur 2.
Takket være en kombinasjon av smart design og utmerket dokumentasjon fungerer ELF -formatet veldig bra, og er fremdeles i bruk etter 20 år. Verktøyene vist ovenfor gir deg en innsikt i en ELF -fil, og lar deg finne ut hva et program gjør. Dette er de første trinnene for å analysere programvare - lykkelig hacking!
Forfatteren vil takke Axel Beckert for hans støtte angående utarbeidelsen av denne artikkelen.