Ver Mensaje Individual
Antiguo 24/11/2004, 19:56   #3
calpe19 
LÍDER CONCURSOS DEL FORO
 
Avatar de calpe19
 
Fecha de ingreso: 01/dic/2002
Mensajes: 737
calpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la famacalpe19 tiene una reputación que sobrepasa la fama
Marchando.

[QUOTE]
ASPECTOS TÉCNICOS DEL “GLITCHING”:
(Traducido By Pekador)

Preguntas frecuentes:

El procesador de la tarjeta y el del Atmel funcionan a la misma velocidad? (los ciclos casan 1 a 1)?
NO, el Atmel funciona a 9, 200 Mhz, 1/2 de la velocidad del Oscilador (18.432/2 Mhz).

El procesador de la tarjeta posee un oscilador interno que la controla ?La tarjeta no posee un oscilador interno, siendo suministrado el clock externamente, por software, en torno a 4,6 Mhz (el voltaje del reloj está controlado por los chips 74HC4053 para mantener los picos de voltaje del reloj igual o inferiores al voltaje de glitch.)

En la grabación y lectura de la tarjeta se necesitan niveles de tensión diferentes?
Si, a lectura se realiza a 5V, pero la grabación exige, alimentación de 12V, un buen nivel de corriente. Este voltaje es suministrado por un generador interno el propio chip de la tarjeta, no siendo necesario un voltaje diferenciado de entrada para la grabación.

Definición de Glitch

Existen dos señales principales que van hacia la tarjeta y que pueden ser controladas externamente:

· La primera es el suministro de corriente a VCC. Se espera que sea un valor en corriente contínua de 5V constantes.

· La segunda es la señal de reloj a la tarjeta, que se espera sea una onda cuadrada alternando entre 5V y 0V con una frecuencia de 4,608 Mhz.

Observando el esquema de un unlooper, observamos que tanto el VCC como el reloj de la tarjeta son controlados por los chips 74HC4053 y la tarjeta no posee ninguna conexión directa con los 5 voltios.

Un glitch puede de ser definido como un cambio brusco intencional en cualquiera de estas señales.

Así, uno de los tipos de glitch que puede ser efectuado es el glitch de voltaje. Para esto, el voltaje de entrada (Vcc) es disminuido hasta un valor intermedio (en torno a 2.5V) durante aproximadamente ½ ciclo de reloj o menos. (En algunos pocos casos, mas, hasta aproximadamente 1 ciclo de reloj).

El otro tipo de glitch que puede ser empleado es el glitch de reloj. Para este glitch, la señal de reloj es acelerada hasta en torno a 4 veces su frecuencia normal (en este caso, hasta aproximadamente 18,432 Mhz.), durante aproximadamente 1 ciclo de reloj "normal". Esto causa que la señal de reloj haga 4 transiciones durante el período de tiempo en que normalmente haría solo una.

Hacer el glitch de línea de reloj es similar a arreglar y cambiar la forma del pulso de reloj que controla a la tarjeta. Esto introduce un retraso en los picos de la línea de reloj, interfiriendo en el modo en que son almacenados los datos en los registros internos y en el contador de programa (PC), siendo así que pequeñas variaciones en los pulsos de reloj en la tarjeta combinados con pequeñas variaciones en el voltaje provocan diferencias dramáticas en el comportamiento de la tarjeta. Y que lo que funciona para unas no funcione para otras.

Hacer un glitch en la línea Vcc de la tarjeta puede llevar a resultados imprevisibles, pero algunas veces esto produce exactamente los resultados esperados. El glitch que es enviado a la tarjeta tiene normalmente la duración de un pulso de reloj sincronizado con el reloj normal. La teoría básica del glitching es simple. Se sincroniza la línea de reset de la tarjeta con el reloj, entonces se cuentan los pulsos de reloj a partir del final del reset de la tarjeta para determinar cuando aplicar el glitch.

Los primeros tipos de unlooper usaban un potenciómetro para controlar la bajada en la línea de Vcc a la tarjeta. El ajuste del potenciómetro variaba de tarjeta a tarjeta. Se usaba un resistor de 56 ohms acoplado a la línea de Vcc y un trimpot multivueltas (25) de 200 ohms para controlar la profundidad del glitch. Si se analizan los componentes utilizados para trabajar con las tarjetas F, se tendrá una idea básica de cómo eran proyectados y como funcionaban aquellos aparatos.






Efectos del glitch en la tarjeta

Cada tipo de glitch afecta a la tarjeta de un modo ligeramente diferente:

· El glitch de reloj tiene un efecto en los registros internos / cerrojos de datos (“data latches” – componentes electrónicos que mantienen una condición de salida hasta que reciben una señal para cambiar). Muchos “data latches” o registros constan de D Flip-Flops. Para que un D FF (D Flip-Flop) realice el “latch” de un valor (un bit), este bit necesita estar presente en la entrada D por un cierto período de tiempo (conocido como tiempo de set-up, o tiempo de espera). Si se produce la correspondiente señal de reloj antes de que el bit esté presente en la entrada D por un periodo de tiempo suficientemente, el D FF errará a la hora de efectuar el “cerrojo” (latch) del bit. Cuando el reloj es acelerado mediante un glitch de reloj, cualesquiera registros/”data latches” en el microprocesador que estuvieran preparados para el “latch” de un valor correspondiente a un bus de datos interno, fallarán en el “latch” de ese valor, resultando en que no se lleve a cabo el movimiento de datos al registro pretendido. Virtualmente cualquier registro interno en el microprocesador puede ser alterado, incluyendo los registros A y B, y los más importante, el contador de programa (Program Counter: PC).

· El glitch de voltaje puede tener un efecto similar. Los chips lógicos TTL y CMOS requieren que el voltaje de entrada esté dentro de una franja para poder reconocer un valor como un "1" lógico o un "0" lógico. Si el voltaje estuviera fuera de esa franja, el efecto en el elemento lógico no será el pretendido. Para un sistema lógico pautado a 5V, voltajes por debajo de 3.8V serán considerados "1" lógicos, e voltajes por debajo de 0.8V serán considerados "0" lógicos. En un glitch de voltaje, el voltaje que atraviesa todos los circuitos es bajado hasta una franja intermedia “tierra de nadie” de 2.5V más o menos. Elementos lógicos como los flip-flops intentarán tomar un valor y realizar su “latch”, pero serán forzados a tratar con un valor que no es ni 1 ni 0. El resultado será que normalmente fallará en el “latch” del nuevo valor, y simplemente retendrá el antiguo. Esto puede causar el mismo efecto que el glitch de reloj – un error al mover datos hacia un registro diferente dentro del microprocesador.


Glitches como estos son usados durante el proceso de carga (boot) de las tarjetas para realizar algunas cosas que permitan que un bootloader sea grabado en la tarjeta. Una vez que el bootloader (que es un pequeño programa corriendo en la RAM) esté grabado y tenga el control, se comunica con el unlooper en sentido inverso a las rutinas de la tarjeta, e permitiendo lecturas y escrituras incondicionales.


Por que se usan secuencias de glitch y no un glitch exacto? El punto es diferente para cada tarjeta?
Puede causar alguna confusión el hecho de que scripts como el TurboUnloop accedan a la tarjeta aparentemente sin usar glitches precisos, usando secuencias que intentan efectuar un glitch en una franja de voltajes y retardos (delays)... Esto es, existiría una franja posible de utilización, con un inicio y un final, y no conjuntos (set) de glitchs que funcionen...

Para las tarjetas modelo H (GLA A/GX15 e SKY A/GL11) las secuencias de glitch fueron proyectadas para compensar variaciones entre diferentes unloopers y tarjetas individuales. Por ejemplo, si una tarjeta salta al chequeo 99 con un glitch de 2.65V, otra puede necesitar 2.73V para conseguir el mismo efecto. El mismo principio puede ser aplicado para unloopers usando un diferente suministro de potencia, la idea general es probar diferentes franjas de voltajes entre hipotéticos puntos de ajuste A y B, realizar el glitch y después chequear para ver si conseguimos el efecto deseado. El efecto más importante es intentar obligar a la tarjeta a grabar el bootloader. Para ello, probamos con diferentes voltajes, duraciones y delays en el glitch procurando cargar el bootloader. Después, chequeamos para ver si el bootloader ha sido grabado enviando un paquete especial a la tarjeta vía unlooper y analizando la respuesta. También debemos de chequear el Atmel 2313 del unlooper vía WDT (Watch Dog Timer) para ver si la tarjeta continua comunicándose correctamente con el unlooper. Cargar el bootloader permite que tomemos el control sobre leer e grabar cualquier parte de la EEPROM de la tarjeta, y también aumentar la velocidad de comunicación unlooper /tarjeta con una tasa de baudios superior.


Cómo se hace un glitch en la ROM?
El glitch de la ROM se realiza del mismo modo que en el área de la EEPROM. Esto apenas depende de donde estamos intentando el glitch. Teóricamente es posible definir como strings dos contadores programables para enviar glitches para cualquier localización de la tarjeta. Pero, por ejemplo, se pretendemos hacer un glitch sobre la rutina de boot de una tarjeta modelo HU/GX28/GX17/GL17, el circuito actual de un unlooper no será suficientemente rápido, y la tarjeta entrará en el boot antes de que los glitches lleguen a su lugar.

Cómo se realiza el cálculo de los ciclos de reloj?
Normalmente es resultado de estudios del desensamblado de la ROM y EEPROM de la tarjeta, contando los ciclos de reloj que los códigos operacionales específicos necesitan para ser ejecutados de una manera puramente experimental...
Los cálculos de los ciclos consumidos por los códigos operacionales pueden ser establecidos tomando una tarjeta funcional, un frecuencímetro y un osciloscopio, y usando un script (para tarjetas HU se usó el [script] eclipse) para cargar y correr un pequeño programa de test. Este programa debe rodar en la RAM y bajar la línea de I/O durante x ciclos (o crear un patrón reconocible) y entonces ejecutar el código operacional a chequear. Entonces, bajamos nuevamente la línea de I/O, y hacemos el dump de todos los registros, RAM, EEPROM, stack, etc., por la línea de I/O (de hecho necesitamos hacer el dump de todos los registros antes y después del opcode).

Usando este método, podemos entender que es exactamente lo que un opcode en particular hace, su número de ciclos, y como éste afecta al sistema.

El mismo método puede ser usado para encontrar el número de ciclos necesarios para un punto de glitcheo deseado. Apenas es necesario un pequeño programa que envíe alguna información a través de la línea de I/O (como un comando, digamos 0102), entonces tomamos la primera entrada en la tabla de vectores desde la cual saltó hacia el programa y continuamos donde el vector apuntaba originalmente. Ahora hacemos reset de la tarjeta y contamos los ciclos hasta que los datos sean enviados a través de la puerta. También pueden ser modificados los vectores con interceptores que envíen un código diferente para la salida (p. ej., si fuera 888C, que envíe 888F) así podremos contar la secuencia exacta de glitches y sus timings necesarios con un mínimo de programación. Usando este método nos permitirá encontrar los glitches mas rápidamente que contando a través del código desensamblado.

El cálculo para el glitching de tarjetas tipo HU implica un principio similar, pero tiene el problema de la encriptación, en el cual ciclos de máquina extra serán probablemente dedicados a desencriptar la ROM antes de ejecutar códigos operacionales no encriptados. Además de esto, si alguna interrupción fue activada (cosa no previsible hasta el momento), habría ciclos adicionales para esto.

Cómo usar efectivamente los glitches?
OK, ahora que conocemos lo que es un glitch y lo que hace, como podemos usar esto en nuestro favor? Naturalmente, un programa está hecho para ejecutar solamente ciertas funciones, y no permitir todas las demás. Estos glitches, cuando se aplican a la tarjeta durante la ejecución de cierta instrucción, pueden causar que la instrucción falle al hacer lo que se pretendía. Así, la tarjeta se comportará de una manera inconsistente con la función originalmente deseada. Recuerde siempre que cuando un glitch es aplicado a la tarjeta la ejecución del código se para, pero el reloj continua el ciclo y camina hacia la próxima instrucción...

Calcular los puntos de glitcheo no es tarea fácil. Para comenzar, se debe tener un conocimiento de lo que es un glitch y, de lo que es capaz de hacer, cuando y donde aplicar el glitch, y cual tipo de glitch usar, además del mapa de la ROM y EEPROM de la tarjeta para realizar el cálculo de la cuantía de ciclos de reloj, basados en el tiempo que tarda cada instrucción que será ejecutada hasta el momento que aplicamos el glitch. Tenemos que hacer el cálculo desde el inicio, recuerde que cuando la tarjeta insertada o reseteada, inicia la ejecución de su software en la ROM, en 0000h ..

Simplificando mucho, digamos que se quiere hacer un glitch de una tarjeta en la dirección B028h, primero deberemos calcular cuantos ciclos tarda el procesador para llegar a ese punto, pongamos que sean 0C00 ciclos... el script deberá ser algo más o menos así (claro que la cuantía del delay no será exactamente la misma de la de esa dirección...):

sc.write("B0 69") ; Fijar voltaje DAC para 2,05v -> (5,0*&H69/256)
sc.write("06 20 0C 00 0B 01 00"), donde:

06 6 bytes de longitud de la instrucción
20 delay xx xx ciclos de reloj
0C 00 cuantía del delay en ciclos de reloj...
0B glitch vcc
01 reset de la tarjeta

Temporización del sincronismo del glitch
El glitching, obviamente, altera el flujo del programa para ejecutar o dejar de ejecutar un determinado bit de código. Para poder saltar una instrucción, la “variación” de voltaje necesita ser aplicada a la tarjeta con precisión de microsegundos. Hay que recordar que el glitch normalmente procura conseguir el procesador salte hacia la próxima instrucción en vez de ejecutar la actual.

Incluso disponiendo de esta capacidad para aplicar glitches, no lograremos conseguir lo que queremos de la tarjeta a menos que el glitch esté perfectamente temporizado, o sea, no solamente el glitch deberá producirse en un determinado ciclo de reloj, si no que además precisa ser aplicado en un cierto punto dentro de aquel ciclo de reloj para ser efectivo. Para esto se utiliza una “placa hija” (daughterboard) en los HU loaders reales. Una “daugtherboard” coloca el pulso de glitch dentro del ciclo de reloj con un poco más precisión que un unlooper estándar. Esto es más necesario par el unlooping de tarjetas tipo HU/GX28/GX17/GL17, también las tarjetas SKY A y GL11 son bastante sensibles a este efecto.

La razón por la cual la temporización del glitch es tan crítica es que para producir el fallo deseado en la ejecución de una instrucción, precisamos realizar el glitch en un ciclo de reloj específico durante dicha ejecución. Por ejemplo, la instrucción “cjne” necesita 12h ciclos de reloj para ser ejecutada. Un glitch de voltaje en el ciclo 10h de esta instrucción causará que tal instrucción no realice el salto, aunque haga la comparación de los valores de los operadores. (Así se realiza el salto de la instrucción que chequea el valor 33 en el boot de las tarjetas Black Sunday). Un glitching en el ciclo de reloj 9 o 11 no funcionará. Esto muestra que con el glitching y el unlooping no se trata de “confundir la protección de la tarjeta”, o “empujar el fixbin de la tarjeta”. Se trata en cambio de unos métodos científicos, con sincronismo perfecto, para alterar la ejecución de un programa de la tarjeta en un sentido favorable. Un simple ciclo de reloj de error, y el bootstrap no será grabado en la tarjeta.

Las secuencias de glitch necesarias para colocar el bootstrap en las tarjetas tipo HU/GX28/GX17/GL17 precisan ser tan perfectamente temporizadas que fue necesario que los diseñadores del HU loader modificasen varias partes del código del Atmel para ajustar el sincronismo del glitch. Inclusive las rutinas para enviar/recibir bytes por el puerto serie fueron modificadas para hacer llevar a cabo la temporización correcta del glitch.

Dos factores deben ser tenidos en cuenta cuando hablamos de las capacidades de glitching del hardware actual:


· Uno es la precisión del glitch, o sea, la habilidad para colocar el glitch donde queremos. El Atmel puede ser programado a través de su código en ensamblador para colocar un glitch con la precisión de ½ ciclo de reloj. Esto actualmente no es suficiente para tarjetas tipo HU/GX28/GX17/GL17, siendo la razón de la adición de daughterboard. Cuando es instruido a través de software externo vía protocolo de unlooper, el Atmel solamente consigue colocar el glitch dentro de una franja entorno al punto deseado de 4 ciclos de reloj de la tarjeta, lo que resulta demasiado impreciso para el glitching de las HU/GX28/GX17/GL17, y también conduce a que algunas veces el unlooping de las cartas tipo H fracase (esto es particularmente cierto con las tarjetas GL11 de SKY).

· Peor para el unlooping es otro factor, la constancia del glitch, o sea, la frecuencia con que los glitches pueden ser aplicados a la tarjeta así como la duración del pulso de glitch. El Atmel, incluso si es programado en ensamblador, un lenguaje muy rápido, solamente coloca glitches en posiciones de ½ ciclo de reloj y la duración del pulso necesita ser en múltiplos de ½ ciclo de reloj. Esto no afecta mucho a la carga del bootloader en las tarjetas tipo HU/GX28/GX17/GL17, pero es muy impreciso para el unlooping de dichas tarjetas..

Así, el unlooping de las tarjetas tipo HU/GX28/GX17/GL17 no sería posible, en mi opinión, con el hardware actual, debido a esos factores.

Los puntos de glitch pueden ser considerados como “agujeros” en la seguridad de la tarjeta?
En el caso de las tarjetas tipo H, si, pero en cambio en las HU, no es ciertamente así. No solo tenemos que hacer el glitch de una instrucción en particular, sino que después de esto tendremos que servirnos de un WDT (Watch Dog Timer) y un contador (counter) para asegurar que la secuencia funcione. Esto puede ser considerado como un agujero? Bien, un agujero hace referencia a una tarjeta, siendo más bien una especie de bug, una rutina para superar una protección. Un paquete que cargue un 3M puede usar un agujero, como el hole 09, por ejemplo. Desde este punto de vista podemos considerar una secuencia de glitch como un agujero también. Los términos están un poco mezclados, pero sus métodos son completamente diferentes.

Existe un “agujero” en el software que permita a un programador ISO grabar en las tarjetas tipo HU?
Probablemente si, pero no es público, y si lo fuese rápidamente sería reparado por medio de un update.

Por qué las tarjetas HU son más fácilmente accesibles a través de un unlooper que de un programador?
Porque fueron diseñadas para tener su código protegido de un hacker casual, y el método del unlooper es más difícil de implementar debido al hardware implicado. Existen muchos secretos relativos a las tarjetas tipo HU, que no pueden ser difundidos al público en general porque serían tomadas contramedidas electrónicas (ECM’s) y nada de lo difundido funcionaría por mucho tiempo.

Códigos de comando para el Atmel del Unlooper

Un unlooper tipo WildThing envía diferentes variaciones de estos glitches a la tarjeta conforme a los comandos recibidos. El código del Atmel puede manipular 5 diferentes tipos de glitching:

Cmd 0A: Glitch de Clock. Aumenta el clock hasta 4x su valor normal durante 1/2 ciclo de clock normal. No usado para tarjetas tipo HU (GLA GX28/GX17 y SKY GL17/GL23), solamente en las tarjetas tipo H (GLA A/GX15 y SKY A/GL11).

Cmd 0B: Glitch de Voltaje. Baja el voltaje del valor DAC (Por ejemplo, “B080” baja a voltaje hasta 2,5v (5,0*&H80/256) durante ½ ciclo normal de clock. No usado para tarjetas HU/GX28/GX17/GL17. Este es el tipo de glitch usado para el "boot" de tarjetas tipo H (A/GX15/GL11) que estén con el área de inicio de la EEPROM dañada (tarjetas “black sunday”).

Cmd 09: Realiza el Glitch de voltaje y de clock simultáneamente durante 1 ciclo de clock completo. Usado como primer glitch en el proceso de carga de tarjetas HU/GX28/GX17/GL17.

Cmd 0C: Realiza el Glitch de voltaje y de clock simultáneamente, espera (delay) algunos ciclos de clock, y hace de nuevo glitch de voltaje y de clock simultáneamente. Usado como segundo e tercer glitch el proceso de carga de las tarjetas HU/GX28/GX17/GL17. Las versiones del código Atmel para tarjetas tipo H (A/GX15/GL11), o WT1, WT2 e WTX, no realizan el glitch de clock con este comando, solamente el de voltaje.

Cmd 0D: Realiza un Glitch de clock, espera (delay) algunos ciclos de clock, y entonces realiza el glitch de voltaje. Usado primariamente en el proceso de unlooping de tarjetas tipo H (A/GX15/GL11) por todos los programas de unlooper actuales.

[/QUOTE]
__________________
[center][url="http://cambialo.foroactivo.com/index.htm"][SIZE="4"][B]Visita mi Foro[/B][/SIZE] [/url][/center]
calpe19 está desconectado
Respuesta rápida a este mensaje
Subir