.. | ||
ret2lib | ||
ebp2ret-ebp-chaining.md | ||
pointer-redirecting.md | ||
README.md | ||
ret2csu.md | ||
ret2dlresolve.md | ||
ret2esp-ret2reg.md | ||
ret2ret.md | ||
ret2shellcode.md | ||
ret2win.md | ||
rop-return-oriented-programing.md | ||
rop-syscall-execv.md | ||
srop-sigreturn-oriented-programming.md | ||
stack-pivoting-ebp2ret-ebp-chaining.md | ||
stack-shellcode.md |
Stack Overflow
Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!
Altri modi per supportare HackTricks:
- Se desideri vedere la tua azienda pubblicizzata su HackTricks o scaricare HackTricks in PDF Controlla i PIANI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri La Famiglia PEASS, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud repos di github.
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:
- Se vuoi vedere la tua azienda pubblicizzata in HackTricks o scaricare HackTricks in PDF Controlla i PIANI DI ABBONAMENTO!
- Ottieni il merchandising ufficiale PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e HackTricks Cloud github repos.