GHidra – NSA Software Reverse Engineering Suite
Begin maart 2019 was het dan zover. De NSA-RD (National Security Agency – Research Directorate) had het al aangekondigd maar nu stond hij daar op GitHub. GHidra!! GHidra is door de NSA bewust op GitHub geplaatst en is open-source. Dit wil zeggen dat de hele source code beschikbaar is en dat iedereen kan meehelpen om de tool te verbeteren. GHidra is een door de NSA ontwikkelde SRE (Software Reverse Engineering) tool die het mogelijk maakt om software, maar met name malware te reverse engineeren maar ook om deze te analyseren en te compilen. En het mooiste is, GHidra is nog gratis ook.
GHidra is dus ontwikkeld door de NSA. Dezelfde NSA die in een kwaad daglicht kwam te staan na de onthullingen van Edward Snowden en het kwijtraken van diverse geavanceerde hack tools. GHidra is misschien wel een goedmaker waardoor de community en de wereld aan de slag kan met een goede gratis toolkit. Uiteraard zijn er andere reverse engineering tools zoals IDA (Pro) en Binary Ninja. Maar dit zijn betaalde tools waarvan de prijs kan variëren (afhankelijk van de configuratie) tussen de 200 en 10.000 euro. GHidra is gratis en heeft ook een ongeëvenaarde “decompiler”. Daarnaast worden nog meer functies geprezen zoals de undo-functie, projectmanagement waardoor meerdere meerdere mensen tegelijkertijd aan een project kunnen werken. GHidra ondersteund een breed scala architecturen. Daarnaast is de gebruikersinterface enorm configureerbaar en kunnen sjablonen gebruikt worden. De software kan uitgebreid worden met optionele in Java of in Python te ontwikkelen extensies en plug-ins.
Genoeg lof dus voor GHidra. Ook bekende security researchers zoals Joxean Koret en Marcus Hutchins (je weet wel, de held van de WannaCry Ransomware affaire) zijn ontzettend positief. De angst dat de NSA de tool gebruikt om security researchers te monitoren lijkt hiermee ook ongegrond. De tool is open source dus als dat al zo was dan zou het uit de broncode te lezen moeten zijn.
Mijn interesse is zeker gewekt. Tijd om GHidra eens wat nader te bekijken.
GHidra Installatie
GHidra is te downloaden v.a. zijn eigen website https://ghidra-sre.org en de distribution package evenals diverse tools en docs zijn te downloaden v.a. de NationalSecurityAgency GitHub pagina https://github.com/NationalSecurityAgency/ghidra.

GHidra ondersteund de x64 versies van Windows 7, Windows 10, Linux (bij voorkeur CentOS 7) en Mac OSX 10.8.3+ (Mountain Lion en later). Om GHidra te draaien moet de machine minimaal beschikken over 4 GB RAM en bij voorkeur 1 GB opslag. Ook moet Java 11 Runtime and Development Kit (JDK) geïnstalleerd zijn (bij voorkeur OpenJDK). Let erop dat Java aanwezig moet zijn in het PATH van het besturingssysteem.
We downloaden GHidra v9.0.2 voor Windows van de GHidra pagina. Het package is 280 MB groot.
Na het downloaden pakken we de Ghidra distribution file uit en plaatsen we deze op het systeem. GHidra kent geen traditionele installer. De installatie gebeurt door het plaatsen van van de “Ghidra distribution file” op het system. Deze methode heeft zijn eigen voordelen en nadelen. Zo zijn er geen administrator rechten nodig om de software te installeren. Ook past GHidra geen bestanden aan zoals configuraties of het register. Dit maakt het verwijderen van GHidra simpel en grondig. Verwijder de GHidra folder en GHidra is compleet van het systeem verwijderd.
Als nadeel kunnen we noteren dat GHidra geen automatische icoontjes aanmaakt in het start-menu en op de desktop. Administrator toegang is benodigd om GHidra op sommige locaties te installeren (b.v. in de root en als service). Ook is GHidra afhankelijk van diverse directories buiten zijn eigen directorystructuur om goed te kunnen functioneren. Denk aan temporary en cache files. Ghidra zal proberen om default OS directories te hanteren voor deze doeleinden. Mochten de default directories problemen opleveren dan kan de locatie van deze directories aangepast worden door de relevante eigenschappen te veranderen in het support/launch.properties bestand.
Als we de directory hebben uitgepakt ziet deze er als volgt uit:

- docs – Documentatie van GHidra zoals release notes, API files, tutorials, etc.
- Extensions – Alle extensies voor GHidra worden in deze folder geplaatst. Extensies breiden de functionaliteit van GHidra verder uit. Neem ook eens een kijkje op de extensie pagina: https://ghidra-sre.org/InstallationGuide.html#Extensions.
- Ghidra – De basisdirectory van GHidra. Hierin staan alle core bestanden die GHidra nodig heeft om te kunnen draaien.
- GPL – De directory waar de GPL supportapplicaties in aanwezig zijn.
- licenses – In deze directory staan alle licenties die GHidra gebruikt.
- server – In deze directory vindt je alle bestanden die nodig zijn om de GHidra serverinstallatie mogelijk te maken. De GHidra server is nodig om het samenwerken aan projecten mogelijk te maken.
- support – In de support directory staan diverse tools die handig kunnen zijn indien er problemen optreden met GHidra. Denk hierbij aan het starten van GHidra in “advanced mode”, debugging tools en opstartvariabelen.
- ghidraRun – Dit is het script welke gebruikt wordt om GHidra te starten in Linux en MacOS.
- ghidraRun.bat – Dit is het script welke gebruikt wordt om GHidra te starten in Windows.
Nu we weten hoe de folderstructuur is opgezet wordt het tijd om GHidra te starten.
Voor Windows maak ik een snelkoppeling naar de “” op het bureaublad. Omdat GHidra geen snelkoppelingen heeft kun je er zelf een snelkoppeling naar keuze voor maken. Download eventueel hier je GHidra snelkoppelingen: https://jarnobaselier.nl/files/zip/GHidra-Icons.zip.

Na het starten van GHidra moet je akkoord gaan met de User Agreement. Daarna zal GHidra opstarten en kunnen we aan de slag:

Reverse Engineering Termen
Alvorens we echt in GHidra gaan kijken is het handig om op de hoogte te zijn van een aantal termen die met reverse engineering te maken hebben. Op deze manier begrijp je, wanneer deze termen gebruikt worden beter wat er op dat moment gebeurt.
Hier komen ze:
- Reverse Engineering – Dit betekend dat bestaande software “opengebroken” wordt om te ontdekken wat deze code exact doet en hoe deze functioneerd.
- Compilen / Compiler – Compilen is het omzetten van broncode naar een semantisch equivalent programma in een doeltaal. Om dit omzetten van een hogere programmeertaal naar een lagere programmeertaal meestal assembleertaal of machinecode) mogelijk te maken werken we met een zogenaamde compiler. De voornaamste reden om broncode te compileren is het maken van uitvoerbare code.
- Decompilen / Decompiler – Decompileren is exact het tegenovergestelde van compileren en wordt gedaan met een decompiler.
- Parsen / Parser – Het “parsen” van code doe je met een computerprogramma, of component van een programma welke de grammaticale structuur van een invoer volgens een vastgelegde grammatica ontleedt (parset). Het parsen van code is dus het controleren of de code invoer de correcte structuur heeft en het omzetten van de code in een gestructureerde representatie die voor de computer begrijpelijk is. De gestructureerde representatie van een tekst die de parser oplevert wordt een concrete syntaxisboom genoemd (of: CST, van concrete syntaxtree).
- Fork – Een fork is het moment dat de code 2 richtingen op kan gaan. Dit is (in high-level programmeercode) vergelijkbaar met een IF statement.
- Hex / Hexadecimal – Een weergave van de code in hexadecimale waardes.
- Shellcode / Egg – Shellcode ofwel een Egg is een relatief korte serie instructies (klein programma) die een aanvaller probeert uit te voeren op een computer meestal met als doel om toegang te krijgen tot de shell van die computer (cmd, sh, bash). Shellcode is onderdeel van een exploit, dus het geautomatiseerd kraken van een systeem op basis van bijvoorbeeld een programmeerfout.
- Debugger – Een debugger is een computerprogramma dat gebruikt wordt om andere computerprogramma’s te debuggen, oftewel de oorzaak van een bug te achterhalen.
GHidra Gebruiken
GHidra opent standaard met het “project window” waar alle huidige projecten in vermeld staan. Als je GHidra voor het eerst opstart is het zaak om een nieuw project aan te maken. Dit doe je via “File” – “New Project”.

Vervolgens kies je voor een “Shared” of een “Non-Shared” Project. Bij een gedeeld project is het mogelijk om met meerdere personen aan hetzelfde project te werken. Als dat niet nodig is dan maak je een “Non-Shared Project” aan.

Vervolgens bepaal je de naam van het project en waar de projectbestanden worden opgeslagen:

Als het project is aangemaakt kunnen we deze selecteren en er bestanden aan toevoegen via “File” – “Import File”.

Na de selectie wordt het bestand geïmporteerd en een import result window wordt getoond waarin we o.a. kunnen zien hoeveel bytes, functies, instructies en symbols er geïmporteerd zijn.

Vervolgens kunnen we een tool kiezen om te gebruiken. Er zijn 2 default tools:
- 1. Codebrowser – Voor het bekijken en analyseren van de code
- 2. Version Tracker – Voor het bijhouden van verschillende versies

Om dit malware sample te analyseren openen we het sample in de “Codebrowser”. Na het openen zal GHidra het sample willen analyseren. Het is aan te raden om deze analyse uit te voeren.

De GHidra Codebrowser interface ziet er als volgt uit:

- 1. Het hoofdmenu
- 2. De menubalk
- 3. Programma Tree – Bevat alle verschillende secties uit de binary.
- 4. Symbol Tree – Groepeert alle gevonden onderdelen zoals de functies, imports, exports enm classes.
- 5. Data Type Manager – Manage de verschillende data types.
- 6. Console / Scripting Windows – Bevat diverse soorten output (zoals de output van scripts).
- 7. Main Menu / Listing Window / Disassembly View – Data explorer, scroll door de data en selecteer data.
- 8. Decompiler Window – Laat decompilatie resultaat zien van de geselecteerde functie.
De belangrijkste vensters zijn zonder twijfel het Listing Window en de Decompiler Window. Deze schermen zijn vrij dynamisch aan te passen. Zo maakt GHidra het gemakkelijk om vensters te wisselen met elkaar of om er een extra venster tussen te passen.
Bovenin, vanuit het “Windows” menu item kunnen we ook andere vensters tonen zoals het “Bytes” Window (welke we vervolgens weer kunnen uitbreiden met b.v. een ASCII view:

Nu we het beelscherm naar wens hebben ingesteld is het zaak om een aantal andere handigheidjes te bekijken.
Zo is het toevoegen van comments soms enorm waardevol. GHidra kent verschillende comments zoals:
- Pre Comments – Deze staan VOOR het geselecteerde codeblok
- Post Comments – Deze staan NA het geselecteerde codeblok
- EOL Comments – Deze End Of Line comments staan ACHTER te geselecteerde regel
- Plate Comment – Deze comment is zichtbaar als een blok aan het begin van de functie
- Repeatable Comment – Deze comment is zichtbaar op het huidige item en op alle items die naar dit item refereren.
Comments kunnen geplaatst worden in de listing en decompile windows door de semicolon (;) te gebruiken of door rechts te klikken op de locatie waar de comment moet komen en te kiezen voor “Comments”.

Zoals je zult zien zal een selectie in het listing window met de binary code (machinetaal) automatisch andere open vensters vullen met de selectie. Zo zal het decompiler venster de gedecompileerde code laten zien van de selectie. Deze code is beter leesbaar (afhankelijk van de gekozen decompiler en je kennis van die programmeertaal).

Je kunt ook zaken aanpassen. Pas je de naam van een variabele aan in de decompiler om het e.e.a. te verduidelijken dan zal GHidra deze variabele in de resterende code aanpassen.

De assembly code ofwel de machine code bevat verschillende functies. Meestal zijn er veel functies beschikbaar omdat de originele scripts omgezet zijn naar een executable en de executable geen afhankelijkheden moet hebben om te draaien. Alle mogelijk afhankelijkheden (beschikbare functies) worden dus meegegeven aan de execuatable. Functies zijn belangrijk omdat de inzicht geven in hoe de code functioneert. Alle aanwezige functies kun je bekijken onder de “Symbol Tree” – “Functions”. Op deze manier kun je gemakkelijk door alle aanwezige functies klikken.

Voor een duidelijk overzicht van alle functies die aangeroepen kunnen worden door de huidige (actieve) functie kun je de “Function Graph” oproepen met de “Display Function Graph” button in de toolbar. Hierdoor krijg je een duidelijk overzicht van de functie dataflow:

Mocht je weten welke tekst de applicatie toont aan de gebruiker en je wilt weten in welke functie of op welke locatie deze tekst voorkomt dan kun je gebruik maken van de uitgebreide zoekfunctie. Je kunt zoeken naar verschillende zaken zoals patronen, adres tabellen, geheugen en strings. Dus als je wilt zoeken naar een specifieke tekst dan is het ideaal om te kunnen zoeken naar “strings”.

Als laatste tip wil ik meegeven dat de F1 toets op elk moment beschikbaar is om meer informatie te laten zien van het onderdeel welke op dat moment actief is. Je raakt makkelijk verdwaald in GHidra dus het is fijn dat hulp altijd dichtbij is. Mocht je jezelf meer willen uitdagen en nog meer willen weten dan kun je de Beginner, Intermediate en Advanced classes volgen en lezen. Deze bevinden zich in de GHidra folder “\docs\GhidraClass”.

Conclusie
Reverse Engineering is voor mij persoonlijke geen bekend werkterrein. Dit artikel baseert zich op de eerste basale stappen van GHidra. Op wat kleine projecten na heb ik geen ervaring in reverse engineering maar ik vind het al jaren ontzettend interessant. GHidra heeft het me mogelijk gemaakt om hier gratis een goede first-look in te krijgen en aangezien we pas net het oppervlakte van de GHidra mogelijkheden hebben aangeraakt ga ik deze tool zeker vaker gebruiken. Uiteraard lezen jullie de interessante ontwikkelingen hier. Wie dit artikel wil aanvullen met interessante GHidra facts is van harte welkom. E-mail me even en ik plaats de goede tips bij dit GHidra artikel.
Vond je deze post leuk of ben je ook getriggerd om te starten met reverse engineering geef dan een leuke reactie, like en deel deze post (of mijn website) op je sociale media of eigen website. Het maken van deze uitgebreide posts kost veel tijd en leuke (re)acties zorgen ervoor dat ik ze met veel plezier blijf schrijven. Dankjewel!!