Hoppa yfir í efnið

Tól til kyrrstæðrar greiningar

Kyrrstæð greining (e. static analysis) felst í að skoða forrit án þess að keyra það. Við getum lesið vélarkóðann, leitað að strengjum og skilið hvernig forritið virkar án þess að ræsa það.

Helstu flokkarnir eru:

Mælt með röð fyrir byrjendur

  1. Könnum skráargerðina með file.
  2. Leitum að gagnlegum strengjum með strings.
  3. Opnum main og föllin sem það kallar á í bakþýðanda.

strings

Prentar alla læsilega textastrengi sem tólið finnur í tvíundaskránni. Þetta er oft gagnlegt til að fá yfirsýn yfir hvað forritið gerir.

strings challenge
strings -tx challenge    # Sýnir hliðrun hvers strengs frá upphafi skrár (sextándakerfi)
strings -n 5 challenge   # Sýnir aðeins strengi sem eru 5+ stafir að lengd

file

Greinir gerð skrárinnar, hvort hún sé ELF, skrifta, PDF o.s.frv.

file challenge
# challenge: ELF 64-bit LSB executable, x86-64, dynamically linked

objdump

Baksmölun (e. disassembly) breytir vélarkóða í smalamál.

objdump -d challenge                   # Sýnir alla keyranlega hluta
objdump -d -M intel challenge          # Notar Intel-málskipan

AT&T- og Intel-málskipan

objdump notar sjálfgefið AT&T-málskipan (e. syntax) (mov %rax, %rbx) en mörgum þykir Intel-málskipan læsilegri (mov rbx, rax). Við veljum hana með -M intel.


Bakþýðendur

Bakþýðandi umbreytir vélarkóða í C-líkan kóða sem er mun auðveldara að lesa. Þrír vinsælir bakþýðendur eru Ghidra, IDA og Binary Ninja. Þeir vinna svipuð verk en úttakið getur verið ólíkt. Við veljum eitt tól til að byrja með og lærum vel á það.

Almennt vinnulag (óháð tóli)

Vinnulagið er svipað óháð því hvaða tól við veljum:

  1. Við opnum skrána og látum tólið greina hana (e. analyze).
  2. Við förum í fallið main og lesum úttak bakþýðandans.
  3. Við endurnefnum (e. rename) föll og breytur eftir því sem hlutverk þeirra verður skýrt. Við getum til dæmis breytt local_48 í user_input þegar við sjáum að þar er inntak notanda geymt.
  4. Við leiðréttum gagnatög (e. data types) þegar tólið hefur giskað rangt, til dæmis úr undefined8 í char[8] eða grunngerð.
  5. Þegar við skiljum reikniritið skrifum við Python-skriftu sem reiknar út rétta svarið.

Dæmi um úttak

Úttakið lítur svipað út í öllum þremur tólunum:

void main(void) {
    char local_48 [64];
    puts("Sláðu inn lykilorðið: ");
    gets(local_48);
    if (strcmp(local_48, "swordfish") == 0) {
        puts("Rétt!");
    }
}

Ólík nöfn eftir tólum

Tólin gefa ónefndum breytum mismunandi sjálfgefin nöfn. Sama staðværa breytan gæti heitið local_48 í Ghidra, v1 í IDA eða var_48 í Binary Ninja. Nöfnin eru ólík en breytan getur samt gegnt sama hlutverki.

Helstu flýtilyklar

Aðgerð Ghidra IDA Binary Ninja
Opna C-úttak sjálfgefinn gluggi F5 sjálfgefið
Endurnefna (e. rename) L N N
Breyta gagnatagi (e. retype) Ctrl+L Y Y
Fara á vistfang G G G
Sjá millivísanir (e. cross-references, xrefs) hægrismella → References X X

Ghidra

Ghidra er ókeypis bakþýðandi með opnum frumkóða frá NSA. Tólið styður margar gerðir örgjörvahögunar og er vinsælt í CTF-keppnum. Það krefst studdrar 64-bita JDK-útgáfu; nákvæm útgáfukrafa getur breyst milli útgáfa Ghidra.

Uppsetning: Við sækjum útgáfupakkann og fylgjum opinberum uppsetningarleiðbeiningum Ghidra.

Helstu gluggarnir eru Symbol Tree (föll og tákn), Decompiler (C-líkt úttak) og Listing (smalakóði). Við byrjum á main í Symbol Tree.


IDA

IDA hefur lengi talist iðnaðarstaðall og hefur öflugan bakþýðanda en fullútgáfan er dýr. IDA Free er ætluð til óviðskiptalegra nota, styður 32- og 64-bita x86 og getur vistað greininguna. Bakþýðing fer fram í skýjaþjónustu og ókeypis útgáfan inniheldur hvorki IDAPython né þróunarsett (SDK). Hún dugar engu að síður fyrir mörg x86-CTF-dæmi; við ýtum á F5 til að biðja um C-líkt úttak.


Binary Ninja

Binary Ninja er nútímalegt tól sem mörgum þykir hafa einfalt viðmót. Binary Ninja Free keyrir á eigin tölvu og er ætluð til óviðskiptalegra nota og mats. Ókeypis útgáfan bakþýðir x86, x86-64, ARMv7 og Thumb-2 og sýnir meðal annars High Level IL og C-líkt úttak, en styður hvorki forritaskil (API) né viðbætur. Greiddar útgáfur styðja fleiri millimál, örgjörvahögun og sjálfvirkni.


Radare2 (r2)

Radare2 er öflugt skipanalínutól til baksmölunar en getur verið flóknara í notkun en Ghidra.

r2 challenge       # Opnar skrána
aa                 # Greinir föll og tilvísanir
afl                # Listar föll
s main             # Hoppar í fallið main
pdf                # Sýnir baksmölun falls

Note

Cutter er myndrænt viðmót fyrir Rizin. Það byggði áður á radare2 en notar nú Rizin sem bakenda.


Samanburður tóla

Tól Kostir Gallar
Ghidra Ókeypis, öflugur bakþýðandi Þungt í uppsetningu, Java-viðmót
Binary Ninja Free Einfalt viðmót, keyrir á eigin tölvu Takmarkaðar örgjörvahaganir, engin forritaskil eða viðbætur
IDA Free Getur vistað greiningu, x86 og x86-64 Skýjabakþýðandi, engin forritaskil, aðeins til óviðskiptalegra nota
objdump Algengt skipanalínutól Enginn bakþýðandi, aðeins baksmali
r2 Mjög öflugt Flókið skipanakerfi

Við mælum með að velja eitt tól og læra vel á það. Ghidra er þó gagnlegt þegar við þurfum stuðning við fjölbreytta örgjörvahögun.


Æfingar

Verkefni til að æfa bakþýðendur og kyrrstæða greiningu:

  • Factory Floor: Við skoðum mörg lítil hjálparföll og vinnum okkur smám saman að heildarmyndinni.
  • Tourist Trap: Við greinum tvíundaskrá sem notar annað skipanasett en x86-64.
  • Codebook: Við skoðum hvernig kóði og föst gögn vinna saman við að umbreyta inntaki.