Ret2csu
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)
ret2csu è una tecnica di hacking utilizzata quando si cerca di prendere il controllo di un programma ma non si riesce a trovare i gadgets che si usano di solito per manipolare il comportamento del programma.
Quando un programma utilizza determinate librerie (come libc), ha alcune funzioni integrate per gestire come i diversi pezzi del programma comunicano tra loro. Tra queste funzioni ci sono alcune gemme nascoste che possono fungere da gadget mancanti, in particolare una chiamata __libc_csu_init
.
In __libc_csu_init
, ci sono due sequenze di istruzioni (gadgets) da evidenziare:
La prima sequenza ci consente di impostare valori in diversi registri (rbx, rbp, r12, r13, r14, r15). Questi sono come slot dove possiamo memorizzare numeri o indirizzi che vogliamo utilizzare in seguito.
Questo gadget ci consente di controllare questi registri estraendo valori dallo stack in essi.
La seconda sequenza utilizza i valori che abbiamo impostato per fare un paio di cose:
Spostare valori specifici in altri registri, rendendoli pronti per essere utilizzati come parametri nelle funzioni.
Eseguire una chiamata a una posizione determinata sommando i valori in r15 e rbx, quindi moltiplicando rbx per 8.
Forse non conosci alcun indirizzo su cui scrivere e hai bisogno di un'istruzione ret
. Nota che il secondo gadget terminerà anche con un ret
, ma dovrai soddisfare alcune condizioni per raggiungerlo:
Le condizioni saranno:
[r12 + rbx*8]
deve puntare a un indirizzo che memorizza una funzione chiamabile (se non hai idea e non hai pie, puoi semplicemente usare la funzione _init
):
Se _init si trova a 0x400560
, usa GEF per cercare un puntatore in memoria ad esso e fai in modo che [r12 + rbx*8]
sia l'indirizzo con il puntatore a _init:
rbp
e rbx
devono avere lo stesso valore per evitare il salto
Ci sono alcuni pop omessi che devi tenere in considerazione
Un altro modo per controllare rdi
e rsi
dal gadget ret2csu è accedendo a specifici offset:
Controlla questa pagina per ulteriori informazioni:
BROP - Blind Return Oriented ProgrammingImmagina di voler effettuare una syscall o chiamare una funzione come write()
ma hai bisogno di valori specifici nei registri rdx
e rsi
come parametri. Normalmente, cercheresti gadget che impostano direttamente questi registri, ma non riesci a trovarne.
Ecco dove entra in gioco ret2csu:
Imposta i Registri: Usa il primo gadget magico per estrarre valori dallo stack e metterli in rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) e r15.
Usa il Secondo Gadget: Con quei registri impostati, usi il secondo gadget. Questo ti consente di spostare i valori scelti in rdx
e rsi
(da r14 e r13, rispettivamente), preparando i parametri per una chiamata di funzione. Inoltre, controllando r15
e rbx
, puoi far chiamare al programma una funzione situata all'indirizzo che calcoli e metti in [r15 + rbx*8]
.
Hai un esempio che utilizza questa tecnica e la spiega qui, e questo è l'exploit finale che ha utilizzato:
Nota che l'exploit precedente non è destinato a fare un RCE
, ma è destinato a chiamare solo una funzione chiamata win
(prendendo l'indirizzo di win
dall'input standard chiamando gets nella catena ROP e memorizzandolo in r15) con un terzo argomento con il valore 0xdeadbeefcafed00d
.
Il seguente exploit è stato estratto da questa pagina dove il ret2csu è utilizzato ma invece di usare la chiamata, sta bypassando i confronti e raggiungendo il ret
dopo la chiamata:
Di solito, questi casi sono vulnerabili anche a ret2plt + ret2lib, ma a volte è necessario controllare più parametri di quanti possano essere facilmente controllati con i gadget che trovi direttamente in libc. Ad esempio, la funzione write()
richiede tre parametri, e trovare gadget per impostare tutti questi direttamente potrebbe non essere possibile.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)