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.