Ret2esp / Ret2reg
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Poiché l'ESP (Stack Pointer) punta sempre alla cima dello stack, questa tecnica prevede di sostituire l'EIP (Instruction Pointer) con l'indirizzo di un'istruzione jmp esp
o call esp
. Facendo ciò, il shellcode viene posizionato subito dopo l'EIP sovrascritto. Quando viene eseguita l'istruzione ret
, l'ESP punta all'indirizzo successivo, precisamente dove è memorizzato il shellcode.
Se Address Space Layout Randomization (ASLR) non è abilitato in Windows o Linux, è possibile utilizzare le istruzioni jmp esp
o call esp
trovate nelle librerie condivise. Tuttavia, con ASLR attivo, potrebbe essere necessario cercare all'interno del programma vulnerabile stesso per queste istruzioni (e potrebbe essere necessario sconfiggere PIE).
Inoltre, essere in grado di posizionare il shellcode dopo la corruzione dell'EIP, piuttosto che nel mezzo dello stack, garantisce che eventuali istruzioni push
o pop
eseguite durante l'operazione della funzione non interferiscano con il shellcode. Questa interferenza potrebbe verificarsi se il shellcode fosse posizionato nel mezzo dello stack della funzione.
Se ti manca spazio per scrivere dopo aver sovrascritto il RIP (forse solo pochi byte), scrivi un shellcode iniziale jmp
come:
E scrivi il shellcode all'inizio dello stack.
Puoi trovare un esempio di questa tecnica in https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp con un exploit finale come:
Puoi vedere un altro esempio di questa tecnica in https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. C'è un buffer overflow senza NX abilitato, viene utilizzato un gadget per ridurre l'indirizzo di $esp
e poi un jmp esp;
per saltare al shellcode:
Allo stesso modo, se sappiamo che una funzione restituisce l'indirizzo dove è memorizzato il shellcode, possiamo sfruttare le istruzioni call eax
o jmp eax
(note come tecnica ret2eax), offrendo un altro metodo per eseguire il nostro shellcode. Proprio come eax, qualsiasi altro registro contenente un indirizzo interessante potrebbe essere utilizzato (ret2reg).
Puoi trovare alcuni esempi qui:
strcpy
memorizzerà in eax
l'indirizzo del buffer dove è stato memorizzato il shellcode e eax
non viene sovrascritto, quindi è possibile utilizzare un ret2eax
.
In ARM64 non ci sono istruzioni che consentono di saltare al registro SP. Potrebbe essere possibile trovare un gadget che sposta sp in un registro e poi salta a quel registro, ma nella libc della mia kali non sono riuscito a trovare alcun gadget di questo tipo:
L'unico che ho scoperto cambierebbe il valore del registro dove sp è stato copiato prima di saltare a esso (quindi diventerebbe inutile):
Se un registro ha un indirizzo interessante, è possibile saltarci semplicemente trovando l'istruzione adeguata. Potresti usare qualcosa come:
In ARM64, è x0
che memorizza il valore di ritorno di una funzione, quindi potrebbe essere che x0 memorizzi l'indirizzo di un buffer controllato dall'utente con uno shellcode da eseguire.
Esempio di codice:
Controllando la disassemblaggio della funzione, è possibile vedere che l'indirizzo del buffer (vulnerabile a bof e controllato dall'utente) è memorizzato in x0
prima di tornare dal buffer overflow:
È anche possibile trovare il gadget br x0
nella funzione do_stuff
:
Useremo quel gadget per saltarci perché il binario è compilato SENZA PIE. Usando un pattern è possibile vedere che l'offset del buffer overflow è 80, quindi l'exploit sarebbe:
Se invece di fgets
fosse stato usato qualcosa come read
, sarebbe stato possibile bypassare PIE anche sovrascrivendo solo gli ultimi 2 byte dell'indirizzo di ritorno per tornare all'istruzione br x0;
senza dover conoscere l'indirizzo completo.
Con fgets
non funziona perché aggiunge un byte nullo (0x00) alla fine.
NX: Se lo stack non è eseguibile, questo non aiuterà poiché dobbiamo posizionare il shellcode nello stack e saltare per eseguirlo.
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)