4 Disassembling a obfuskace
- porovnat lineární a rekurzivní disassembling
- definovat obfuskaci a její metriky
- vysvětlit neprůhledné predikáty a zploštění toku
- zdůvodnit, proč je odstranění obfuskace legitimní
4.1 Ukázka: skok, který nikdy nenastane
xor eax, eax
jz dal ; vždy skočí
db 0E8h ; bajt navíc
dal:
...
Lineární disassembler vezme E8 jako začátek call a rozsype další instrukce. Program přitom běží správně. Podmínka je vždy pravdivá a bajt je tam jen pro zmatení.
4.2 Disassembling
- Lineární průchod: čte bajt po bajtu. Rychlý, ale data v kódu ho rozhodí.
- Rekurzivní průchod: sleduje tok. Neprůhledné predikáty a nepřímé skoky jsou pro něj slabina.
- Rozšířený lineární a hybridní: kombinují obojí.
4.3 Obfuskace
Změna programu tak, aby mu bylo obtížné rozumět, a přitom zůstala zachovaná funkce.
Metriky: potence (jak moc ztíží čtení člověku), odolnost (proti deobfuskátoru), cena (režie) a utajení.
Hodnota je známá obfuskátoru při vytváření, ale pro analýzu je těžké ji určit.
| Technika | Princip |
|---|---|
| neprůhledné predikáty | falešné větve |
| mrtvý kód | instrukce bez vlivu |
| nereducibilní CFG | skoky do smyček, ruší dekompilaci |
| tabulková interpretace | smyčka se switchem, vlastní bytecode |
| inlining, outlining | mění hranice funkcí |
| redundantní argumenty | maskují rozhraní |
U Crackme musíš vysvětlit, proč odstranění obfuskace nezmění chování. Třeba že skok je vždy proveden, takže přemostění na nop je ekvivalentní.
4.4 Kvíz
4.5 Tahák
- Lineární: data rozhodí. Rekurzivní: nepřímé skoky a predikáty.
- Obfuskace = stejná funkce, horší čitelnost.
- Potence, odolnost, cena.
- U Crackme vysvětli, proč je odstranění legitimní.