Ver Mensaje Individual
Antiguo 02/02/2008, 21:29   #1
SantiPHREACK 
Usuario PREMIUM+
 
Fecha de ingreso: 13/abr/2006
Mensajes: 223
SantiPHREACK está en el buen camino
Análisis e Investigación de los Firms de moresat

Wenas a todos xD

Como sabéis, los firms de MoreSat para los [B][I]FTE MAX-S[/I][/B] no podemos Fixearlos ni adaptarlos a nuestros decos, debido a que desde hace algo mas de un año vienen con su [B][I]"Maincode" cifrados[/I][/B], con lo cual, hasta que no demos con el método de poder ponerlos en claro y desempaquetarlos correctamente, no se podría hacer nada con ellos, por eso os pongo este hilo con las conclusiones que he sacado, para ver si entre todos damos con el asunto xD

Primero os explicare el sistema de arranque del deco, que básicamente consiste en que el deco arranca con su "[B][I]Bootloader[/I][/B]" y este es el encargado de descifrar y desempaquetar el maincode, y después de dejarlo en la SDRAM lo inicializa desde allí, con lo cual, el es el encargado de todo el proceso que desconocemos, y es donde deberíamos mirar.

Pero antes de nada, si nos fijamos en el "[B][I]Maincode[/I][/B]", a simple vista deducimos esto:

[CODE]sw_V1.3.7_020208.bin
----------------------------------------------------------------
0x010000: 01FE0101 0007FD7F 0007FF80 C65E9608 .............^..
0x010010: 6D61696E 636F6465 00FFFFFF FFFFFFFF maincode........
0x010020: 312E332E 3700FFFF FFFFFFFF FFFFFFFF 1.3.7...........
0x010030: 32303038 2D322D32 00FFFFFF FFFFFFFF 2008-2-2........
0x010040: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ................
0x010050: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ................
0x010060: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ................
0x010070: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ................
0x010080: [COLOR="Blue"]434F4445[/COLOR] [COLOR="Green"]0007FD07[/COLOR] [B]41C26EA2 2BF012B8[/B] [COLOR="Blue"]CODE[/COLOR]....A.n.+...
0x010090: [B]D6C88E3F F37402B7 076360BF 865C8340[/B] ...?.t...c`..\.@
0x0100A0: [B]62A9ADEC C8A85B0A F10FCF54 DCAB4447[/B] b.....[....T..DG
...

[COLOR="Blue"]434F4445[/COLOR] -> "[COLOR="Blue"]CODE[/COLOR]" -> Cabecera que indica que el maincode esta cifrado
[COLOR="Green"]0007FD07[/COLOR] -> [COLOR="Green"]0x7FD07[/COLOR] = 523.527 Bytes -> Tamaño del bloque cifrado del maincode, a partir del offset "0x010084"
[/CODE]

Lo curioso es que el tamaño de los bytes cifrados es muy parecido al de los maincode empaquetados en "[B][I]Lzma[/I][/B]", de lo cual se deduce que lo que esta cifrado tiene que estar antes comprimido, y seguramente el tamaño seria el mismo, osea que seria un algoritmo de [B][I]cifrado simétrico[/I][/B], en plan XOReo para enmascararlo xD

Pero examinando diferentes versiones de los firms, se ve claramente que los datos cifrados son siempre diferentes, con lo cual se deduce que no es un simple xoreo, (ya que si fuera así, suponiendo que tendrían que tener la cabecera del Lzma, los primeros bytes cifrados serian los mismos entre diferentes versiones), osea que la cosa se complica, y seguramente la diferencia de bytes cifrados sea provocado por que no son del mismo tamaño los maincodes, lo que nos indica que el numero de bytes a cifrar, influye en el resultado, con lo cual tiene que ser un algoritmo que cifra los datos [B][I]por bloques[/I][/B] (como el TEA, DES, AES etc) en modo "[B][I]CBC[/I][/B]", es decir, que dependiendo del tamaño, lo divide en bloques y lo cifra en varias rondas, pero yo me quedaría con el algoritmo "[B][I]TEA[/I][/B]" (que es bastante simple para implementar en microprocesadores y bastante rápido, e incluso fue utilizado en las Xbox y algunos móviles para cifrar sus Bios xD)

Osea que conociendo que utiliza un algoritmo de cifrado simétrico, y que dichos algoritmos necesitan de una "[B][I]Key[/I][/B]" para cifrar y descifrar (que seguramente sera de 32 bits que es a lo que trabaja por bloque la CPU), y dicho descifrado lo realiza el [B][I]bootloader[/I][/B], es de suponer que la clave se encuentre en el, y analizando las diferencias entre los boots "SMT01---0.9.5" (que fue el ultimo en el que no cifraban el maincode) y el "[B][I]SMT01---0.9.6[/I][/B]", simplemente se aprecia un aumento de código de apenas 1Kb

Y desensamblando un trozo de ese código nuevo del boot 0.9.6, nos encontramos con esto:


[CODE]BootLoader_SMT01---0.9.6_(2006-12-7).bin
------------------------------------------------------------
...
0x00D900: 6F35 0C0C -> 0C0C 356F jal 0x00D5BC <...>
0x00D904: D4EE C624 -> 24C6 EED4 addiu a2,a2,61140
0x00D908: F0FF 0624 -> 2406 FFF0 li a2,65520
0x00D90C: 2430 2602 -> 0226 3024 sltu a2,a2,v0
0x00D910: 2130 8602 -> 0286 3021 addu a2,s4,a2
0x00D914: 0001 C624 -> 24C6 0100 addiu a2,a2,256
0x00D918: 2120 8002 -> 0280 2021 move a0,s4
0x00D91C: 09F8 E002 -> 02E0 F809 jalr s7
0x00D920: 2128 C002 -> 02C0 2821 move a1,s6
0x00D924: 0A00 4054 -> 5440 000A bnezl v0,0x00D950 <...>
0x00D928: 21A8 0000 -> 0000 A821 move s5,zero

0x00D92C: 5536 0C08 -> 080C 3655 j 0x00D954 <...>
0x00D930: 2110 A002 -> 02A0 1021 move v0,s5
0x00D934: 2120 4002 -> 0240 2021 move a0,s2
0x00D938: 2128 C002 -> 02C0 2821 move a1,s6
0x00D93C: 09F8 E002 -> 02E0 F809 jalr s7
0x00D940: 2130 8002 -> 0280 3021 move a2,s4
0x00D944: 0100 422C -> 2C42 0001 sltiu v0,v0,1
0x00D948: 2310 0200 -> 0002 1023 negu v0,v0
0x00D94C: 24A8 A202 -> 02A2 A824 and s5,s5,v0
0x00D950: 2110 A002 -> 02A0 1021 move v0,s5
0x00D954: 3000 BF8F -> 8FBF 0030 lw ra,48(sp)
0x00D958: 2C00 B78F -> 8FB7 002C lw s7,44(sp)
0x00D95C: 2800 B68F -> 8FB6 0028 lw s6,40(sp)
0x00D960: 2400 B58F -> 8FB5 0024 lw s5,36(sp)
0x00D964: 2000 B48F -> 8FB4 0020 lw s4,32(sp)
0x00D968: 1C00 B38F -> 8FB3 001C lw s3,28(sp)
0x00D96C: 1800 B28F -> 8FB2 0018 lw s2,24(sp)
0x00D970: 1400 B18F -> 8FB1 0014 lw s1,20(sp)
0x00D974: 1000 B08F -> 8FB0 0010 lw s0,16(sp)
0x00D978: 0800 E003 -> 03E0 0008 jr ra
0x00D97C: 3800 BD27 -> 27BD 0038 addiu sp,sp,56
0x00D980: 0000 A88C -> 8CA8 0000 lw a4,0(a1)
0x00D984: 0400 A98C -> 8CA9 0004 lw a5,4(a1)
0000D988: [B]379E[/B] 0B3C -> 3C0B 9E37 lui a7,[B]0x9E37[/B] // "0x9E37" "0x79B9" -> [B]0x9E3779B9[/B] -> Magic Constant (TEA or RC5)
0000D98C: [B]B979[/B] 6B35 -> 356B 79B9 ori a7,a7,[B]0x79B9[/B] //
0x00D990: 1800 8B00 -> 008B 0018
0x00D994: 1238 0000 -> 0000 3812 mflo a3
0x00D998: 1B00 8010 -> 1080 001B beqz a0,0x00DA08 <...>
0x00D99C: 2150 0000 -> 0000 5021 move a6,zero

0x00D9A0: 0019 0800 -> 0008 1900 sll v1,a4,0x4
0x00D9A4: 4211 0800 -> 0008 1142 sll v0,a3,0x5
0x00D9A8: 2618 6200 -> 0062 1826 xor v1,v1,v0
0x00D9AC: 2118 6800 -> 0068 1821 addu v1,v1,a4
0x00D9B0: 4212 0700 -> 0007 1242 srl v0,a3,0x9
0x00D9B4: 0C00 4230 -> 3042 000C andi v0,v0,0xC
0x00D9B8: 2110 4600 -> 0046 1021 addu v0,v0,a2
0x00D9BC: 0000 428C -> 8C42 0000 lw v0,0(v0)
0x00D9C0: 2110 E200 -> 00E2 1021 addu v0,a3,v0
0x00D9C4: 2618 6200 -> 0062 1826 xor v1,v1,v0
0x00D9C8: 2348 2301 -> 0123 4823 subu a5,a5,v1
0x00D9CC: 2338 EB00 -> 00EB 3823 sltu a3,v0,v1
0x00D9D0: 0019 0900 -> 0009 1900 sll v1,a5,0x4
0x00D9D4: 4211 0900 -> 0009 1142 srl v0,a5,0x5
0x00D9D8: 2618 6200 -> 0062 1826 xor v1,v1,v0
0x00D9DC: 2118 6900 -> 0069 1821 addu v1,v1,a5
0x00D9E0: 0300 E230 -> 30E2 0003 andi v0,a3,0x3
0x00D9E4: 8010 0200 -> 0002 1080 sll v0,v0,0x2
0x00D9E8: 2110 4600 -> 0046 1021 addu v0,v0,a2
0x00D9EC: 0000 428C -> 8C42 0000 lw v0,0(v0)
0x00D9F0: 2110 E200 -> 00E2 1021 addu v0,a3,v0
0x00D9F4: 2618 6200 -> 0062 1826 xor v1,v1,v0
0x00D9F8: 0100 4A25 -> 254A 0001 addiu a6,a6,1
0x00D9FC: 2B10 4401 -> 0144 102B sltu v0,a6,a0

0x00DA00: E7FF 4014 -> 1440 FFE7 bnez v0,0x00D9A0 <...>
0x00DA04: 2340 0301 -> 0103 4023 subu a4,a4,v1
0x00DA08: 0000 A8AC -> ACA8 0000 sw a4,0(a1)
0x00DA0C: 0800 E003 -> 03E0 0008 jr ra
0x00DA10: 0400 A9AC -> ACA9 0004 sw a5,4(a1)

0x00DA14: E0FF BD27 -> 27BD FFE0 addiu sp,sp,-32
0x00DA18: 1C00 BFAF -> AFBF 001C sw ra,28(sp)
0x00DA1C: 1800 B0AF -> AFB0 0018 sw s0,24(sp)
0x00DA20: 2130 8000 -> 0080 3021 move a2,a0
0x00DA24: 2180 A000 -> 00A0 8021 move s0,a1
0x00DA28: 0300 0392 -> 9203 0003 lbu v1,3(s0)
0x00DA2C: 001E 0300 -> 0003 1E00 sll v1,v1,0x18
0x00DA30: 0200 0292 -> 9202 0002 lbu v0,2(s0)
0x00DA34: 0014 0200 -> 0002 1400 sll v0,v0,0x10
0x00DA38: 2518 6200 -> 0062 1825 or v1,v1,v0
0x00DA3C: 0100 0292 -> 9202 0001 lbu v0,1(s0)
0x00DA40: 0012 0200 -> 0002 1200 sll v0,v0,0x8
0x00DA44: 2518 6200 -> 0062 1825 or v1,v1,v0
0x00DA48: 0000 0292 -> 9202 0000 lbu v0,0(s0)
0x00DA4C: 2518 6200 -> 0062 1825 or v1,v1,v0
...
[/CODE]


Y sorpresa, en los [I][B]Offsets "0xD988" y "0xD98C"[/B][/I] nos aparece un dato importante para identificar el algoritmo xD, y es la [B][I]"Magic Constant" 0x9E3779B9[/I][/B] que usa el TEA, XTEA y el RC5, osea que confirma mis deducciones jeje, con lo cual, esa constante "mágica" es la que se usa para la expansión de la supuesta "key", para generar las subclaves y que serian las encargadas de desencriptar el "Maincode" mediante rondas de sumas modulares y xoreos, y una vez desencrpiptado nos daria como resultado su Maincode empaquetado en LZMA, que es el que nos interesa xD

Osea que sabiendo el algoritmo que usa, solo necesitamos la clave para aplicárselo, y que tiene que estar en el boot por narices, jeje

[B]PD:[/B] Luego me pondré a hacer algunas pruebas, y en caso de que no sean satisfactorias, me pondré a intentar realizar volcados
de SDRAM para ver si doy con la clave necesaria, ya os contare xD

[B]PD2:[/B] Cualquier ayuda para hallar el método para descifrarlos es bien venido, aquí os dejo unos links interesantes de la Wikipedia xD
[URL="http://es.wikipedia.org/wiki/Cifrado_por_bloques"]http://es.wikipedia.org/wiki/Cifrado_por_bloques[/URL]
[URL="http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm"]http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm[/URL]

Última edición por SantiPHREACK; 03/02/2008 a las 03:24.
SantiPHREACK está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Publicidad: Conoce las ofertas de ANUNCIATE