Skip to content

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).