Make your own free website on Tripod.com

Assembly y Cracking Elemental 1

Original en Inglés por Greythorne the Technomancer

Traducido al castellano por eidan yoson

  

Introducción a numeración binaria y hexadecimal

 


En general, la matemática diaria es base 10 (decimal), aunque la tendencia de los constructores de PCs fue usar base 2 (binario).

El binario fue la elección simplemente porque OFF y ON son términos fáciles en electrónica y este modelo encaja bien con 1's y 0's.
En algún momento, alguien decidió que continuar con numeración binaria era algo tedioso para los humanos y se propuso que los números se vean parecidos a los de la aritmética decimal, pero conservando la progresión con potencias de 2 para que la conversión a binario sea fácil.

De esta forma se popularizó el hexadecimal (base 16).
Qué tiene esto que ver con crackers o programadores assembly? TODO. Si no se comprende cómo operar con hexadecimales y cómo convertir entre binario y hexa, es imposible depurar (reversar) cualquier programa.
En cualquier sistema de numeración, siempre se sigue esta simple regla: en una base B, los dígitos se numeran desde cero hasta B-1

Que significa lo anterior?, por ejemplo que en base 10 tenemos diez dígitos, del 0 al 9. En binario tenemos sólo dos: 0 y 1, y para base 16 (hexa) tenemos 16 dígitos. Por simplicidad, se usan los números del 0 a 9 y las seis primeras letras del alfabeto.

0 1 2 3 4 5 6 7 8 9 A B C D E F


(estos dígitos valen 0-15 al convertirlos al sistema decimal)

la cuenta es similar a la del sistema decimal:

... E F 10 11 12 ... 18 19 1A 1B 1C 1D 1E 1F 20 21 22 ...

10 en hexa es 16 decimal, 20 hexa es 32, 30h es 48, 40h es 64 etc.

Una cuenta en sistema binario sería como sigue:

0 1 10 11 100 101 110 111 1000...

Asi 10 (en cualquier base) siempre es igual a B, la base misma - Equivale a decir que 10 (binario) is 2 decimal, 10 (octal) es 8 decimal, etc

Bien, si yo tuviese 16 dedos podría sacar la cuenta como lo hacen los niños, pero como no los tengo, cómo calcular cuánto es A9h en base 10?

Ya sabemos que base 16 se amolda a potencias de 2, lo que no es difícil de manejar. Una vez que uno aprende a convertir un número a binario, es fácil cambiar de base a cualquier número, haciéndolo en dos etapas: primero se convierte de una base a binario y luego de binario a la otra.



Conversión de Decimal a Binario

A esto me gusta llamarlo 'matemática del resto'.

Básicamente, en lugar de una suma repetida, contando hasta un dígito hexa, usaremos división repetida para acelerar el proceso.


Nuestros amigos DIV y MOD

En computación, los datos se almacenan como números enteros, ya sea como una larga serie de dígitos en cualquier base más la ubicación del punto decimal (o para hablar generalmente para cualquier base, el punto raíz), o como partes de una fracción (numerador, denominador y cantidad a sumar en tres partes separadas). Hay por cierto otros métodos con números imaginarios, pero esto cae fuera de los límites de esta lección.


Usando números enteros, la división se hace tal como lo hemos aprendido en base 10, de a un dígito por vez y recordando el resto de cada etapa. Para cada operación de división, tenemos 2 respuestas: el cociente (DIV) y el resto (MOD). Aunque estamos más familiarizados con DIV, MOD tiene interesantes propiedades usadas en programas de computación, específicamente en randomización y scroll de menús.

Usaremos como notación 47 MOD 4, o 47%4 cuando queramos decir "dividir 47 por 4 y obtener el resto", ya que el signo "%" se usa como símbolo para MOD en lenguajes de alto nivel como el C.

para nuestro caso: 47/4 = 11, resto = 3

DIV = 11, MOD = 3

y también: 47%4 = 3 (47 MOD 4 es igual a 3)

Con estos conocimientos podemos comenzar con la conversión de bases entre decimal y binario (no es tan feo, no se preocupe).
Quisiera que primero conozca que 47 en binario es 101111. Ahora voy a mostrarle como deducirlo matemáticamente.
Básicamente, dividimos en forma repetitiva nuestro número por la base binaria (2) y tomamos cada MOD (resto) como el próximo dígito binario.

47 / 2 nos dá DIV=23 MOD=1, string binario = 1
23 / 2 nos dá DIV=11 MOD=1, string binario = 11
11/2 nos dá DIV=5 MOD=1, string binario = 111
5/2 nos dá DIV=2 MOD=1, string binario = 1111
2/2 nos dá DIV=1 MOD=0, string binario = 01111
1/2 nos dá DIV=0 MOD=1, string binario = 101111

Note que el string se construye de derecha a izquierda, al revés de cómo uno lee. Esta es una característica del sistema de numeración arábigo que incrementa el valor de los dígitos de derecha a izquierda
Esto puede parecer tonto en un principio, pero las máquinas requieren tal nivel de instrucción para hacer aquello que nosotros sabemos hacer desde hace tanto que olvidamos los basamentos de lo que es un número: supongamos el 2041; lo tomamos en su totalidad, pero sabemos muy bien que el 2 tiene mucho más valor que el 4 o el 1. En cambio las computadoras requieren hacer esto de a pasos.

Escribiremos un programa en pseudocódigo (una mezcla de lenguaje cotidiano con lenguaje de computación). Es de gran ayuda escribir en pseudocódigo antes de pasar el programa a un lenguaje concreto.

Viendo nuestro anterior ejemplo, podemos determinar cuándo se cumplió la operación consultando si DIV = 0. Nuestro programa sería:

  1. Obtener el valor DIV (del usuario o del mismo programa)
  2. Dividir DIV por 2, dejar el cociente en DIV y el resto en MOD
  3. Almacenar MOD como próximo dígito de un string RES
  4. Repetir las acciones 2 y 3 hasta que DIV = 0 (inclusive)
  5. Informar el resultado RES

 

Conversión de un número binario a hexadecimal

Como 24 = 16 cada 4 dígitos del string binario, tendremos un dígito hexa. Notar que también aquí hay que ir de derecha a izquierda como en las operaciones con números decimales. Usando nuestro ejemplo del 47:

101111

Lo separamos en grupos de a 4:

10 | 1111

Y ahora consultamos la siguiente tabla de conversión:

0000 = 0 ........ 1000 = 8
0001 = 1 ........ 1001 = 9
0010 = 2 ........ 1010 = A
0011 = 3 ........ 1011 = B
0100 = 4 ........ 1100 = C
0101 = 5 ........ 1101 = D
0110 = 6 ........ 1110 = E
0111 = 7 ........ 1111 = F

Por lo que nuestro número (10 | 1111) , se convierte en:
0010 = 2h y 1111 = Fh

por demás simple, 101111 es 2F en hexadecimal o, más rigurosamente:

47 (dec) = 101111 (bin) = 2F (hex)

Si por ejemplo quisiésemos convertir a base octal, debemos separar de a tres bits, o sea que para el 47 decimal hacemos:


101 | 111

111 = 7
101 = 5

47 (dec) = 101111 (bin) = 2F (hex) = 57 (oct)

Ahora que usted conoce las relaciones entre las bases, le será mucho más fácil leer código assembly, y posiblemente en un futuro próximo, comenzar a entender qué está leyendo

 

+gthorne'97


 

                                              

Principal                         Tutoriales                       Próximo

 


Miguel Alcazar - eidan yoson - maffy - whoami - MonjE GriS - santana - superplusultra

Lea nuestro DISCLAIMER y el de +fravia

® ECCE : todos los derechos reversados. Se autoriza la copia de la información aquí contenida siempre que no se altere y se cite la fuente

 

PRESENTACION DEL TUTORIAL

PAGINA  PRINCIPAL

PROXIMA PAGINA del TUTORIAL