ELF snið
ELF (Executable and Linkable Format) er staðlað snið fyrir keyranlegar skrár, hlutaskrár og kerfisbókasöfn á Linux.
Þegar þú þýðir 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áar
┌─────────────────────┐
│ ELF Header │ ← Grunnupplýsingar: gerð, arkitektúr, [inngangspunktur](../glossary.md#inngangspunktur)
├─────────────────────┤
│ Program Headers │ ← Hvernig á að hlaða forritið í minni
├─────────────────────┤
│ .text │ ← Keyranlegur kóði
├─────────────────────┤
│ .rodata │ ← Read-only gögn (t.d. strengir)
├─────────────────────┤
│ .data │ ← Frumstilltar [altækar breytur](../glossary.md#altaekar-breytur)
├─────────────────────┤
│ .bss │ ← Ófrumstilltar [altækar breytur](../glossary.md#altaekar-breytur)
├─────────────────────┤
│ .plt / .got │ ← Töflur fyrir ytri föll
├─────────────────────┤
│ Section Headers │ ← Lýsingar á öllum hlutum
└─────────────────────┘
Mikilvægustu hlutarnir
.text (Kóðahlutinn)
Hér er keyranlegur kóði forritsins. Þetta er það sem bakþýðendur sýna þér sem smalakóða.
objdump -d challenge # Sýnir allan smalakóða
objdump -d -M intel challenge # Með Intel-[setningafræði](../glossary.md#setningafraedi)
.rodata
Read-only gögn, þ.e. strengir sem eru beinlínis skrifaðir í forritið. strings skipunin sýnir þetta:
strings challenge
strings -tx challenge # Sýnir líka [vistfangið](../glossary.md#vistfang)
.plt og .got: Ytri föll
Þegar C forrit kallar á printf eða system, eru þessi föll í libc kerfissafninu, ekki í forritinu sjálfu. PLT (Procedure Linkage Table) og GOT (Global Offset Table) leysa þetta:
- PLT: Stöðvar sem hoppa í GOT
- GOT: Tafla með raunverulegum vistföngum libc-fallanna
Öryggisstillingar
checksec er tólið sem sýnir hvaða vernd er virk:
checksec --file=challenge
| Vernd | Lýsing |
|---|---|
| NX (No-Execute) | Minni á stafla og hrúgu er ekki keyranlegt: shellcode virkar ekki |
| Stack Canary | Handahófskennt gildi á stafla sem greinir yfirflæði |
| PIE (Position Independent Executable) | Forritið hleðst á handahófskennt vistfang (ASLR) |
| RELRO | Verndar GOT töfluna gegn skrifum |
| ASLR | Stýrikerfisvernd: handahófskennt vistfang stafla, hrúgu, libc |
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: NX er virkt (shellcode virkar ekki), en engin canary og engin PIE
32-bit vs 64-bit
Flest nútímaleg CTF verkefni eru 64-bit, en sum eru 32-bit. file skipunin segir þér hvort um er að ræða:
challenge: ELF 64-bit LSB executable, x86-64 ← 64-bit
challenge: ELF 32-bit LSB executable, Intel 80386 ← 32-bit
Munurinn skiptir máli fyrir pwn (t.d. hvernig frumbreytur eru send í föll).