You are on page 1of 9

Miyamoto

Hack X Crack

Curso de ingeniera inversa


Aqu se inicia una serie de nmeros en los que yo, Miyamoto, intententar explicar y explorar los
diferentes campos de la ingeniera inversa con el fin de hacer comprender a los ms nuevos y no tan
nuevos todo el abanico de posibilidades que nos ofrece este apasionante campo dentro del grandioso
mundo del hacking de la forma ms sencilla, clara y bsica que pueda.
Comencemos por definir qu es la ingeniera inversa:
La ingeniera inversa consiste en la interpretacin funcionamiento de un software o un hardware
con el fin de comprender en su totalidad el funcionamiento del mismo.
Dos campos que cabe resaltar en la ingeniera inversa y a los que dedicaremos especial atencin son
los siguientes:
-Cracking, el ms conocido de todos, la eliminacin de restricciones de un programa mediante la
manipulacin del mismo.
-Anlisis de vulnerabilidades, al conocer un programa o un hardware a fondo conoceremos
tambin sus errores y defectos conel beneficio que eso pueda reportarnos.
Aunque por supuesto hay muchos ms, desde las famosas modificaciones que podemos realizar
sobre una consola de juegos, la indetectabilizacin de malware, el anlisis de malware, etc...
En este primer nmero nos dedicaremos a la comprensin terica de todos los conceptos requeridos
para efectuar la ingeniera inversa, reverse engineering o simplemente reversing, lo que nos lleva
desde la comprensin del hardware a la comprensin del software a todos los niveles.

Entendiendo el hardware
El hardware es la base sobre la que funciona cualquier sistema informtico, por tanto si nuestro
objetivo es entender el software en su totalidad deberiamos entender tambin la base sobre la que
est funcionando.
Lo que nos interesa exactamente a nosotros es la interaccin que se lleva a cabo desde el
procesador, la memoria RAM y la memoria del disco as como el estudios de sus componentes.
Por el momento hagamos una definicin bsica de cada elemento:
Procesador o CPU, es donde se llevan a cabo todos los clculos que permiten cualquier ejecucin
en el sistema, ms adelante veremos que clculos son estos exactamente.
Memoria RAM, es la memoria donde se almacenan todos los datos en uso, es decir, todo lo que el
procesador pudiera requerir pasar primero por la memoria RAM.
Memoria fsica o de almacenamiento, es el lugar fsico donde se almacena la informacin antes de
su paso por la memoria RAM, un medio donde guardar la informacin permanentemente para su
uso en prximas ejecuciones.

Miyamoto

Hack X Crack

Entendiendo el software
Si preguntasemos a una persona al azar qu es el sofware probablemente respondiera que es una
composicin de 1s y 0s, pero dificilmente nos sabria explicar como una simple combinacin de 1s y
0s puede realizar tares tan complejas como las que realizamos da a da.
Para entender el proceso diremos que esta agrupacin de 1s y 0s o cdigo binario, no es ms que
una agrupacin de datos e instrucciones que al ser tratadas por el procesador generarn una
respuesta determinada. A este juego de instrucciones propio de cada procesador lo llamaremos
ensamblador, assembler o simplemente ASM. Nosotros nos centraremos en la arquitectura intel de
32 bits que es soportada por la totalidad de ordenadores en el mercado. Qu significa que una
arquitectura es de 32 bits? Pues que las instrucciones enviadas al procesador lo hacen de 32 bits en
32, es decir, cada instruccin se compondr de 32 unos y ceros.
La velocidad a la que se realiza este proceso nos dar la frecuencia del procesador, si tienes un
procesador de 3GHz significa que cada segundo realiza 3.000 instrucciones (suponiendo que solo
conste de un nico ncleo)
Por qu 1s y 0s y no otro sistema como el decimal? Pues sencillo, una base binaria puede ser
codificada en impulsos elctricos, es decir 1 pasa corriente, 0 no pasa corriente.
Como se realizan estas operaciones a nivel de hardware? Usando lo que se denominan puertas
lgicas que no son ms que un componente electrnico con un nmero de entradas y salidas en el
que la salida depende de las entredas. Un procesador actual se compone de muchsimas de estas
puertas. Estas puertas realizan operaciones lgicas como AND, OR, o NOT entre otras. Como
puedes imaginar la AND devolver un 1 en la salida si todas las entradas son 1, la OR devolver un
1 si alguna de sus entradas es un 1, y en la NOT la salida ser el opuesto a la entrada.
Ms adelante se ver ms detenidamente el funcionamiento del software as como el juego
completo de instrucciones en ensamblador.

Conversin de datos
Aunque una mquina trabaje con cdigo binario a ti como persona no creo que te resulte agradable
calcular de esa manera, por eso es necesario aprender a trabajar con diferentes bases o en su defecto
tener la calculadora de windows a mano.
Para obtener un nmero decimal, por ejemplo el 425, lo que hacemos es multiplicar
inconscientemente 5 por 10 elevado a 0, sumarle 2 por 10 elevado a 1 y sumarle 4 por 10 elevado a
2. Con otras bases los nmeros se obtienen exactamente igual.
El nmero 101 en binario corresponde en decimal a 1 por 2 elevado a 0 ms 0 por 2 elevado a 1 ms
1 por 2 elevado a 2, es decir 5. "Solo hay 10 tipos de personas, los que saben binario y los que no".
En hexadecimal el nmero AB4 corresponde a 4 por 16 elevado a 0 ms 11 (ya que la B
corresponde a 11 en decimal) multiplicado por 16 elevado a 1 ms 10 por 16 elevado a 2, es decir
2740.
Para realizar el proceso inverso y transformar un nmero decimal a un nmero en otra base se
divide el nmero entre la nueva base (sin sacar ningn decimal) y nos quedamos con el resto, a
continuacin dividimos por la base el resultado de la primera operacin hasta dividir un nmero
menor a la base entre la base por primera vez, el nmero final es el compuesto por los restos
cogidos de derecha a izquierda. Por ejemplo pasar 10 d (la base se expresa con una letra detrs del
nmero) a binario: 10/2=5 con resto 0, 5/2=2 con resto 1, 2/2=1 con resto 0, 1/2=0 con resto 1, por
tanto el nmero 10 en binario es 1010b.

Miyamoto

Hack X Crack

25 a hexadecimal: 25/16=1 resto 9, 1/16=0 resto 1, por tanto 25d es igual a 19h (si algun resto fuera
mayor a 9 pondramos la letra correspondiente A,B,C,D o F)

ASCII
El cdigo ASCI nos permite codificar caracteres alfanumricos en 8 bits. A continuacin podeis ver
la tabla de equivalencias:
Dec. Hex. Caract
.
32
20
esp
33
21
!
34
22
"
35
23
#
36
24
$
37
25
%
38
26
&
39
27
'
40
28
(
41
29
)
42
2A
*
43
2B
+
44
2C
,
45
2D
46
2E
.
47
2F
/
48
30
0
49
31
1
50
32
2
51
33
3
52
34
4
53
35
5
54
36
6
55
37
7
56
38
8
57
39
9
58
3A
:
59
3B
;
60
3C
<
61
3D
=
62
3E
>
63
3F
?

Dec.
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

Hex. Caract
.
40
@
41
A
42
B
43
C
44
D
45
E
46
F
47
G
48
H
49
I
4A
J
4B
K
4C
L
4D
M
4E
N
4F
O
50
P
51
Q
52
R
53
S
54
T
55
U
56
V
57
W
58
X
59
Y
5A
Z
5B
[
5C
\
5D
]
5E
^
5F
_

Dec.
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127

Hex. Caract
60
`.
61
a
62
b
63
c
64
d
65
e
66
f
67
g
68
h
69
i
6A
j
6B
k
6C
l
6D
m
6E
n
6F
o
70
p
71
q
72
r
73
s
74
t
75
u
76
v
77
w
78
x
79
y
7A
z
7B
{
7C
|
7D
}
7E
~
7F


Para ahorrar espacio las equivalencias a cada caracter estn en decimal y hexadecimal que como ya
hemos dicho antes tienen una equivalencia en binario. Esta es la tabla que usan los ordenadores para
codificar cualquier texto en forma binaria ya que el binario es el nico cdigo implementable en un
sistema informtico.

Miyamoto

Hack X Crack

Pasando a la accin
Es hora de destripar algn programa:

Esto es un anlisis de un archivo realizado con OllyDbg, un debugger. Qu es un debugger? Un


debugger es un programa que nos permite seguir la ejecucin de otro paso a paso, es decir,
instruccin por instruccin. A primera vista vemos cuatro ventanas, por ahora fijmonos en la
ventana superior izquierda. Cada linea es una instruccin, subrayada tenemos la lnea que se va a
ejecutar y el valor numrico que aparece a la izquierda de cada instruccin es lo que se denomina
offset, la posicin de memoria en la que se encuentra dicha instruccin.
Pasemos ahora a explicar la ventana superior derecha. Esta contiene bsicamente dos cosas
interesantes, los registros del procesador y el estado de sus biestables o flags.
Los registros son los encargados de almacenar la informacin manejada por el procesador, en lugar
de actuar directamente sobre la RAM utiliza los registros para guardar varios datos del programa
como la prxima instruccin a ejecutar o la informacin necesaria para los clculos inminentes ya
que el acceso a los registros se realiza a mucha ms velocidad que a cualquier otra memoria externa.
Ms adelante nos encargaremos de ellos individualmente.
Los biestables o flags (banderas), son los encargados de suministrar informacin sobre los
resultados de la ltima operacin ejecutada. Su informacin es vital para los saltos, unas
instrucciones que veremos en breve. De momento basta decir que los biestables contienen un 1 o un
0 (dos estados como indica su nombre) deacuerdo a la ltima operacin matemtica realizada que
entre otras cosas nos permitir saber si un resultado a sido 0, si ha sido un nmero negativo, si ha
sido un nmero par, etc...

Siguiendo un programa con OllyDbg

Miyamoto

Hack X Crack

Para aclarar conceptos vamos a seguir un programa paso a paso con OllyDbg, aqu veremos su uso
y aprovecharemos para seguir profundizando. Antes de empezar sera conveniente que descargaras
los archivos necesarios, el propio OllyDbg y el programa que vamos a analizar.
- OllyDbg: http://www.ollydbg.de/odbg110.zip (Recomiendo el uso de esta versin)
- 1 Crackme, incluido en con esta entrega.
Empezamos con un crackme ya que nos permitir explicar un uso bsico de OllyDbg y la vez
tendremos un objetivo claro, crackearlo.
Iniciamos el debugger y nos apresuramos a abrir nuestro crackme, podemos hacerlo desde la
pestaa File o desde el icono con la imagen de una carpeta. Ahora nos fijamos en el offset en el que
inicia, si no empieza por 4 lo normal es que el programa no haya acabado de cargarse, si es as pulsa
F9 hasta llegar a la posicin deseada, el entry point, de aqu en adelante EP, el offset en el que se
inicia el programa.
Comandos bsicos:
Por ahora quedate con estos comandos, F9 para ejecutar el programa, F7 para ejecutar una
instruccin, F8 para ejecutar todo hasta la siguiente lnea (la diferencia entre F8 y F7 es que con F8
podremos ejecutar un CALL sin recorrerlo, ms adelante se detallar lo que son los calls o
llamadas)
Lo primero que vamos a hacer es buscar las cadenas de texto del programa, para ello te recomiendo
que primero ejecutes normalmente el programa para ver los datos que te da. El nico texto que
veremos es el que nos solicita una contrasea "Pass?".
Buscar las cadenas de texto en Olly es sencillo, click derecho sobre la ventana principal (la de las
instrucciones) y nos dirigimos a Search for > All referenced text strings. Despus de esto se nos
abrir una nueva ventana con una serie de offsets acompaados de una instruccin y una cadena de
texto. Para dirigirnos al desensamblado de una cadena hacemos click encima para marcar la cadena
deseada, hacemos click derecho y elegimos Follow in disassembler o pulsamos Enter. En este
programa en cuestin nos debera llamar la atencin dos cadenas, una la que nos pide el pass y otra
la que pone: Oh, shit! Cracked! que es la que se supone que aparece al introducir una contrasea
vlida. Sigamos en el desensamblado la primera para ver todo el recorrido desde que introducimos
texto hasta que nos devuelve un mensaje.

Miyamoto

Hack X Crack

Calls y saltos
Una vez aqu antes de seguir es indispensable explicar dos instrucciones, los calls y los saltos.
Como imagino que sabrs los programas no siguen una trayectoria lineal sino que realiza bucles y
ramificaciones que convierten al programa en algo ms que una simple ejecucin consecutiva de
instrucciones. Pues bien, como es lgico en ensamblador tambin hay instrucciones dedicadas a
estas acciones que en alto nivel seran las condiciones y bucles, son los saltos y calls.
Los saltos como su nombre indican hacen que el programa salte de una instruccion a otra
continuando su ejecucin a partir de ese nuevo punto. En ensamblador hay varias instrucciones
dedicadas a esto, los saltos y los saltos condicionales. La instruccin ms simple es la de salto que
en esnamblador es JMP seguido de la nueva direccin o offset a seguir. Los saltos condicionales
tienen la misma estructura con la diferencia de que dependen de una condicin. Como sabe el
programa si se cumple esa condicin? Pues mirando las flags. El salto que nos va a interesar ahora
es el JNZ (subrallado en amarillo en la imagen) Lo que har ser saltar si el flag Z indica que el
resultado de la ltima operacin matemtica ha sido 0.
Los calls realizan una funcin parecida al salto JMP con la diferencia de que recorren lo que
llamaremos una rutina completa y luego devuelve el flujo del programa al lugar desde donde se
llam al call. Cuando se usan los calls? Cuando una serie de instrucciones son ejecutadas desde
varios puntos del programa. Olly en este caso ha podido identificar que se tratan de funciones en C,
como podemos ver al lado ha colocado printf, scanf, strcmp, y getch.
Una vez aclarado esto estamos listos para empezar a analizar esta parte del cdigo pero antes de
empezar vamos a ejecutar todo el cdigo hasta esa zona. Linea por linea? No, para esta tarea
contamos con puntos de ruptura, BreackPoints (BP), que detendrn la ejecucin del programa al ser
encontrados por el debugger. Para poner un BP hemos de pulsar F2 teniendo marcada la lnea que
nos interes. Marcamos el lugar que nos ha mandado el Follow in disassembler y pulsamos F9 para
ejecutar el cdigo. Si todo ha ido bien se habr ejecutado todo hasta ese punto, ya podemos recorrer
instruccin por instruccin el cdigo que nos interesa.
Vemos una instruccin MOV, esta instruccin se encarga de mover datos de un lugar a otro, Olly
nos pone al lado que lo que mueve es la cadena "Pass?", y como abajo vemos un call que realiza la
funcin printf podemos suponer que simplemente se imprime esa palabra. Pasamos el call con F8 Y
llegamos a un grupo de instrucciones MOV y LEA, la instruccion lea es parecida a MOV, la
veremos ms tarde, de momento pasemos hasta scanf. En este punto el programa esperar a que
introduzcamos algo para continuar ejecutandose, bien, colocamos cualquier cosa y seguimos.
Avancemos hasta situarnos encima del call strcomp (la funcin strcomp en C compara dos cadenas),
una vez encima miremos los registrsos (en la ventana de la derecha) para ver a que datos va a tener
acceso la funcin strcomp, all encontrars el valor que introdujiste y el valor que el programa
acepta como vlido.
As de sencillo es? S, cuando los programadores reducen la autenticacin a una comparacin
directa es as de sencillo. Vamos a seguir jugando con este crackme.
Ahora vamos a parchear el programa para que siempre acepte cualquier serial como vlido. Si
sigues analizando el programa vers un JNZ y como explicamos salta si el resultado no ha sido 0. El
propio OllyDbg nos va a permitir modificar cualquier instruccin, y la instruccin opuesta a JNZ es

Miyamoto

Hack X Crack

JZ, Se te ocurre que pasar al cambiar uno por otro? El programa har justo lo contrario a lo que
el programador esperaba que hiciera!
Para cambiar una instruccin nos colocamos encima de ella y pulsamos espacio. Nos aparece una
ventana que nos permite editar la instruccin, pasamos JNZ SHORT 004012DE a JZ SHORT
004012DE pulsamos assemble y listo. Ahora siempre nos dir que acertamos, a menos que tengas la
mala suerte de introducir el serial correcto. Para evitar ese ltimo "problema" simplemente usa un
JMP en lugar de un JZ, lo importante por ahora es ir familiarizandose con el juego de instrucciones.
Por ltimo vamos a ver como guardar los cambios. Click derecho sobre la ventada de
desensamblado y elegimos Copy to executable > All modifications. Cerramos la ventana que nos
aparece y le damos a Yes en la advertencia que le sigue, guardamos el archivo modificado con el
nombre que queramos y listo, tenemos nuestro crackme parcheado.
Todos los programas se crackean as de fcil? Pues no, hay muchsimas formas de protejer un
programa complicndonos enormemente el trabajo. Pero tranquilo, poco a poco iremos viendo
como atacar protecciones ms duras, esto es solo el principio.

Otras herramientas tiles


De momento solo hemos visto el uso de un debugger pero por supuesto hay otras herramientas
indispensables.
Todo el que quiera dedicarse a la ingenieria inversa necesita como mnimo dos herramientas, un
desensamblador y un editor hexadecimal.
Un desensamblador no es ms que un programa que nos muestra las instrucciones en lenguaje
ensamblador de las que se compone un programa, a diferencia del debugger no nos permite su
ejecucin ni ver como cambian los registros y flags en tiempo real. Por que iba a querer usas un
desensamblador entonces? Pues cuando quieres analizar cdigo no ejecutable por tu mquina o si
simplemente quieres ver el funcionamiento general de un programa recurriremos a un
desensamblador. El desensamblador por excelencia es IDA, soporta multitud de arquitecturas.
En cuanto al editor hexadecimal nos permite ver la totalidad de los bits que componen un programa
o archivo, indispensable para editar informacin que no est relacionada con instrucciones o zonas
que se encuentran fuera de la zona de ejecucin como las cabeceras de un PE (mucho ms adelante
hablaremos de esto).

La pila
Ahora hablaremos de la pila o stack, en Olly lo podeis encontrar en la ventana inferior derecha. La
funciona exactamente como su nombre indica, como una pila de cartas, solo que en este caso es una
pila de datos. Que significa que funciona como una pila de cartas? Pues que cuando introduzcas un
valor lo colocars en la parte superior y cuando lo saques sacars el valor de la parte superior.
Contiene valores que el programa nacesitar ms adelante, estos son introducidos con las
instruccin PUSH y sacados con la instruccin POP seguidas del registro del que sacar o meter la
informacin. Normalmente se introducirn en la pila valores que se quieren conservar despus de la
ejecucion de un call, as como la direccin a la que ha de volver el programa una vez recorrido el
call.

Miyamoto

Hack X Crack

Cabe mencionar que cuando la direccin de retorno es sobreescrita por el programa se produce el
conocido desbordamiento del buffer con los riesgos de seguridad que eso pueda generar.

Tamao de datos
Estos son los nombres con los que se designan grupos de bits segn su tamao. Las cantidades de
datos que se manejan no son las que estamos acostumbrados ya que el tamao que se maneja en
ensamblador va desde 1 bit hasta 32 en la arquitectura x86
Bit -un 1 o un 0 en binario
Byte -ocho bits
Word -16 bits
Dword -32 bits

Algo ms sobre ensamblador


Empecemos a detallar las instrucciones ms importantes para ingenieria inversa:
-MOV: La instruccin mov se podra traducir por mueve a X el valor Y. Donde X es una posicin de
memoria. En ensamblador si queremos referirnos al contenido de una direccin de memoria hemos
de usar [ ] a cada lado del valor de dicha posicin. Por ejemplo, MOV DWORD [EAX], 0 movera
0 a la posicin de memria a la que apunta el registro EAX y no al registro en s (El tamao de los
datos a mover debe especificarse). Ejemplo 2, MOV WORD EAX, [EBX] movera al registro EAX
16 bits del contenido de la posicin de memria a la que apunta el registro EBX.
-LEA: Realiza una funcin muy parecida a MOV, mueve a un registro un valor pero a diferencia de
MOV, LEA nunca accede a posiciones de memoria, por ejemplo LEA EAX, [EBP-8] movera a
EAX el resultado de restar 8 al valor de EBP. Como habrs visto LEA permite realizar operaciones
sobre el valor a mover, esto aporta una ventaja sobre MOV pero trae el inconveniente de no poder
acceder a posiciones de memoria.
-ADD: Suma dos valores y almacena el resultado en el registro que contiene el primer valor. Por
ejemplo, ADD EAX,1 sumara uno al valor de EAX
-SUB: Resta dos valores y almacena el resultado en el registro que contiene el primer valor.
-INC: Aumenta en 1 el valor de un registro. Por ejemplo INC EAX aumenta el valor de EAX en 1.
-DEC: Reduce en 1 el valor de un registro.
-AND: Realiza la funcin lgica AND entre dos valores.
-OR: Realiza la funcin lgica OR entre dos valores.
-XOR: Realiza la funcin lgica XOR entre dos valores.
-CMP: Esta instruccin suele preceder a un salto condicional, su funcin es restar dos valores con el
fin de cambiar las flags del procesador. El resultado no ser almacenado.
-TEST: Realiza la misma funcin que un CMP, con la diferencia de realizar una operacin AND en

Miyamoto

Hack X Crack

lugar de una resta.


-NOP: no hace nada, salta a la siguiente instruccin, se usan para rellenar espacio al eliminar una
instruccin o simplemente si queremos que el programa al pasar por ah pase a la siguiente
instruccin.

APIs
Antes de que sigamos es necesario comprender el concepto de API. Una API es un conjunto de
funciones que pueden ser usadas por otro software. Para que nos entendamos, las conocidas
librerias de Windows como kernel32 o ntdll son APIs que permiten a los programas ejecutados bajo
Windows ejecutar ciertos cdigos. Por ejemplo:
Cuando un programa muestra un MessageBox, enrealidad no ha generado l el mensaje sino que ha
llamado a la libreria para que ejecutara el MessageBox con unos parmetros determinados como el
ttulo de la ventana, el mensaje y los botones.
Para el que no sepa lo que es un MessageBox, es esto:

Por qu se hace esto? Pues muy sencillo, las APIs son fragmentos de cdigo utilizadas por casi
todos los programas, resulta mucho ms sencillo contener el cdigo en un solo archivo y llamarlo
cuando sea requerido. Esto a la vez de ahorrar espacio en el disco facilita enormemente la
programacin de software. Otro ejemplo, la mayora de programas ejecutan un Form (La clsica
ventana de Windows).
De qu nos sirve a nosotros? Nos ser de gran ayuda identificar las llamadas hacia APIs que
realizan los programas para identificar la zona de que buscamos ya que no siempre nos ser posible
identificar cadenas de texto. Ms adelante se vern ejemplos prcticos.

www.hackxcrack.es

You might also like