Il developer SpecterDev ha ripulito e reso open source il payload PS4 KHook sviluppato e utilizzato all’interno dei suoi video su Twitch. Il payload minimalista non necessita di un daemon, utile più che altro per eseguire il debug degli exploit.
PS4 KHook è un payload di hooking del kernel minimalista. Ha come target 5.05 ma può essere utilizzato con qualsiasi firmware (o anche sistemi non PS4) con modifiche.
Not sure how useful it'll be to others out there, but I cleaned up and open sourced the kernel hooking payload I wrote up for the streams. It's a minimal payload so you don't have to run a daemon, handy for exploit debugging. Excuse it's nasty hacks.https://t.co/m8QwkIWeRe
— Specter (@SpecterDev) March 6, 2021
Il suo scopo principale è lo sviluppo/debug degli exploit sebbene possa essere utilizzato ovunque sia necessario l’hooking (benché Mira sia consigliato per i ganci a lungo termine per cose come homebrew).
Non richiede l’esecuzione di un daemon per il monitoraggio dello stato poiché utilizza una code cave e una tabella di invio.
[stextbox id=’warning’]Attenzione: L’implementazione è piuttosto complicata e non è ancora completa. Sentiti libero di fare fork e pull richiedere eventuali miglioramenti o articoli da fare.[/stextbox]
Costruire ed eseguire
Per creare questo payload avrai bisogno del PS4 Payload SDK di Scene Collective. Una volta installato, creare semplicemente questo payload in questo modo:
$ make clean
$ make
$ cat PS4-KHook.bin | nc [ps4ip:payloadport]
Avvertenze importanti
Questo payload di gancio ha alcune avvertenze di cui devi essere a conoscenza prima di scrivere e installare i ganci.
- I ganci devono avere un solo percorso di ritorno e deve restituire
0x1337
. Inoltre, il payload deve essere compilato senza ottimizzazione (-O0
). Il motivo è dovuto al calcolo della dimensione della funzione di runtime per i ganci. - I trampolini devono avere una dimensione minima di 10 byte (
0xA
byte). - I trampolini non possono contenere istruzioni che utilizzano indirizzi relativi a RIP (incluse chiamate, salti o letture/scritture di dati relativi a RIP).
- Gli offset del kernel e il code cave sono per il firmware 5.05. Per usarlo su altri firmware, dovrai portare questi offset.
Aggiungere i propri ganci
I ganci dovrebbero essere definiti nel file hooks.c
con prototipi in hooks.h
. Questi file hanno già due ganci di esempio scritti per il debug con l’UAF IP6_EXTHDR_CHECK
. Utilizzare il seguente modello per le funzioni hook:
int my_hook() { SAVE_REGISTERS; // [hook code] RESTORE_REGISTERS; return 0x1337; }
Per l’installazione dei ganci, fare riferimento al file main.c
. Ecco un esempio per l’installazione di my_hook
su syscall sys_dynlib_prepare_dlclose
con hook ID 1:
#define HOOK_DYNLIB_PREPARE_DLCLOSE 0x239380 // ... char *kexecArgsBuffer = mmap(KEXEC_ARGS_BUFFER, 0x4000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if(kexecArgsBuffer != KEXEC_ARGS_BUFFER) return -1; struct install_hook_args *installHookArgs = (struct install_hook_args *)kexecArgsBuffer; installHookArgs->id = 1; installHookArgs->targetOffset = (uint64_t *)HOOK_DYNLIB_PREPARE_DLCLOSE; installHookArgs->trampolineSize = 0xA; installHookArgs->hookFunctionAddr = (uint64_t *)&my_hook; installHookArgs->hookFunctionSize = get_function_size((uint8_t *)&my_hook);
L’argomento richiederà ancora un po’ di lavoro manuale per capirlo. Inoltre bisogna assicurarsi di impostare correttamente la dimensione del trampolino, poiché non può essere calcolata automaticamente, dipende da dove viene agganciata.
Questo perché x86 ha istruzioni di dimensioni variabili, quindi se le dimensioni del trampolino non saranno corrette, si verificherà un arresto anomalo a causa dell’esecuzione di istruzioni non valide (o istruzioni valide che avranno un comportamento non intenzionale).
Ancora una volta, tieni presente che deve essere almeno 0xA
e possibilmente più grande a seconda delle istruzioni nella posizione del gancio.
Prossimamente
- Rielaborare la tabella di invio per consentire una caverna di codice più piccola ruotando su una tabella di spedizione allocata in heap.
- Correggere le istruzioni relative al RIP per consentirle di entrare nei trampolini.
- Possibilmente fare un ricalcolo più robusto della dimensione della funzione (direttive sulle dimensioni?).
Download: Source code PS4 KHook
Fonte: twitter.com