0Pricing
Cyber Security Academy · Lekcja

Podstawy reverse engineeringu i pwn

Wprowadzenie do inżynierii odwrotnej i wykorzystywania podatności w plikach binarnych

Podstawy reverse engineeringu i pwn to bezpłatna lekcja Cyber Security Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cyber Security Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.

Reversing i pwn w skrócie

Dwie blisko powiązane kategorie CTF dotyczą skompilowanych programów:

  • Reverse engineering (rev) — analizujesz plik binarny, aby zrozumieć jego działanie, często w celu odtworzenia sprawdzania hasła lub ukrytej logiki wyświetlającej flagę.
  • Pwn (eksploatacja plików binarnych) — znajdujesz błąd związany z bezpieczeństwem pamięci w działającym pliku binarnym i wykorzystujesz go do przejęcia sterowania, często w celu uruchomienia powłoki w zdalnej usłudze przechowującej flagę.

Reversing polega na zrozumieniu, a pwn na łamaniu zabezpieczeń. Obie dziedziny wymagają swobody w posługiwaniu się pojęciami niskopoziomowymi.

Pierwsze spojrzenie na plik binarny

Nigdy nie otwieraj pliku binarnego w disassemblerze bez wcześniejszego rozpoznania. Najpierw przeprowadź szybki triage za pomocą narzędzi wiersza poleceń, aby ustalić jego typ, architekturę i ewentualne oczywiste ciągi znaków.

# Identify file type and architecture
file ./challenge

# Pull human-readable strings (flags are sometimes left in plaintext)
strings ./challenge

# Check which security mitigations are enabled
checksec --file=./challenge

Analiza statyczna a dynamiczna

Analizuje się pliki binarne na dwa uzupełniające się sposoby:

  • Analiza statyczna — odczytujesz kod bez uruchamiania programu, korzystając z disassemblera lub dekompilatora, takiego jak Ghidra, albo z widoku disassemblera. Widzisz pełny przepływ sterowania, ale wartości w czasie wykonywania musisz wywnioskować.
  • Analiza dynamiczna — uruchamiasz program pod debuggerem, takim jak GDB, i obserwujesz rzeczywiste wartości w rejestrach oraz pamięci. Widzisz dokładnie, co się dzieje, ale tylko na ścieżce, którą wykonujesz.

Doświadczeni gracze przełączają się między tymi metodami: najpierw czytają kod statycznie, aby sformułować teorię, a następnie potwierdzają ją dynamicznie, wykonując program krok po kroku.

Czytanie kodu asemblera

Aby przeprowadzać reverse engineering, należy czytać asembler. Nie trzeba posługiwać się nim biegle, ale trzeba rozpoznawać pewne wzorce:

  • cmp / test, po których następuje skok (je, jne) oznaczają porównanie i rozgałęzienie — często jest to sprawdzanie hasła.
  • call wywołuje funkcję; argumenty umieszczono w rejestrach lub na stosie chwilę wcześniej.
  • mov przenosi dane między rejestrami, pamięcią i stałymi.

Gdy znajdziesz cmp porównujące dane wejściowe ze stałą, po którym następuje skok do komunikatu o sukcesie, oznacza to znalezienie mechanizmu sprawdzającego. Teraz należy odzyskać oczekiwaną wartość albo go ominąć.

Dekompilatory przyspieszają pracę

Współczesne dekompilatory przekształcają asembler z powrotem w przybliżony kod C, który czyta się znacznie szybciej niż surowe instrukcje. Zdekompilowane sprawdzanie hasła może wyglądać tak:

// Decompiler output (approximate)
if (strcmp(user_input, "s3cr3t_p4ss") == 0) {
    puts("Correct! Here is your flag:");
    print_flag();
} else {
    puts("Wrong.");
}

Jak zaczyna się uszkodzenie pamięci

Zadania pwn wykorzystują programy, które odczytują dane wejściowe do bufora o stałym rozmiarze bez sprawdzania ich długości. Stos przechowuje zmienne lokalne oraz zapisany adres powrotu, który informuje procesor, dokąd przejść po zakończeniu funkcji.

Jeśli dane wejściowe przepełnią lokalny bufor, mogą nadpisać zapisany adres powrotu. Kto kontroluje adres powrotu, ten kontroluje miejsce, do którego program przejdzie w następnej kolejności.

// Vulnerable: no bound on how much is read into buf
void vuln() {
    char buf[64];
    gets(buf);   // reads until newline, ignores buf size
}

Klasyczne przepełnienie bufora stosu

Najprostszy atak pwn polega na nadpisaniu adresu powrotu, aby skoczyć do funkcji, której program nie zamierzał wywoływać — ukrytej funkcji win(), która wyświetla flagę.

Kroki:

  • Znajdź dokładny offset od początku bufora do adresu powrotu (narzędzie do generowania wzorca cyklicznego szybko go wyznaczy).
  • Znajdź adres funkcji docelowej.
  • Wyślij wypełnienie do momentu osiągnięcia offsetu, a następnie nadpisz adres powrotu adresem celu.
# Build the input with a Python exploit library
from pwn import *

p = process('./challenge')
offset = 72                 # bytes to reach the return address
win_addr = 0x401176        # address of the win() function
p.sendline(b'A' * offset + p64(win_addr))
p.interactive()

Współczesne mechanizmy ochronne

Rzeczywiste pliki binarne mają włączone zabezpieczenia, które blokują naiwne przepełnienia bufora. Należy rozpoznać je za pomocą checksec:

  • Stack canaries — tajna wartość umieszczona przed adresem powrotu; jeśli się zmieni, program zostanie przerwany. Najpierw trzeba ją wyciec.
  • NX (No-eXecute) — stos nie jest wykonywalny, więc nie można uruchomić umieszczonego na nim shellcode'u.
  • ASLR / PIE — adresy są losowane przy każdym uruchomieniu, dlatego przed wyznaczeniem celu potrzebny jest wyciek adresu.
  • RELRO — chroni globalną tabelę offsetów przed nadpisaniem.

Każdy mechanizm ochronny wymusza stosowanie bardziej zaawansowanych technik.

Return-Oriented Programming (ROP)

Gdy NX uniemożliwia uruchomienie własnego kodu, Return-Oriented Programming pozwala ponownie wykorzystać kod już obecny w pliku binarnym.

Łączy się krótkie sekwencje instrukcji nazywane gadżetami, z których każda kończy się instrukcją ret, aby wykonywać działania krok po kroku — na przykład załadować rejestr i wywołać funkcję biblioteczną uruchamiającą powłokę. Łańcuch buduje się na stosie, aby każde ret przeskakiwało do kolejnego gadżetu.

ROP stanowi przejście od przepełnień bufora na poziomie początkującym do rzeczywistej eksploatacji, w której kod atakującego rzadko może być wykonywany bezpośrednio.

Błędy format string

Innym klasycznym prymitywem pwn jest podatność format string, występująca wtedy, gdy dane wejściowe użytkownika są bezpośrednio przekazywane jako argument formatu do funkcji wyświetlającej.

// Vulnerable: user controls the format string
printf(user_input);          // dangerous

// Safe: user input is data, not format
printf("%s", user_input);    // correct

Dlaczego obrońcy uczą się tych technik

Należy uczyć się precyzyjnego wykorzystywania błędów pamięci właśnie po to, aby móc im zapobiegać. Najważniejsze wnioski obronne są konkretne:

  • Nigdy nie używaj funkcji odczytujących dane bez ograniczenia długości, takich jak gets lub strcpy; korzystaj z odpowiedników sprawdzających długość.
  • Pozostawiaj włączone mechanizmy ochronne: canary, NX, pełne ASLR/PIE oraz pełne RELRO.
  • Jeśli model zagrożeń na to pozwala, wybieraj języki bezpieczne pamięciowo.
  • Każdą wartość kontrolowaną przez użytkownika, która trafia do formatu ciągu znaków lub operacji kopiowania bufora, traktuj podczas przeglądu kodu jako poważne ustalenie.

Szybki sprawdzian

Sprawdź swoją wiedzę na temat podstaw reverse engineeringu i pwn.

Podsumowanie

Masz już ogólny obraz reverse engineeringu i pwn:

  • Przeprowadzaj triage każdego pliku binarnego za pomocą file, strings i checksec przed rozpoczęciem szczegółowej analizy.
  • Łącz analizę statyczną (disassembler/dekompilator) i dynamiczną (debugger), aby zrozumieć logikę programu.
  • Pwn zaczyna się od przepełnienia bufora stosu i nadpisania adresu powrotu; mechanizmy ochronne (canary, NX, ASLR/PIE, RELRO) podnoszą poprzeczkę.
  • ROP omija NX przez ponowne wykorzystanie istniejących gadżetów; błędy format string wynikają z niezaufanych argumentów formatu.
  • Każda technika jest jednocześnie lekcją obrony, przydatną podczas pisania i przeglądania bezpieczniejszego kodu.

Następnie zbudujesz zestaw narzędzi i nauczysz się spisywać rozwiązania.

Często zadawane pytania

Czy lekcja „Podstawy reverse engineeringu i pwn” jest bezpłatna?

Tak — pełny tekst „Podstawy reverse engineeringu i pwn” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cyber Security Academy, przejdź na CoddyKit PRO. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Podstawy reverse engineeringu i pwn”?

Wprowadzenie do inżynierii odwrotnej i wykorzystywania podatności w plikach binarnych Ćwiczysz Cyber Security Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cyber Security Academy?

Nie wymagamy żadnego doświadczenia. Cyber Security Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Podstawy reverse engineeringu i pwn”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cyber Security Academy?

Tak. Każda lekcja Cyber Security Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kategorie CTF i sposób myślenia
  2. Wyzwania webowe i kryptograficzne
  3. Podstawy reverse engineeringu i pwn
  4. Narzędzia i write-upy
← Powrót do Cyber Security Academy