W świecie Linuksa, gdzie otwartość kodu i kontrola nad systemem są kluczowe, narzędzia do inżynierii wstecznej odgrywają coraz większą rolę. Jednym z najbardziej zaawansowanych i jednocześnie darmowych narzędzi tego typu jest Ghidra — dekompilator i framework do analizy binarnej, udostępniony przez amerykańską agencję NSA.

Do czego służy Ghidra?
Ghidra to narzędzie do reverse engineeringu, czyli analizy działania programów bez dostępu do ich kodu źródłowego. Umożliwia:
- Dekompilację plików binarnych (np. ELF, PE, Mach-O)
- Analizę kodu maszynowego i jego konwersję do pseudokodu
- Śledzenie przepływu programu, funkcji, struktur danych
- Wykrywanie luk bezpieczeństwa i złośliwego kodu
- Edukację i naukę działania systemów niskopoziomowych
Jak używać narzędzia Ghidra?
Ghidra działa na Linuksie, Windowsie i macOS. Po uruchomieniu interfejsu GUI użytkownik tworzy projekt, importuje plik binarny, a następnie uruchamia proces analizy. Narzędzie automatycznie rozpoznaje architekturę (np. x86, ARM, MIPS) i generuje pseudokod z kodu maszynowego. Programista może:
- Przeglądać funkcje i ich wywołania
- Edytować nazwy zmiennych i funkcji dla lepszej czytelności
- Korzystać z wbudowanego debuggera
- Tworzyć własne skrypty w Pythonie lub Javie
Instalacja i uruchomienie narzędzia Ghidra w Ubuntu Linux
$ sudo snap install ghidra
$ ghidra

Historia dekompilacji i narodziny Ghidry
Dekompilacja istnieje od lat 70., kiedy inżynierowie zaczęli analizować kod maszynowy w celu debugowania i zrozumienia działania programów. Przez dekady narzędzia takie jak IDA Pro dominowały rynek, ale były kosztowne i zamknięte.
W 2019 roku NSA udostępniła Ghidrę jako projekt open-source, co wywołało ogromne poruszenie w społeczności bezpieczeństwa. Po raz pierwszy tak zaawansowane narzędzie stało się dostępne dla każdego — bez opłat i ograniczeń licencyjnych.
Popularność dekompilacji w dzisiejszym security
Dekompilacja to dziś standardowa praktyka w działach bezpieczeństwa:
- Analiza malware — zrozumienie mechanizmów infekcji
- Testy penetracyjne — identyfikacja podatności w aplikacjach
- Red teaming — eksploracja systemów przez zespoły ofensywne
- Bug bounty — analiza aplikacji w celu wykrycia luk
Ghidra jest często wybierana przez zespoły DevSecOps, analityków SOC i niezależnych researcherów ze względu na swoją elastyczność i moc.
Praktyczne zastosowania Ghidry
- Analiza aplikacji zamkniętoźródłowych
- Weryfikacja bezpieczeństwa komponentów binarnych
- Odzyskiwanie funkcjonalności w projektach legacy
- Edukacja studentów i programistów
- Tworzenie kompatybilnych sterowników i bibliotek
Moduły i funkcje Ghidry
Ghidra to nie tylko dekompilator — to modularny framework z wieloma rozszerzeniami:
Moduł / Funkcja | Opis |
---|---|
Decompiler | Generuje pseudokod z kodu maszynowego |
Symbol Tree | Przegląd funkcji, zmiennych, struktur |
Listing View | Widok kodu maszynowego i pseudokodu obok siebie |
Function Graph | Graficzne przedstawienie przepływu funkcji |
Data Type Manager | Zarządzanie strukturami danych i typami |
Script Manager | Obsługa skryptów w Pythonie i Javie |
Debugger | Zintegrowany debugger do analizy dynamicznej |
Version Tracking | Porównywanie różnych wersji binariów |
Plugin System | Możliwość dodawania własnych rozszerzeń |
Przykładowy zdekompilowany kod binarny przez Ghidra
#include "out.h"
void _DT_INIT(void)
{
__gmon_start__();
return;
}
void FUN_00101020(void)
{
(*(code *)(undefined *)0x0)();
return;
}
void FUN_00101070(void)
{
__cxa_finalize();
return;
}
// WARNING: Unknown calling convention -- yet parameter storage is locked
int puts(char *__s)
{
int iVar1;
iVar1 = puts(__s);
return iVar1;
}
void __stack_chk_fail(void)
{
// WARNING: Subroutine does not return
__stack_chk_fail();
}
void __printf_chk(void)
{
__printf_chk();
return;
}
void __isoc99_scanf(void)
{
__isoc99_scanf();
return;
}
undefined8 FUN_001010c0(void)
{
long in_FS_OFFSET;
int local_118;
short local_114;
long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28);
__printf_chk(1,"Enter the password: ");
__isoc99_scanf("%255s",&local_118);
if ((local_118 == 0x30783468) && (local_114 == 0x72)) {
puts("Good boy!");
}
else {
puts("Bad boy!");
}
if (local_10 == *(long *)(in_FS_OFFSET + 0x28)) {
return 0;
}
// WARNING: Subroutine does not return
__stack_chk_fail();
}
void processEntry entry(undefined8 param_1,undefined8 param_2)
{
undefined1 auStack_8 [8];
__libc_start_main(FUN_001010c0,param_2,&stack0x00000008,FUN_00101260,FUN_001012d0,param_1,
auStack_8);
do {
// WARNING: Do nothing block with infinite loop
} while( true );
}
// WARNING: Removing unreachable block (ram,0x001011b3)
// WARNING: Removing unreachable block (ram,0x001011bf)
void FUN_001011a0(void)
{
return;
}
// WARNING: Removing unreachable block (ram,0x001011f4)
// WARNING: Removing unreachable block (ram,0x00101200)
void FUN_001011d0(void)
{
return;
}
void _FINI_0(void)
{
if (DAT_00104010 != '\0') {
return;
}
FUN_00101070(PTR_LOOP_00104008);
FUN_001011a0();
DAT_00104010 = 1;
return;
}
void _INIT_0(void)
{
FUN_001011d0();
return;
}
void FUN_00101260(undefined4 param_1,undefined8 param_2,undefined8 param_3)
{
long lVar1;
_DT_INIT();
lVar1 = 0;
do {
(*(code *)(&__DT_INIT_ARRAY)[lVar1])(param_1,param_2,param_3);
lVar1 = lVar1 + 1;
} while (lVar1 != 1);
return;
}
void FUN_001012d0(void)
{
return;
}
void _DT_FINI(void)
{
return;
}
Korzyści dla programisty
- Zrozumienie działania kodu niskopoziomowego
- Umiejętność analizy cudzych aplikacji
- Rozwój kompetencji w zakresie bezpieczeństwa
- Zdolność do wykrywania błędów i luk
- Nauka przez praktykę i eksplorację
Ghidra to narzędzie, które zmieniło zasady gry w świecie inżynierii wstecznej. Dla użytkowników Linuksa, którzy cenią sobie kontrolę, wiedzę i bezpieczeństwo, Ghidra jest nie tylko przydatna — jest wręcz niezbędna.