hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow
2024-04-02 19:46:46 +00:00
..
ret2lib Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:46 +00:00
ebp2ret-ebp-chaining.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2024-03-29 21:03:31 +00:00
pointer-redirecting.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:46 +00:00
README.md Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/arbitra 2024-03-30 23:42:36 +00:00
ret2csu.md Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/common- 2024-03-31 17:33:39 +00:00
ret2dlresolve.md Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/common- 2024-03-31 17:33:39 +00:00
ret2esp-ret2reg.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-03-31 10:07:46 +00:00
ret2ret.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:46 +00:00
ret2shellcode.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-03-29 12:46:15 +00:00
ret2win.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:46 +00:00
rop-return-oriented-programing.md Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/common- 2024-03-31 17:33:39 +00:00
rop-syscall-execv.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:46 +00:00
srop-sigreturn-oriented-programming.md Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/common- 2024-03-31 17:33:39 +00:00
stack-pivoting-ebp2ret-ebp-chaining.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:46 +00:00
stack-shellcode.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin 2024-04-02 19:46:46 +00:00

Stack Overflow

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Cos'è uno Stack Overflow

Uno stack overflow è una vulnerabilità che si verifica quando un programma scrive più dati nello stack di quanto sia allocato per contenerli. Questi dati in eccesso sovrascriveranno lo spazio di memoria adiacente, portando alla corruzione di dati validi, interruzioni del flusso di controllo e potenzialmente all'esecuzione di codice dannoso. Questo problema spesso si verifica a causa dell'uso di funzioni non sicure che non eseguono il controllo dei limiti sull'input.

Il problema principale di questa sovrascrittura è che i puntatori EIP ed EBP per tornare alla funzione precedente sono memorizzati nello stack. Pertanto, un attaccante sarà in grado di sovrascriverli e controllare il flusso di esecuzione del programma.

La vulnerabilità di solito si verifica perché una funzione copia all'interno dello stack più byte di quanti ne siano stati allocati, quindi è in grado di sovrascrivere altre parti dello stack.
Alcune funzioni comuni vulnerabili a questo sono: strcpy, strcat, sprintf, gets, fgets...

Ad esempio, le seguenti funzioni potrebbero essere vulnerabili:

void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}

Trovare gli stack overflows

Il modo più comune per trovare gli stack overflows è inserire un input molto grande di A (ad esempio python3 -c 'print("A"*1000)') e aspettarsi un Segmentation Fault che indica che l'indirizzo 0x41414141 è stato tentato di essere accesso.

Inoltre, una volta che si è scoperto che c'è una vulnerabilità di Stack Overflow, sarà necessario trovare l'offset fino a quando è possibile sovrascrivere il puntatore EIP, per questo di solito si utilizza una sequenza De Bruijn. Che per un dato alfabeto di dimensione k e sottosequenze di lunghezza n è una sequenza ciclica in cui ogni possibile sottosequenza di lunghezza n appare esattamente una volta come sottosequenza contigua.

In questo modo, anziché dover capire manualmente quale offset sta sovrascrivendo l'EIP, è possibile utilizzare una di queste sequenze come padding e quindi trovare l'offset dei byte che hanno finito per sovrascriverlo.

È possibile utilizzare pwntools per questo:

from pwn import *

# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values)
pattern = cyclic(1000)

# This is an example value that you'd have found in the EIP/IP register upon crash
eip_value = p32(0x6161616c)
offset = cyclic_find(eip_value)  # Finds the offset of the sequence in the De Bruijn pattern
print(f"The offset is: {offset}")

o GEF:

#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp

Sfruttare gli stack overflow

Durante un overflow (supponendo che la dimensione dell'overflow sia abbastanza grande) sarai in grado di sovrascrivere i valori di altre variabili all'interno dello stack fino a raggiungere EBP ed EIP (o anche di più).
Il modo più comune per sfruttare questo tipo di vulnerabilità è modificare il puntatore EIP in modo che quando la funzione termina il flusso di controllo venga reindirizzato ovunque l'utente abbia specificato in questo puntatore.

Tuttavia, in altri scenari forse sovrascrivere alcuni valori delle variabili nello stack potrebbe essere sufficiente per lo sfruttamento (come nelle sfide CTF facili).

Ret2win

In questo tipo di sfide CTF, c'è una funzione all'interno del binario che non viene mai chiamata e che devi chiamare per vincere. Per queste sfide devi solo trovare l offset per sovrascrivere l'EIP e trovare l'indirizzo della funzione da chiamare (di solito ASLR sarebbe disabilitato) in modo che quando la funzione vulnerabile ritorna, la funzione nascosta verrà chiamata:

{% content-ref url="ret2win.md" %} ret2win.md {% endcontent-ref %}

Shellcode nello stack

In questo scenario l'attaccante potrebbe inserire uno shellcode nello stack e sfruttare l'EIP controllato per andare allo shellcode ed eseguire il codice dell'attaccante:

{% content-ref url="stack-shellcode.md" %} stack-shellcode.md {% endcontent-ref %}

ROP

Questa tecnica è il framework fondamentale per aggirare la principale protezione della tecnica precedente: stack non eseguibile. E permette di eseguire diverse altre tecniche (ret2lib, ret2syscall...) che finiranno per eseguire comandi arbitrari sfruttando istruzioni esistenti nel binario:

{% content-ref url="rop-return-oriented-programing.md" %} rop-return-oriented-programing.md {% endcontent-ref %}

Tipi di protezioni

Ci sono diverse protezioni che cercano di prevenire lo sfruttamento delle vulnerabilità, controllale in:

{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: