Americký národní bezpečnostní úřad NSA zveřejnil nový nástroj Ghidra k reverzní analýze softwaru. Program doposud interně používali inženýři světoznámé agentury k hledání malwaru a nejspíše i zranitelností, které poté mohli sami využít ve svých kybernetických operacích.
Ghidra rozšířila balík softwaru NSA, který dnes agentura publikuje pod svobodnou licencí, k čemuž má i svůj vlastní účet na GitHubu.
Prolomíme zabezpečení centrálního pultu fiktivní jaderné elektrárny
Pojďme si Ghidru vyzkoušet v praxi na nějakém modelovém příkladu. Dejme tomu, že jsem zlý hacker, kterému donesli na disketě tajemný program JadernaElektrarna.exe. Když jej spustím, program nastartuje v textovém režimu a oznámí, že se jedná o ovládací konzoli jaderné elektrárny Havlíčkův Brod!
Program po nás chce heslo ředitele elektrárny
To zní zajímavě, ale má to jednu vadu na kráse. Ovládací program po mně požaduje heslo pana ředitele.
Nic takového pochopitelně po ruce nemám, ale jsem přece schopný hacker – reverzní inženýr, a tak sáhnu po některém z podobných nástrojů, které dokážou analyzovat libovolný program pro daný procesor a pokusí se jej znovu přeložit do čitelného kódu, který budu moci projít, abych pochopil, co se uvnitř programu vlastně děje.
Ghidra startuje a dokládá, že i federální NSA miluje dramatická loga svých aplikací
Ghidra pochopitelně není jediná svého druhu, jelikož v ní ale mají prsty schopné mozky z NSA, mohla by fungovat na jedničku. Zároveň se jedná o multiplatformní nástroj napsaný v Javě, takže poběží jak na Windows, tak na macOS a linuxových systémech.
Analyzujeme program pomocí balíku Ghidra
Jdeme na to. Spouštím Ghidru, zakládám nový projekt a otevírám její klíčový nástroj CodeBrowser. Do něj konečně importuji náš tajemný program JadernaElektrarna.exe a nechám Ghidru provést jeho kompletní analýzu.
Zakládám nový projekt a vkládám do něj k analýze program JadernaElektrarna.exe
Ovládací aplikace jaderné elektrárny Havlíčkův Brod je napsaná v C++ a CodeBrowser na mě vyplivne tuny v jazyku symbolických adres (slangově assembleru), který nyní mohu instrukci po instrukci pročítat, a pokud objednám mnoho pizzy, za týden se možná doberu kýženého výsledku, jak je to s tím heslem pana ředitele.
CodeBrowser, tedy pohled na strojový kód programu a pokus o jeho dekompilaci vpravo
Vyhledám, kde se v programu vyskytuje text „Zadejte heslo reditele“
Abych to urychlil, použiji vestavěný vyhledávač textových řetězců a podívám se, kde se v kódu přesně vyskytuje spojení Zadejte heslo reditele, protože přesně poté, co tuto zprávičku program vypíše do terminálu, z něj bude číst náš vstup, tedy heslo, které poté bude dále zpracovávat. A přesně tato část programu nás zajímá.
Potřebuji se v toku programu dostat do okamžiku, kdy mě požádá, abych vyplnil heslo
Nechám si vyhledat všechny textové řetězce v programu a podívám se, v jakých částech programu se vyskytuje žádost o heslo.
CodeBrowser nachází blok kódu, který potřebuji a já se podívám na jeho dekompilovanou a mnohem čitelnější podobu v C++. Z tohoto kódu je patrné, že se vstup z klávesnice postupně uloží do proměnné local_38 a _Buf1 a právě tu druhou proměnnou poté program porovnává pomocí funkce memcmp, což je standardní funkce C++ pro porovnání dvou bloků paměti.
Když tyto dva bloky paměti budou shodné, program pokračuje výpisem „Vítejte v jaderné elektrárně“ a pokračuje dál v běhu.
Vyhledal jsem v kódu okamžik, kdy se program ptá na heslo a zjistil jsem, že je heslo ředitele součástí kódu a zároveň bez jakéhokoliv šifrování!
Reverzní analýzou jsem našel heslo v kódu
Při pohledu na funkci memcmp je patrné, že vstup z klávesnice se porovnává s pamětí v podobě prostého textu ve znění pred_spanim_ctu_zive.cz, z čehož plyne, že právě tento text bude představovat heslo ředitele elektrárny!
Zkusím jej použít v programu a… A jadernou elektrárnu Havlíčkův Brod právě ovládli nebezpeční hackeři z Brna.
Reverzní analýzou jsem se dopátral hesla. Skutečné programy kritické státní informační infrastruktury jsou naštěstí mnohem bezpečnější.
V reálných podmínkách by to tak jednoduché pochopitelně nebylo, neboť éra, kdy bylo takto důležité heslo a dokonce v prostém textu bez jakéhokoliv šifrování součástí zdrojového kódu programu, je už dávno minulostí. Tedy doufejme.
Na závěr ještě náhled skutečného kódu C++ našeho primitivního textového programu ovladače fiktivní elektrárny. Můžete jej srovnat s tím, který Ghidra vytvořila dekompilací strojového kódu.
V praxi jsme si ale vyzkoušeli, jak podobné programy pro softwarový reverzní inženýring v principu fungují a proč jsou nedílnou výbavou počítače každého studenta IT, bezpečnostního analytika, inženýrů z antivirových společností a ano, nakonec i zlých hackerů všeho druhu.