Hermes escribió:D_Skywalk escribió:Hermes tengo ya casi terminada la syscall8 en 3.55 pero no se como instalarla :/
Supongo que debo parchear la memoria, pero no encuentro nada que me permita crear una nueva syscall, si me puedes guiar un poco te lo agradecería

Un Saludo!
Yo lo hago parcheando un salto relativo hacia la rutina de la syscall:
En 3.41 queda así
PATCH_BRANCH(0x17CD4, b, (BASE+(syscall8-destination_code))) // syscall 8
y como referencia, aquí tienes peek (syscall 6) y poke (syscall 7)
PATCH_INST(0x17CBC, ld %r3, 0(%r3)) // syscall 6
PATCH_INST(0x17CC0, blr)
PATCH_INST(0x17CC8, std %r4, 0(%r3)) // syscall 7
PATCH_INST(0x17CCC, blr)
Esto está en un punto que se hace una única vez DENTRO del payload (si no, va a ser dificil que averigues donde saltar

) y en tu caso, el problema es que peek y poke ya los debes de tener...
Como yo no tengo el código fuente del payload que estás usando, y no tengo dump de lv2 3.55, no puedo orientarte mejor (además, la dirección de syscall 8 no está alineada a 8, con lo que cuesta instalarla con un "poke" incluso si supieras el punto de salto y trataras de hacerlo con un registro (por ejemplo, yo instalo en syscall 9 un salto con registro usando r3, para activar el payload v4). Precisamente usé la 9 porque para activar, se puede hacer con poke, sin interferir a otra syscall, jeje, aunque parte del bucle raro que hago, se debe a que la caché de instrucciones toca los eggs)
Gracias Hermes por la explicación (copiada de su hilo de 3.41), aunque creo que estoy en un camino sin salida, tengo varios problemas que no se resolver, ante todo por mi desconocimiento de la arquitectura y supongo que por no tener las herramientas necesarias :/
UPDATE - Esta parte está más o menos comprendida, asi que la dejo como cita

Tu Payload:
- Código: Seleccionar todo
# generic tool main syscall
syscall8:
mflr %r0
stdu %sp, -0xA0(%sp)
std %r27, 0x78(%sp)
std %r28, 0x80(%sp)
...
Esta parte del código es la que instala la syscall8 si consiguiera que se leyera esa posición de memoria la sys8 estaría instalada, ¿es correcto?
Suponiendo que fuera así he visto que para poner syscall36 instalan un memcpy usando estas llamadas:
- Código: Seleccionar todo
#define memcpy 0x7c3a4
...
#define NEW_POKE_SYSCALL 813 // which syscall to overwrite with new poke
#define NEW_POKE_SYSCALL_ADDR 0x8000000000195A68ULL // where above syscall is in lv2
...
pokeq(NEW_POKE_SYSCALL_ADDR, 0x4800000428250000ULL);
pokeq(NEW_POKE_SYSCALL_ADDR + 8, 0x4182001438a5ffffULL);
pokeq(NEW_POKE_SYSCALL_ADDR + 16, 0x7cc428ae7cc329aeULL);
pokeq(NEW_POKE_SYSCALL_ADDR + 24, 0x4bffffec4e800020ULL);
Y para desinstalarla
- Código: Seleccionar todo
pokeq(NEW_POKE_SYSCALL_ADDR, 0xF821FF017C0802A6ULL);
pokeq(NEW_POKE_SYSCALL_ADDR + 8, 0xFBC100F0FBE100F8ULL);
pokeq(NEW_POKE_SYSCALL_ADDR + 16, 0xebc2fe287c7f1b78);
pokeq(NEW_POKE_SYSCALL_ADDR + 24, 0x3860032dfba100e8);
Finalmente la usan asi:
- Código: Seleccionar todo
Lv2Syscall3(NEW_POKE_SYSCALL, to, from, sz);
Sólo se me ocurre usar esta syscall813 para instalarla ¿tu entiendes algo de este código? por que estos comentarios, no gastan

Ahora suponiendo que tengamos la sys8 instalada y funcionando para poder usar el tema de las caches yo creo que aun faltaría lo peor: necesitamos parchear el hook_open para permitir la tabla de hermes...
Segun PL3-3.41 está...
- Código: Seleccionar todo
#define patch_func3 0x2aafc8
#define patch_func3_offset 0x24
Y segun PL3-3.55 está...
- Código: Seleccionar todo
#define patch_func3 0x2B3274 // hooked_open
#define patch_func3_offset 0x24
Y lo parchean así en 3.55:
- Código: Seleccionar todo
2b3298: 4BD5C050 # hook_open (patch_func3 + patch_func3_offset)
Estoy mirando, pero tengo poca información, he intentado contactar con wanin que creo que tenía pasadas bastantes cosas de tu payload a 3.55, pero no responde. Total que con esta "documentación" que tengo en los payloads y con las herramientas y poco tiempo que me queda, no creo que me de para añadir el tema de la cache.
Por que hoy me he columpiado pero jueves y viernes tengo sólo tendré un par de ratos y ya, luego tengo unas buenas semanas fully working...
Asi que si hermes si ves que la cosa está complicada también, pues nada que alguien con más conocimiento y tiempo siga, adjunto el fuente aunque tiene mucho código que sobra, por que ando haciendo pruebas

Un Saludo y siento la mala noticia pero he estirado mi tiempo lo que he podido y no doy :/
#--------------------------------------
UPDATE - Con nuevas preguntas xD
(creo que ya encontrada - ver UPDATE2)
Estoy buscando USER_DATA (0x800000000033E720) en 3.55 pero no consigo encontrar similitudes entre su posición en mi dump de lv2 de 3.41 y el dump de 3.55 ¿como podría encontrar su posición?
- Código: Seleccionar todo
000033E720 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 45 AB 68 80 00 00 00
000033E73C 00 45 AA 90 80 00 00 00 00 2C 0B 10 80 00 00 00 00 3E D3 28 80 00 00 00 00 3E D3 14
000033E758 80 00 00 00 00 3E D3 38 80 00 00 00 00 31 80 48 80 00 00 00 00 2D EF 78 80 00 00 00
lv2_read y lv2_open los usas para parchear el SFO bien, pero par que sirve "some_additional_patching_on_the_fly" me da un poco de miedo todo lo que veo dentro

Y una final las memory_patch_table son para que salgan las opciones, no? pero esas ya están en el CFW

Hasta aqui por el momento :_D
UPDATE 2 - Lo conseguido...
- Código: Seleccionar todo
//#define HVSC_SYSCALL 811 // which syscall to overwrite with hvsc redirect
//#define HVSC_SYSCALL_ADDR 0x8000000000195540ULL // where above syscall is in lv2
//#define NEW_POKE_SYSCALL 813 // which syscall to overwrite with new poke
//#define NEW_POKE_SYSCALL_ADDR 0x8000000000195A68ULL // where above syscall is in lv2
- Código: Seleccionar todo
//could be? (3.55)
//0000195130 F8 21 FE 51 7C 08 02 A6 FB 21 01 78 FB C1 01 A0 7C 79 1B 78 EB C2 FE 28! 38 60 03 21
//000019514C FA 41 01 40 FB 01 01 70 FB 41 01 80 FB 61 01 88 FB A1 01 98 FB E1 01 A8 F8 01 01 C0
//3.41
//00001BB004 F8 21 FE 51 7C 08 02 A6 FB 21 01 78 FB C1 01 A0 7C 79 1B 78 EB C2 05 40! 38 60 03 21
//00001BB020 FA 41 01 40 FB 01 01 70 FB 41 01 80 FB 61 01 88 FB A1 01 98 FB E1 01 A8 F8 01 01 C0
PATCH_BRANCH(/*0x1BB004*/ 0x195130, b, (BASE+(lv2_open-destination_code))) // syscall 0x801
- Código: Seleccionar todo
//could be? (3.55)
//000019031C F8 21 FE F1 7C 08 02 A6 FB A1 00 F8 7C 7D 1B 78 38 60 00 00 F8 01 01 20 FB 21 00 D8
//0000190338 FB 41 00 E0 7C B9 2B 78 FB 61 00 E8 FB 81 00 F0 7C 9B 23 78 FB E1 01 08 3B 81 00 88
//0000190354 7C DF 33 78 4B ED BF E1! 38 80 00 0C 7F 83 E3 78 64 84 80 00 7F BD 07 B4 4B FE F4 B9
//3.41
//00001B61F0 F8 21 FE F1 7C 08 02 A6 FB A1 00 F8 7C 7D 1B 78 38 60 00 00 F8 01 01 20 FB 21 00 D8
//00001B620C FB 41 00 E0 7C B9 2B 78 FB 61 00 E8 FB 81 00 F0 7C 9B 23 78 FB E1 01 08 3B 81 00 88
//00001B6228 7C DF 33 78 4B EB 76 09! 38 80 00 0C 7F 83 E3 78 64 84 80 00 7F BD 07 B4 4B FE F4 B9
PATCH_BRANCH(/*0x1B61F0*/ 0x19031C, b, (BASE+(lv2_read-destination_code))) // syscall 0x802
Yo creo que están correctas, aunque no se si las necesitaré por que se supone que están parcheadas en este firm

Otra ¿para que necesitamos este "return 1"?
- Código: Seleccionar todo
PATCH_INST(/*0x50B3C*/ 0xEF48, li %r3, 1) # use this patch if you move the payload resident...
PATCH_INST(/*0x50B40*/ 0xEF4C, blr)
Y este parche?
- Código: Seleccionar todo
PATCH_INST(0x04ed18, li %r4, 0)
PATCH_INST(0x04ed1c, stw %r4, 0(%r3))
PATCH_INST(0x04ed20, blr)
PATCH_DATA(0x3ba890, 0x01000000)
Finalmente tengo la posición del syscall 8 y 9
- Código: Seleccionar todo
// syscalls patch
PATCH_INST(/*0x17CE0*/ 0x19360, lis %r3, -0x7FFF) // restore syscall 9 (used to call this payload)
PATCH_INST(/*0x17CE4*/ 0x19364, ori %r3, %r3, 3)
PATCH_BRANCH(/*0x17CD4*/ 0x19354, b, (BASE+(syscall8-destination_code))) // syscall 8
Pero sigo sin saber como encontrar la zona de USER_DATA de tu payload.
Aunque puede que según mis pesquisas podría ser:
- Código: Seleccionar todo
//possible 3.55 position :?
//xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 88
//00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 xx xx
#define USER_DATA 0x8000000000464198
Aunque realmente sólo la necesitaríamos si usaramos el stealth que tiene la sys8

- Código: Seleccionar todo
syscall8_desc:
QUAD_ABS(syscall8)
.quad USER_DATA //user data on 3.55?
Y que sólo se usa en el enable y disable, supongo para el tema de las keys y demás

Yepa!