Cyber Security Academy · Lezione

Basi del reversing e del pwn

Introduzione al reverse engineering e allo sfruttamento dei binari.

Lezione 3 di 413 passaggi

Basi del reversing e del pwn è una lezione Cyber Security Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cyber Security Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cyber Security Academy include 4 lezioni in totale.

Reverse engineering e pwn in breve

Due categorie CTF strettamente correlate riguardano i programmi compilati:

  • Reverse engineering (rev) — analizzare un binario per capire cosa fa, spesso per recuperare un controllo della password o una logica nascosta che stampa la flag.
  • Pwn (binary exploitation) — individuare una vulnerabilità di sicurezza della memoria in un binario in esecuzione e sfruttarla per dirottare l'esecuzione, spesso per avviare una shell su un servizio remoto che contiene la flag.

Il rev consiste nel capire; il pwn nel compromettere. Entrambi richiedono familiarità con i concetti di basso livello.

Primo sguardo a un binario

Non apra mai un binario alla cieca in un disassembler. Lo sottoponga prima a un rapido triage con strumenti da riga di comando, per determinarne il tipo, l'architettura e individuare eventuali stringhe evidenti.

# 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

Analisi statica e dinamica

È possibile analizzare i binari in due modi complementari:

  • Analisi statica — leggere il codice senza eseguirlo, usando un disassembler o un decompiler come Ghidra oppure una vista disassemblata. Si vede l'intero flusso di controllo, ma occorre dedurre i valori a runtime.
  • Analisi dinamica — eseguire il programma sotto un debugger come GDB e osservare i valori reali nei registri e nella memoria. Si vede esattamente cosa accade, ma solo lungo il percorso eseguito.

Gli esperti alternano i due approcci: leggono staticamente per formulare una teoria e la verificano dinamicamente eseguendo il programma passo passo.

Leggere il disassembly

Per fare reversing, si legge l'assembly. Non è necessario saperlo scrivere fluentemente, ma occorre riconoscere alcuni pattern:

  • cmp / test seguiti da un salto (je, jne) costituiscono un confronto e un branch — spesso il controllo della password.
  • call invoca una funzione; subito prima, gli argomenti sono stati inseriti nei registri o nello stack.
  • mov sposta dati tra registri, memoria e costanti.

Quando trova un cmp a confronto con il Suo input, seguito da un branch verso un messaggio di successo, ha trovato il controllo. Ora recuperi o aggiri il valore previsto.

I decompiler velocizzano il lavoro

I decompiler moderni riconvertono l'assembly in una forma approssimativa del C, molto più rapida da leggere rispetto alle istruzioni grezze. Un controllo della password decompilato potrebbe avere questo aspetto:

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

Come inizia la corruzione della memoria

Le challenge di pwn sfruttano programmi che leggono l'input in un buffer di dimensione fissa senza verificarne la lunghezza. Lo stack contiene le variabili locali e l'indirizzo di ritorno salvato, che indica alla CPU dove proseguire quando una funzione termina.

Se l'input supera la capacità di un buffer locale, può sovrascrivere quell'indirizzo di ritorno salvato. Chi controlla l'indirizzo di ritorno controlla dove proseguirà l'esecuzione.

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

Il classico stack buffer overflow

Il pwn più semplice consiste nel sovrascrivere l'indirizzo di ritorno per saltare a una funzione che il programma non intendeva chiamare: una funzione win() nascosta che stampa la flag.

I passaggi:

  • Individuare l'offset esatto dall'inizio del buffer all'indirizzo di ritorno (uno strumento per pattern ciclici consente di farlo rapidamente).
  • Individuare l'indirizzo della funzione di destinazione.
  • Inviare il padding fino all'offset, quindi sovrascrivere l'indirizzo di ritorno con quello della destinazione.
# 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()

Le mitigazioni moderne

I binari reali abilitano difese che bloccano gli overflow ingenui. Deve riconoscerle con checksec:

  • Stack canary — un valore segreto inserito prima dell'indirizzo di ritorno; se cambia, il programma si interrompe. È necessario farne prima il leak.
  • NX (No-eXecute) — lo stack non è eseguibile, quindi non è possibile eseguire shellcode inserito al suo interno.
  • ASLR / PIE — gli indirizzi vengono randomizzati a ogni esecuzione, quindi serve un leak di un indirizzo prima di poterlo usare come bersaglio.
  • RELRO — protegge la global offset table dalle sovrascritture.

Ogni mitigazione spinge verso tecniche più avanzate.

Return-Oriented Programming (ROP)

Quando NX impedisce di eseguire codice proprio, la Return-Oriented Programming riutilizza il codice già presente nel binario.

Si concatenano brevi sequenze di istruzioni chiamate gadget, ciascuna terminante con ret, per eseguire azioni un pezzo alla volta — per esempio caricare un registro e chiamare una funzione di libreria per avviare una shell. La catena viene costruita sullo stack, in modo che ogni ret salti al gadget successivo.

La ROP è il ponte tra i buffer overflow dei principianti e lo sfruttamento reale, in cui il codice dell'attaccante raramente è eseguibile direttamente.

Vulnerabilità di format string

Un'altra primitiva classica del pwn è la vulnerabilità di format string, in cui l'input dell'utente viene passato direttamente come argomento di formato a una funzione di stampa.

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

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

Perché è importante imparare queste tecniche

Si impara a sfruttare con precisione i bug di memoria proprio per poterli prevenire. Le conseguenze pratiche per la difesa sono concrete:

  • Non usi mai funzioni di input senza limiti come gets o strcpy; usi equivalenti che verificano la lunghezza.
  • Mantenga attive le mitigazioni: canary, NX, ASLR/PIE completo e RELRO completo per impostazione predefinita.
  • Preferisca linguaggi memory-safe quando il modello di minaccia lo consente.
  • Consideri una scoperta grave in fase di code review qualsiasi valore controllato dall'utente che raggiunga una format string o una copia in un buffer.

Verifica rapida

Verifichi la Sua comprensione dei fondamenti del reversing e del pwn.

Riepilogo

Ora dispone di una visione d'insieme del reversing e del pwn:

  • Sottoponga ogni binario a triage con file, strings e checksec prima dell'analisi approfondita.
  • Combini l'analisi statica (disassembler/decompiler) e dinamica (debugger) per comprendere la logica.
  • Il pwn inizia con lo stack buffer overflow che sovrascrive un indirizzo di ritorno; le mitigazioni (canary, NX, ASLR/PIE, RELRO) alzano l'asticella.
  • La ROP aggira NX riutilizzando gadget esistenti; i bug di format string nascono da argomenti di formato non attendibili.
  • Ogni tecnica offre anche una lezione difensiva per scrivere e revisionare codice più sicuro.

Ora costruirà un toolkit e imparerà a redigere i writeup delle Sue soluzioni.

Gratis per iniziare

Impara Cyber Security Academy con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
76
Lezioni
303

Domande Frequenti

La lezione «Basi del reversing e del pwn» è gratuita?

Sì — il testo completo di «Basi del reversing e del pwn» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cyber Security Academy, passa a CoddyKit PRO. Il corso Cyber Security Academy include 4 lezioni in totale.

Cosa imparerò in «Basi del reversing e del pwn»?

Introduzione al reverse engineering e allo sfruttamento dei binari. Eserciti Cyber Security Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Cyber Security Academy?

Non è richiesta alcuna esperienza precedente. Cyber Security Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Basi del reversing e del pwn»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Cyber Security Academy?

Sì. Ogni lezione Cyber Security Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Categorie e mentalità dei CTF
  2. Sfide web e di crittografia
  3. Basi del reversing e del pwn
  4. Strumenti e write-up
← Torna a Cyber Security Academy