Ghidra – Potężny dekompilator w rękach programisty i analityka bezpieczeństwa w Linux

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ł / FunkcjaOpis
DecompilerGeneruje pseudokod z kodu maszynowego
Symbol TreePrzegląd funkcji, zmiennych, struktur
Listing ViewWidok kodu maszynowego i pseudokodu obok siebie
Function GraphGraficzne przedstawienie przepływu funkcji
Data Type ManagerZarządzanie strukturami danych i typami
Script ManagerObsługa skryptów w Pythonie i Javie
DebuggerZintegrowany debugger do analizy dynamicznej
Version TrackingPorównywanie różnych wersji binariów
Plugin SystemMoż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.

TUX - maskotka systemu Linux

About the author

Autor "BIELI" to zapalony entuzjasta otwartego oprogramowania, który dzieli się swoją pasją na blogu poznajlinuxa.pl. Jego wpisy są skarbnicą wiedzy na temat Linuxa, programowania oraz najnowszych trendów w świecie technologii. Autor "BIELI" wierzy w siłę społeczności Open Source i zawsze stara się inspirować swoich czytelników do eksplorowania i eksperymentowania z kodem.