Statická analýza
Statická analýza je technika reverse engineeringu, při které zkoumáme program bez jeho spuštění. Cílem je pochopit strukturu a logiku programu pouze na základě jeho binární podoby, či analýza jeho statických dat.
Mezi základní techniky statické analýzy patří:
- datová analýza
- dekompilace / disassemblace
Datová analýza
Strings
Mnoho programů obsahuje v binární podobě čitelné stringy. Ty mohou zahrnovat například:
- uživatelské zprávy
- chybové hlášky
- hesla nebo klíče
V Linuxu lze tyto řetězce snadno vypsat pomocí nástroje strings:
$ strings program
Ukázka výstupu:
$ strings program
What's the password?
ACCESS GRANTED
Wrong password!
Sup3rStr0ngP4ssw0rd123!
...
Z výstupu můžeme identifikovat zajímavé hodnoty. Pokud máme podezření na konkrétní pattern (např. flag v CTF), můžeme použít filtraci:
$ strings program | grep flag{
Další častý scénář je nalezení hesla přímo ve výpisu:
$ strings program | grep pass
Pokud program obsahuje heslo v plain textu, lze jej tímto způsobem snadno odhalit.
Praktická ukázka
$ ./program
What's the password? test
Wrong password!
$ ./program
What's the password? Sup3rStr0ngP4ssw0rd123!
ACCESS GRANTED
Pomocí strings jsme byli schopni odhalit správné heslo bez znalosti zdrojového kódu.
Dekompilace
Technika strings je jednoduchá, ale ne vždy funguje – citlivé hodnoty mohou být skryté nebo generované dynamicky. V takovém případě využíváme dekompilaci.
Dekompilace je proces převodu binárního kódu zpět do podoby vyššího jazyka (typicky pseudokód podobný C). K tomu lze využít nástroje jako Ghidra.
Základní postup v Ghidra
- Vytvoření projektu (File → New Project)
- Import binárky (File → Import File)
- Spuštění analýzy (Analyze)
- Otevření funkce
main
Ghidra zobrazí:
- assembly
- dekompilovaný pseudokód (C-like či Rust-like)
Ukázka dekompilovaného kódu
if (strcmp(input, "TajneHeslo123!") == 0) {
puts("ACCESS GRANTED");
} else {
puts("Wrong password!");
}
Z dekompilovaného kódu lze snadno odvodit:
- jak program pracuje
- jak probíhá kontrola vstupu
- jaká je správná hodnota (v tomto případě heslo)
Klíčová je funkce strcmp, která vrací 0 v případě shody. Program tedy porovnává vstup uživatele s pevně daným řetězcem.
$ ./program
What's the password? TajneHeslo123!
ACCESS GRANTED
Kdy použít statickou analýzu?
Statickou analýzu (zejména s využitím dekompilátoru) je vhodné použít ve chvíli, kdy problém nelze vyřešit pouhým nalezením vstupu. Typicky jde o situace, kdy je kontrolní logika implementována složitěji a hodnoty nejsou v binárce přímo uložené v čitelné podobě.
Mezi takové případy patří například:
- flag checkery – vstup je ověřován pomocí více kroků (např. transformace, XOR, hashování, kontrolní součty)
- keygen úlohy – program generuje nebo ověřuje klíč na základě určitého algoritmu
- obfuskovaný kód – hodnoty jsou záměrně skryté nebo rozdělené do více částí
- vícekroková validace – vstup prochází několika podmínkami, smyčkami nebo funkcemi
V těchto scénářích je potřeba pochopit samotnou logiku programu. Dekompilátor umožňuje rekonstruovat strukturu kódu (větvení, smyčky, funkce) a identifikovat, jakým způsobem je vstup zpracováván. Na základě toho lze buď odvodit správný vstup, nebo vytvořit vlastní řešení (např. keygen), které splní požadované podmínky.