Hoppa yfir í efnið

ELF-sniðið

ELF (e. Executable and Linkable Format) er staðlað snið fyrir keyranlegar skrár, hlutaskrár og kerfisbókasöfn á Linux.

Þegar við þýðum C-forrit á Linux verður útkoman ELF-skrá.

Að skoða ELF-skrá

file challenge        # Sýnir grunnupplýsingar
readelf -h challenge  # ELF-haus
readelf -S challenge  # Hlutar
checksec challenge    # Yfirlit yfir öryggisstillingar

Uppbygging ELF-skrár

ELF-skrá inniheldur nokkrar ólíkar töflur og gagnasvæði. Röð þeirra er ekki föst og ELF-hlutar (e. sections) eru ekki það sama og minnishlutar (e. segments):

Eining Hlutverk
ELF-haus Lýsir meðal annars gerð skrár, örgjörvahögun, inngangspunkti og staðsetningu annarra taflna.
Tafla forritshausa (e. program header table) Lýsir minnishlutum sem stýrikerfið hleður í minni. Einn minnishluti getur innihaldið nokkra ELF-hluta.
Gögn hlutanna Innihald hluta á borð við .text, .rodata og .data. Staðsetning þeirra og röð getur verið breytileg.
Tafla hlutahausa (e. section header table) Lýsir heiti, gerð, stærð og staðsetningu hvers hluta. Hún nýtist einkum tengli og greiningartólum en stýrikerfið styðst við töflu forritshausa við hleðslu.

.bss geymir ófrumstilltar altækar breytur. Hlutahausinn skráir stærð svæðisins en sjálf núllbætin taka venjulega ekki pláss í skránni; stýrikerfið tekur frá og núllstillir minnið við ræsingu.

Mikilvægustu hlutarnir

.text (Kóðahlutinn)

Hér er keyranlegur kóði forritsins. Þetta er sá hluti sem bakþýðendur sýna okkur sem smalakóða.

objdump -d challenge           # Sýnir allan smalakóða
objdump -d -M intel challenge  # Með Intel-málskipan (læsilegra)

.rodata

Hér eru skrifvarin gögn, til dæmis strengir sem eru beinlínis skrifaðir í forritið. Skipunin strings leitar að læsilegum strengjum í skránni allri, ekki aðeins í .rodata:

strings challenge
strings -tx challenge  # Sýnir einnig hliðrun strengsins frá upphafi skrár

.plt og .got: Ytri föll

Þegar C-forrit kallar á printf eða system eru föllin í kerfisbókasafninu libc, ekki í forritinu sjálfu. PLT (e. Procedure Linkage Table) og GOT (e. Global Offset Table) sjá um tenginguna:

  • PLT: Lítil milliföll (e. stubs) sem vísa áfram í GOT
  • GOT: Tafla með raunverulegum vistföngum libc-fallanna

Öryggisstillingar

checksec sýnir hvaða öryggisvarnir (e. hardening features) tvíundaskráin styður eða inniheldur:

checksec --file=challenge
Vernd Lýsing
NX (e. No-Execute) Stafli og hrúga eru venjulega ekki keyranleg, svo ekki er hægt að keyra nýtingarkóða þar beint
Staflaverndargildi (e. stack canary) Handahófskennt gildi á stafla sem getur greint yfirflæði
PIE (e. Position Independent Executable) Gerir stýrikerfinu kleift að slembistaðsetja aðalforritið þegar ASLR er virkt
Partial RELRO Gerir hluta GOT-töflunnar skrifvarinn en skilur færslur fyrir síðbúna tengingu (e. lazy binding) eftir skrifanlegar
Full RELRO Leysir ytri tákn við ræsingu og gerir alla GOT-töfluna skrifvarða að því loknu

ASLR (e. Address Space Layout Randomization) er stilling stýrikerfisins sem slembir meðal annars vistföngum staflans, hrúgunnar og kerfisbókasafna. PIE gerir ASLR kleift að slembistaðsetja aðalforritið líka. Venjulegt checksec --file=...-úttak lýsir tvíundaskránni en staðfestir ekki hvort ASLR sé virkt í stýrikerfinu.

Dæmi um checksec-úttak

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x400000)

Þetta þýðir að NX er virkt en hvorki staflaverndargildi né PIE.

32-bita og 64-bita skrár

Flest nútímaleg CTF-verkefni nota 64-bita skrár en sum nota 32-bita skrár. Skipunin file sýnir okkur hvora gerðina við höfum:

challenge: ELF 64-bit LSB executable, x86-64      ← 64-bita
challenge: ELF 32-bit LSB executable, Intel 80386 ← 32-bita

Munurinn skiptir máli fyrir nýtingu tvíundaskráa, til dæmis hvernig frumbreytur eru sendar í föll.


Æfingar

Verkefni til að æfa greiningu ELF-skráa:

  • Secret Compartment: Við skoðum upplýsingar sem leynast í uppbyggingu ELF-skrár.
  • Parallel Worlds: Við berum saman tvær útgáfur sama forrits sem hafa ólíka bitabreidd.
  • Transparency: Við skoðum hvernig forrit notar gögn úr mismunandi hlutum ELF-skrár.