linesguapo escribió:DEP escribió:Los FPKG siguen teniendo firma. Lo que no tiene una firma oficial son los .ELF creados por la comunidad, payloads, etc.
Lo que mostró ayer es un entry point diferente usando el webkit de las aplicaciones de vídeo, no tiene más misterio.
Nos puedes ilustrar y esplicar en cristiano lo que ha explicado y por qué los usuarios le están twitteando (gracias por nada).
Ayer explicó como en firmwares bajos consiguió atacar ciertas partes del sistema a través del kernel exploit de 1.76 y como consiguió hacer dumps en HEX de esas mismas partes del sistema a través del webkit de esas aplicaciones de vídeo combinándolo con el kernel exploit de aquel entonces. Los sistemas que a día de hoy utilizamos se apoyan en sus antiguos descubrimientos.
Lo que Morpheus dió a entender ayer es que con el webkit dentro de las aplicaciones de vídeo (el cual no se actualiza a menudo) podríamos usar un ROP en caso de no tener a disposición otro webkit exploit del navegador para hacerle un trigger al kernel (total OK um einen Kernel Exploit zu triggern lo cual no quiere decir que haya descubierto ningún kernel exploit, simplemente que es suficiente de esta manera para hacerle un trigger al kernel exploit que se encuentre en un futuro) y conseguir el mismo resultado que a día de hoy utilizando el exploit del navegador (El cual ya le hace un trigger al kernel de 5.05 gracias al ROP de Qwerty)
El exploit del webkit del navegador lo descubrió Qwerty en iOS (El cual es común con PS4 y Linux pues es UNIX) y permite atacar el kernel sin hacer tablas falsas dentro de las aplicaciones pues el código para atacar el kernel está incluído en el payload y es .js (javascript).
ROP de Qwerty:
// Basic memory functions
function malloc(size)
{
var backing = new Uint8Array(0x10000 + size);
window.nogc.push(backing);
var ptr = p.read8(p.leakval(backing).add32(0x10));
ptr.backing = backing;
return ptr;
}
function mallocu32(size) {
var backing = new Uint8Array(0x10000 + size * 4);
window.nogc.push(backing);
var ptr = p.read8(p.leakval(backing).add32(0x10));
ptr.backing = new Uint32Array(backing.buffer);
return ptr;
}
function stringify(str)
{
var bufView = new Uint8Array(str.length + 1);
for(var i=0; i < str.length; i++) {
bufView[i] = str.charCodeAt(i) & 0xFF;
}
window.nogc.push(bufView);
return p.read8(p.leakval(bufView).add32(0x10));
}
// Class for quickly creating a kernel ROP chain
var krop = function (p, addr) {
// Contains base and stack pointer for fake stack (this.stackBase = RBP, this.stackPointer = RSP)
this.stackBase = addr;
this.stackPointer = 0;
// Push instruction / value onto fake stack
this.push = function (val) {
p.write8(this.stackBase.add32(this.stackPointer), val);
this.stackPointer += 8;
};
// Write to address with value (helper function)
this.write64 = function (addr, val) {
this.push(window.gadgets["pop rdi"]);
this.push(addr);
this.push(window.gadgets["pop rax"]);
this.push(val);
this.push(window.gadgets["mov [rdi], rax"]);
}
// Return krop object
return this;
};
// Class for quickly creating and managing a ROP chain
window.rop = function() {
this.stack = new Uint32Array(0x10000);
this.stackBase = p.read8(p.leakval(this.stack).add32(0x10));
this.count = 0;
this.clear = function() {
this.count = 0;
this.runtime = undefined;
for(var i = 0; i < 0xFF0 / 2; i++)
{
p.write8(this.stackBase.add32(i*8), 0);
}
};
this.pushSymbolic = function() {
this.count++;
return this.count-1;
}
this.finalizeSymbolic = function(idx, val) {
p.write8(this.stackBase.add32(idx * 8), val);
}
this.push = function(val) {
this.finalizeSymbolic(this.pushSymbolic(), val);
}
this.push_write8 = function(where, what)
{
this.push(gadgets["pop rdi"]);
this.push(where);
this.push(gadgets["pop rsi"]);
this.push(what);
this.push(gadgets["mov [rdi], rsi"]);
}
this.fcall = function (rip, rdi, rsi, rdx, rcx, r8, r9)
{
if (rdi != undefined) {
this.push(gadgets["pop rdi"]);
this.push(rdi);
}
if (rsi != undefined) {
this.push(gadgets["pop rsi"]);
this.push(rsi);
}
if (rdx != undefined) {
this.push(gadgets["pop rdx"]);
this.push(rdx);
}
if (rcx != undefined) {
this.push(gadgets["pop rcx"]);
this.push(rcx);
}
if (r8 != undefined) {
this.push(gadgets["pop r8"]);
this.push(r8);
}
if (r9 != undefined) {
this.push(gadgets["pop r9"]);
this.push(r9);
}
this.push(rip);
return this;
}
this.run = function() {
var retv = p.loadchain(this, this.notimes);
this.clear();
return retv;
}
return this;
};
La gente le está poniendo mensajes en Twitter de gracias por nada porque son simplemente gilipollas pues esperaban un kernel exploit en 6.20 para poder piratear los juegos que requieren una versión superior para ser lanzados pues les importa una puta mierda que gracias al sistema que descubrió él mismo en 2015 puedan estar jugando a todo lo que hay por debajo de 5.05 al haber sido desarrollado y adaptado al nuevo kernel exploit.
Morpheus no liberará nada pues ya lo compartió en 2015 con quien tuvo que hacerlo. No es más que un entry point mucho más limitado que el actual y ningún DEV se va a poner a desarrollar nada con esto pues hay muchas formas de atacar el sistema desde el navegador que son más efectivas.
Deberían ponerle más bien,
gracias por todo Morpheus, eres el padre de la Scene de PS4.