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:
- Baksmali: Breytir vélarkóða í smalamál, til dæmis
objdumpog radare2. - Bakþýðandi: Breytir vélarkóða í C-líkan kóða, til dæmis Ghidra, IDA og Binary Ninja.
Mælt með röð fyrir byrjendur
- Könnum skráargerðina með
file. - Leitum að gagnlegum strengjum með
strings. - Opnum
mainog 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:
- Við opnum skrána og látum tólið greina hana (e. analyze).
- Við förum í fallið
mainog lesum úttak bakþýðandans. - 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. - 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ð. - Þ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.