ProtoPwn è un nuovo exploit rilasciato dal developer pcm720, figura storica della scena homebrew, che apre nuove possibilità per l’utilizzo della console PlayStation 2.
Pensato specificamente per i primi modelli della console con kernel Protokernel (SCPH-10000, SCPH-15000 e DTL-H10000(S)), questo exploit consente l’esecuzione di codice non autorizzato sfruttando una vulnerabilità nel codice di aggiornamento del browser OSDSYS.
PS2 MILESTONE & New exploit – ALL PS2s Console's now hackable via MemoryCard. (by pcm720)
See details @https://t.co/k2a8cYaunc pic.twitter.com/B0FTBGAbO0
— PSX-Place (@PSXPlace) June 14, 2025
Il risultato è la possibilità di avviare applicazioni homebrew direttamente da una memory card, senza necessità di dischi, modifiche hardware o supporto MagicGate.
Il cuore tecnico di ProtoPwn è un payload a due stadi, unito a uno strumento di impacchettamento. L’exploit fa leva su un file di aggiornamento del browser non cifrato e privo di controlli d’integrità, che viene caricato all’indirizzo 0x7a0000
della memoria.
Una volta in esecuzione, il payload apporta modifiche a OSDSYS, applica una patch al kernel EELOAD, disattiva il sistema principale e cerca sulla memory card un file BOOT.ELF
da eseguire.
Il tutto si rende compatibile con qualsiasi tipo di memory card, incluse quelle non ufficiali, rendendo la procedura particolarmente semplice e accessibile.
L’importanza di ProtoPwn è storica, si tratta del primo metodo a rendere vulnerabili via memory card anche i modelli più antichi e prototipici della PlayStation 2, finora esclusi da exploit come FreeMCBoot.
Con questo rilascio, l’intera famiglia PS2 (compresi i modelli destinati a sviluppatori o arcade) può finalmente accedere al mondo homebrew, offrendo nuove opportunità a sviluppatori indipendenti, collezionisti e appassionati di retroconsole.
Utilizzo
- Eseguire il comando
make
. - Copiare il file
BIEXEC-SYSTEM
nella directory principale della memory card. - Copiare il payload che si desidera eseguire nel percorso
BOOT/BOOT.ELF
.
Come funziona
- ProtoPwn è composto da un payload a due stadi relativamente semplice e da uno strumento di packing.
- Viene eseguito a partire dall’indirizzo 0x7a0000.
- Applicare la patch al codice OSDSYS per eseguire una funzione personalizzata nel thread principale.
- Applicare la patch al kernel EELOAD.
- Disattivare OSDSYS.
- Cercare il file ELF di destinazione su mc0 o mc1.
- Eseguire il loader ELF incorporato.
- Puliere la memoria lasciata da OSDSYS.
- Caricare il file ELF di destinazione.
- Reimpostare l’IOP.
- Eseguire il file ELF di destinazione.
Script di packing semplice
- Esegue il minimo indispensabile per fare in modo che OSDSYS accetti e “decomprima” il payload.
- In realtà aumenta la dimensione del file.
- Il percorso del file ELF di destinazione può essere modificato in fase di compilazione passando l’argomento
BOOT_PATH
al comandomake
. BOOT_PATH
deve essere relativo a mc0 o mc1, ad esempio:BOOT/BOOT.ELF
.
Aggiornamento del browser
Durante l’inizializzazione, il sistema operativo OSDSYS dei modelli con protokernel verifica la presenza di un file di aggiornamento del browser (MBROWS) nelle directory mc1:/BIEXEC-SYSTEM/
e mc0:/BIEXEC-SYSTEM/
.
Il file manifest dell’aggiornamento si chiama OSBROWS ed è composto semplicemente da tre righe:
101
— versione del modulo; deve essere superiore a 100.PROTPWN
— nome del file del modulo, relativo alla cartellaBIEXEC-SYSTEM
. Non può superare i 7 caratteri.007a0000
— indirizzo di caricamento del modulo.
Quando questo file è presente, OSDSYS lo analizza, carica il file specificato all’indirizzo 0x1000000
e lo “decomprime” all’indirizzo di caricamento indicato. Il modulo così caricato viene poi eseguito come funzione del thread del browser OSD.
Similmente a __mbr
, questo modulo deve essere privo di intestazione (headerless), con il punto di ingresso situato all’inizio del payload.
Per qualche ragione, a differenza degli aggiornamenti di sistema, l’aggiornamento del browser è completamente non cifrato, senza controlli di integrità o validità, e utilizza uno schema di compressione molto semplice, che può essere facilmente bypassato.
Grazie a queste caratteristiche, è possibile ottenere l’esecuzione di codice personalizzato semplicemente creando un payload da far girare nel thread del browser.
Compressione del modulo
I moduli OSD vengono sempre compressi. Lo schema di compressione è basato su blocchi e ha la seguente struttura:
- 4 byte che indicano la lunghezza del payload non compresso, in little endian.
- 4 byte di descrittore del blocco.
- 30 byte di dati del blocco.
- 4 byte di descrittore del blocco successivo.
- 30 byte di dati.
- …e così via.
Il descrittore del blocco indica se i byte del blocco sono compressi e contiene le informazioni su shift e mask da applicare per decomprimere i dati.
L’utility di decompressione di OSDSYS interrompe l’elaborazione una volta raggiunta la lunghezza del payload dichiarata, ignorando tutti i byte successivi.
Per bypassare la compressione, è sufficiente scrivere il payload non compresso così com’è, anteponendo l’intestazione con la lunghezza all’inizio del file e quattro byte nulli prima di ogni blocco da 30 byte. Per maggiori dettagli, si può consultare il codice di osdpack
.
Download: ProtoPwn v1.0.0
Download: Source code ProtoPwn v1.0.0
Fonte: x.com