PingPong12 min read

Bentornati su Exploitnetworking! PingPong era una challenge del CTF SECT 2018, un pwn basato su buffer overflow. L’obiettivo principale era usare l’overflow per avere un leak di un indirizzo di memoria (in modo da bypassare l’aslr) e infine creare una ropchain per spawnare una shell.

Il prima passo, come sempre, è vedere quali protezioni ha il binario utilizzando l’utility checksec:

Copy to Clipboard

Come possiamo osservare ci sono tutte le protezioni attive. Il passo successivo è vedere cosa fa durante l’esecuzione:

Copy to Clipboard

In questa esecuzione possiamo vedere due particolari importanti:

  • Nel nostro piccolo input (AAA) in output otteniamo AaA��_ che ha due significati: il primo che il programma cambia il nostri input prima di stamparlo poiché otteniamo AaA invece di AAA, secondo che abbiamo dei caratteri “sporchi” il che significa che il programma stampa fino a quando non trova un null byte “\x00” come terminatore di stringa cioè stampa tutto quello che trova (indirizzi di memoria compresi).
  • Con un grande input il programma va in segmentation fault.

Esaminiamo ora il core dump creato per vedere cosa succede:

Copy to Clipboard

Come possiamo vedere, il programma crasha all’istruzione:

Copy to Clipboard

perché in rdx non c’è un indirizzo di memoria valido (infatti abbiamo 0x4141414141414141) che è il nostro input. Notiamo che in memoria il nostro input non cambia, ma cambia solo durante la stampa.

Ok, l’idea è questa: inseriamo un indirizzo valido in rdx (con il nostro input grande), e allora il programma copierà i bytes in questo indirizzo. Ma quale indirizzo scrivere? Esaminiamo un esecuzione con gdb:

Copy to Clipboard

prima di tutto settiamo un breakpoint a quell’indirizzo per vedere cos’è caricato normalmente in rdx.

Copy to Clipboard

Come possiamo vedere, in rdx è salvato l’inizio del buffer, (questo è il secondo ping, altrimenti non c’era niente in memoria). Dopo 0x41414141 c’è 0x00007fff, questi sono i bytes sporchi che riceviamo in output! Per ottenere il leak di un indirizzo possiamo usare i valori nello stack, infatti 48 bytes dopo l’inizio del buffer c’è 0x00007ffff7a64b62 che è la puts della libc:

Copy to Clipboard

Ok, in questo modo possiamo calcolarci l’indirizzo della libc base (perché la libc ci è data), e quindi bypassare l’aslr. Adesso dove scriviamo la nostra ropchain?

Copy to Clipboard

l’idea è sovrascrivere l’indirizzo di ritorno (in altre parole, inseriamo in rdx l’indirizzo dello stack che contiene l’indirizzo di ritorno di questa funzione). Per il leak dell’indirizzo dello stack possiamo usare la stessa tecnica usata per la libc (possiamo ad esempio fare il leak dell’rbp e calcolarci la posizione dell’indirizzo di ritorno).

Copy to Clipboard

Dove 8 è l’offset tra l’inizio del buffer e l’indirizzo di ritorno. Ok, abbiamo un indirizzo dello stack, l’indirizzo della libc, ora cerchiamo qualche gadget per creare la nostra ropchain che spawna una shell con la system call execve. Ho usato ROPgadget sulla libc, in questo modo abbiamo ottenuto molti più gadgets.

Copy to Clipboard

Il metodo “decode_memory” è usato per decodificare l’output del programma (ricorda che il programma modifica il nostro input prima di stamparlo).

Ora facciamo partire l’exploit:

Copy to Clipboard

Recent Tweets

For privacy reasons Twitter needs your permission to be loaded.
I Accept
2018-09-18T20:03:14+00:00

About the Author:

Dottore in Informatica. Da sempre appassionato di Linux, reti informatiche, sicurezza e, in modo amatoriale, all’elettronica. Il mio intento è quello di trasmettere le mie conoscenze ad altri appassionati.

Leave A Comment

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.