Control de usuario
Patrocinadores
Estadísticas
Miembros:
145.896
Online:
1.521
Hilos:
827.167
Mensajes:
11.259.712
Stats

Índice de foros Wii Scene

Desvelado el bug del trucha

Homebrew, hacks, exploits y el resto de la scene de Wii

Moderadores: CyBeR PeReZ, Flash78

elchicosinhada
Avatar de usuario
Adicto
 
Mensajes: 381
Registrado: 11 Ago 2005

Mensajepor elchicosinhada 25 Mar 2008 21:53

Tengo todo medio claro salvo una duda.
Según entiendo, hay que realizar un calculo enorme para calcular una firma de "tamaño normal" así que se aprovecha el fallo (el del null) del strcmp para solo tener que calcular una pequeña parte (reduciendo drásticamente el numero de datos a calcular). Sin embargo, esta firma habrá que comprobarla con otra que esté "preparada" para que también sea más pequeña de lo normal, y aquí aparece mi duda: A partir de qué se calcula la otra y como puede modificarse para que también obtenga el null en el mismo byte?

Evil_forces
Avatar de usuario
Super Heroe
 
Mensajes: 521
Registrado: 26 Jun 2002
Ubicación: The Hell

Mensajepor Evil_forces 25 Mar 2008 22:21

Tengo todo medio claro salvo una duda.Según entiendo, hay que realizar un calculo enorme para calcular una firma de "tamaño normal" así que se aprovecha el fallo (el del null) del strcmp para solo tener que calcular una pequeña parte (reduciendo drásticamente el numero de datos a calcular). Sin embargo, esta firma habrá que comprobarla con otra que esté "preparada" para que también sea más pequeña de lo normal, y aquí aparece mi duda: A partir de qué se calcula la otra y como puede modificarse para que también obtenga el null en el mismo byte?


A ver, creo que no es asi como tu dices. Voy a ver si con un ejemplo se aclara un poco.

La firma del disco Wii es:

12345678

Esta firma es mas dificil de calcular por su longitud, pero gracias a la funcion que utilizan para comprobar poniendo solamente:

1234(Null)

Con esto ya lo daria por valido, ya que al detectar el valor Null para de comprobar.

Sacar solo los 4 primeros digitos es mas facil que sacar 8.

La firma Buena sigue siendo 12345678, pero solo con sacar el 1234 y ponerle el NULL bastaria para darla como valida.

Tambien serviria poner 1(Null), ya que conicide el primer digito con el primero de la firma real, y al estar el NULL para de comprobar.

Asi es como entiendo yo que funciona este bug.

Saludos.
Welcome 2 My World
Imagen

merol
Avatar de usuario
Adicto
 
Mensajes: 255
Registrado: 16 May 2006

Mensajepor merol 25 Mar 2008 22:21

ddf escribió:Lo importante aqui, es que como ya dijerón, este bug esta también en el boot1 de todas las wii actuales, y no se puede modificar el boot1 :D por mucho parcheo del firmware que hagan.


mi no entender, que es el boot1, y si acaban de decir en wiibrew que con una proxima actualización del system menu que use el IOS37 (espero haberlo puesto todo bien), se tapara este bug. No entiendo ahora lo del boot1

A252
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 1052
Registrado: 22 Jun 2006
Ubicación: Madrid (Moratalaz)

Mensajepor A252 25 Mar 2008 22:25

Off-topic:
A dia de hoy con qué herramienta es posible abrir un canal? He probado el tachtig para los saves y funciona bien pero no he visto nada para los canales.
Ultima edición por A252 el 25 Mar 2008 22:39, editado 1 vez

keridito
Avatar de usuario
Adicto
 
Mensajes: 164
Registrado: 30 Jul 2001
Ubicación: En el fondo del mar...

Mensajepor keridito 25 Mar 2008 22:28

Waninkoko escribió:
Ambas cadenas deben de tener el caracter 0x00 en la misma posicion y los caracteres anteriores deben de ser iguales.

Si una cadena termina y la otra no, strncmp no devuelve 0.


Entonces el fallo no viene sólo por la función...sino porque la clave que se usa tiene un cero en una determinada posición casi al principio de la cadena... Ha habido suerte entonces, tanto por el fallo en el código como por la clave de Nintendo...
Er Keri.

Markuf
Avatar de usuario
¡¡Mario Moto!!
 
Mensajes: 4937
Registrado: 25 Jul 2005
Ubicación: Valldoreix, cerca de BCN

Mensajepor Markuf 25 Mar 2008 22:33

Evil_forces escribió:...

Bien, creo que lo he entendido, pero mi duda ahora es: No es muy cutre ese sistema de chequeo??? Descubres sólo la primera parte del "serial ese" y ya tienes todo???

keridito
Avatar de usuario
Adicto
 
Mensajes: 164
Registrado: 30 Jul 2001
Ubicación: En el fondo del mar...

Mensajepor keridito 25 Mar 2008 22:47

Evil_forces escribió:

A ver, creo que no es asi como tu dices. Voy a ver si con un ejemplo se aclara un poco.

La firma del disco Wii es:

12345678

Esta firma es mas dificil de calcular por su longitud, pero gracias a la funcion que utilizan para comprobar poniendo solamente:

1234(Null)

Con esto ya lo daria por valido, ya que al detectar el valor Null para de comprobar.

Sacar solo los 4 primeros digitos es mas facil que sacar 8.

La firma Buena sigue siendo 12345678, pero solo con sacar el 1234 y ponerle el NULL bastaria para darla como valida.

Tambien serviria poner 1(Null), ya que conicide el primer digito con el primero de la firma real, y al estar el NULL para de comprobar.

Asi es como entiendo yo que funciona este bug.

Saludos.


Con lo explicado hasta ahora eso sólo no vale. Es necesario que la firma con la que comprueba tenga un 0 en esa posición también. Es lo que no termino de entender del bug...Hay algo más que no explican bien y que tiene que ser clave... está claro que la posición donde poner NULL no es aleatoria. Que hayan probado muchas posiciones y en una de ellas el sistema haya dicho que vale, que le gusta ahí...
Me gustaría una explicación más clara, la verdad, no por nada, sino por aprender bien como funciona el invento este... es que me suena demasiado sospechoso. Como dicen en portada, tiene pinta de puerta atrás más que bug.
Er Keri.

FlipFlopX
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 558
Registrado: 21 Jul 2003
Ubicación: Según entras a la derecha

Mensajepor FlipFlopX 25 Mar 2008 22:49

Markuf escribió:
Bien, creo que lo he entendido, pero mi duda ahora es: No es muy cutre ese sistema de chequeo??? Descubres sólo la primera parte del "serial ese" y ya tienes todo???


Es que a posta no lo han hecho, fallo tonto típico al manejar cadenas. Años oyendo, cuidado al manejar cadenas, fgets y demás que se puede comprometer la seguridad..Y yo creyendo que era una leyenda urbana :-p

jiXo
Avatar de usuario
Hello Wisconsin!
 
Staff
Administrador
 
Mensajes: 18349
Registrado: 23 Jul 2000

Mensajepor jiXo 25 Mar 2008 23:13

keridito escribió:Me gustaría una explicación más clara, la verdad, no por nada, sino por aprender bien como funciona el invento este...


Waninkoko lo comentó con algo más de detalle:

Waninkoko escribió:Os voy a contar mi metodo XD

La Wii desencripta un hash SHA1 contenido en la firma y calcula otro hash SHA1 desde el campo "issuer" del TMD hasta el final del TMD.

Si ambos hashes coinciden, el disco esta bien firmado.
El caso es conseguir que ambos hashes comienzen por 0x00

El metodo mas sencillo es cambiar los 256 bytes de la firma por ceros, y modificar el campo "reserved" del TMD hasta que el hash SHA1 que se hace sobre el TMD comienze por 0x00.


También lo comentó tmbinc:
Basically, Nintendo screwed up the RSA signature verification badly. RSA is a well-known algorithm, hasn’t been broken yet, and basically there is just one thing you can do wrong: Not comparing the complete result (after a RSA public decrypt). And Nintendo did both things wrong. They screwed this up so hard that you need to count it twice. Here is the deal: Of the 4k or 2k result of the RSA decrypted hash block, they don’t check the padding at all. They just compare the SHA1-hash. Now, C is a hard language, especially when dealing with strings and blocks of memory, and there are so many functions with different names, so it’s almost impossible to not get confused. (This was a joke, if you haven’t got it.) Even more a joke is to compare binary blocks of data using a string compare (namely strncmp) instead of a binary compare (like memcmp). Yes, you have read correctly: For verifiying the hash (which is the only thing they verify in the signature), they have chosen to use a function which stops on the first nullbyte - with a positive result. Out of the 160 bits of the SHA1-hash, up to 152 bits are thrown away. Hooray.

Exploiting that hole, once found, is easy: just modify your content until it’s hash matches with the hash stored in the signature. Instead of a 160bit brute force attack, things get considerably easier, depending on what the decrypted hash look like it - the sooner it has a zero, the less you need to brute force in your data’s hash.

But given the other problem (not comparing any other properties of the resulting hash block, like the ASN.1-padding, which is actually present), it’s even easier: You can change the encrypted signature until it’s decrypted version results into a hash which has a zero byte somewhere at the beginning. Then you don’t rely on any real signature. And it’s even easier: Thanks to RSA’s mathematical structure, an input of all-zero produce an output of all-zero. So, by just overwriting the complete signature with zeros, you gain a hash value which is also all-zero. Then it’s just a matter of modifying your payload until that hash starts with a zero, which is a 8bit (slightly more, as segher explained me once - probability calculus FTW) brute force. Doable, easily. That’s what the hack bushing presented on 24C3 was based on.

merol
Avatar de usuario
Adicto
 
Mensajes: 255
Registrado: 16 May 2006

Mensajepor merol 25 Mar 2008 23:31

Creo que la gente se esta haciendo mucho lio con el tema de la firma, voy a intentar hacer otra explicacion, de lo que yo he entendido de Waninkoko. Vamos a ver.

=============Sistema asimetrico===================
La wii usa un sistema de cifrado asimetrico, especificamente RSA, el cifrado asimetro necesita dos claves, una publica y otra privada, en wii nintendo usa la clave privada para firmar, y la wii tiene alojada la publica para descrifrar. Funciona de la siguiente forma:

Tengo una cadena y las dos claves que llamare clapri (clave privada) y clapu (clave publica) por ejemplo:

cadena= 11111
clapri = 22222
clapu = 33333

yo con cadena y clapri y el algoritmo RSA obtengo cadenacifrada:

cadenacifrada= 444444

ahora la wii con cadenacifrada y clapu y el algoritmo RSA obtengo cadena, este es el fundamento basico, para entender lo que pasa en wii.

===============Proceso en la wii====================
En un juego de wii, se realiza el siguiente proceso:
Tenemos cadena (en este caso seria desde issuer hasta el final del TMD) a esta cadena se le realiza un proceso de hash como el md5 (mas info) asi obtenemos cadenahash.

Ahora codificamos este hash con la clave privada de nintendo. Y obtenemos cadenahashcodificada.

Bien pues en el juego se guarda cadena y cadenahashcodificada.

Hasta ahí lo que hace nintendo para cada juego.

Ahora una vez llega el juego a nuestra casa. cogemos cadenahashcodificada y la desencriptamos con la clave publica obteniendo cadenahash2.
Realizamos sobre cadena el algoritmo de hash, por lo que deberia devolvernos cadenahash si en su momento se uso la clave privada de nintendo, cadenahash y cadenahash2 seran iguales, si no son iguales es un sintoma de que no se ha firmado con la clave privada de nitendo.

El bug es el siguiente si en esta ultima comprobación ambos tienen un valor 0 en el primer byte de cadenahash y cadenahash2 el sistema lo dara como valido.

Espero haber aclarado y no liado mas, si yo entendi bien a Waninkoko


EDITADO, se me envio sin terminar.
Ultima edición por merol el 26 Mar 2008 00:20, editado 1 vez

PrevioSiguiente

Volver a Scene

¿Quién está conectado?

Usuarios navegando por este foro: No hay usuarios registrados visitando el foro y 3 invitados