Anda di halaman 1dari 61

con ejemplos.

Sitio Web: http://www.resrever.net

Contacto: chr1x@resrever.net

ltima actualizacin: 28/10/2012

Pwneando Ensamblador (con Ejemplos) by Christian Navarrete is licensed under a Creative


Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported License .

1
Agradecimientos

Quiero dar las gracias principalmente a Ricardo Narvaja que aunque no tengo el gusto de
conocerlo fue mi inspiracin para realizar este e-Book. Son ese tipo de personas que regala
todo su conocimiento sin esperar nada a cambio.

De igual modo quiero agradecer a la Mexican g4ng-bang, a mis grandes amigos desde hace
ya muchos aos con los cuales he pasado muy buenos momentos a su lado, buenos, malos,
pero siempre juntos, y ellas son (por orden alfabtico, para no herir sentimientos XD)

Lilith
alt3kx
b0rr3x
b3ck
calderpwn
chipx0r
ch0ks
Carlos Ayala
Daemon
Dex
Despise
hkm
hecky
nitr0us
NataShell666
preth00nker
r1lx0r
Raito

y a toda la lista interminable de amigos y seguidores de Twitter.

Gracias!

2
Contenido
Introduccin ........................................................................................................................4
Por qu aprender Ensamblador?......................................................................................4
Por qu Ensamblador e Ingeniera Inversa de Cdigo (RCE)?..............................................4
Temas y Objetivo..............................................................................................................6
Notas finales ....................................................................................................................6
Requerimientos....................................................................................................................7
Instalacin de MASM32 ........................................................................................................7
Instalacin y Configuracin de WinAsm Studio .......................................................................8
Comprobacin de funcionamiento: WinAsm Studio y MASM32...............................................9
Instalacin de Visual C++ 2005 Express ................................................................................11
Instalacin de Cygwin (Compilador gcc) ...............................................................................12
Instalacin y Configuracin de OllyDBG ...............................................................................14
Instalacin de IDA Freeware................................................................................................17
Importancia del dominio de las Herramientas ......................................................................19
Conociendo la interfaz y funcionamiento de OllyDbg ............................................................19
Conociendo la interfaz y funcionamiento de IDA Dissassembler ............................................37
Estructura de un Programa en Ensamblador ........................................................................50
Entendiendo los Registros del CPU ......................................................................................52
Aprendiendo el Set de Instrucciones x86..............................................................................52
La instruccin - INC.............................................................................................................52

3
Introduccin
Como dira mi hermano @r1lx0r... Endlzame el odo y convnceme de utilizar
Ensamblador. Bien, pues aqu va mi sp33ch!

Como muchos ya lo saben y para los que apenas se enteran, este es un nuevo proyecto
el cual he querido realizar desde hace ya hace bastante tiempo y heme aqu, tomando
una copa de vino tinto chileno escuchando mi cancin favorita de Hall & Oates Out
of touch y decidido a escribir el inicio de esta historia. Hehe, en fin, aqu vamos

Por qu aprender Ensamblador?


ENSAMBLADOR. Si, y con letras MAYUSCULAS. Sin duda es una palabra a la cual se le
merece un profundo respeto. Es una palabra que a muchos causa miedo, y temo decir
que es correcta dicha apreciacin, sin embargo, no es tan rudo como parece.

El problema con el lenguaje ensamblador es que la gente que hoy en da se encuentra


interesada en aprender ensamblador se topa de primer instancia con la falta
informacin acerca de cmo programar en este lenguaje, aunado a la poca
informacin existente que es muy obsoleta Ensamblador para DOS?-. Ya no es como
hace muchos aos, en los cuales exista mucha informacin al respecto, la escena en su
mximo esplendor la Phrozen Crew, el grupo 29a, Fravia y +ORC mucha gente en
especial los Argentinos y Espaoles- le pegaron dursimo a todas aquellas artes
oscuras y que hoy en da, an permanecen hacindolo. Personalidades como Ricardo
Narvaja, Nahuel Riva, Rubn SantaMarta, Dave Aitel, o Gerardo Richarte son algunos
de los nombres figuran en este campo. Ahora, uno tiene que arreglrselas por su
propia mano y tratar de encontrar el mximo de recursos para poder aprenderlo tan
bien y como se haca en esos aos. Ese ha sido el reto que me ha orillado a iniciar con
este proyecto, ya que como se imaginan, pas por el mismo problema y decid hacerle
la vida menos pesada a la gente interesada en este tema.

Por qu Ensamblador e Ingeniera Inversa de Cdigo (RCE)?


La respuesta es muy simple y obvia. No me dejarn mentir aquellas personas que al
igual que yo hemos tenido una larga trayectoria en la cuestin de seguridad.
Lamentablemente se nos ha orillado a ser los Sabelotodo y muy pocas veces uno que
otro ha logrado especializarse en un tema en particular.

En mi caso, buscando algn rea que pudiera considerar como un real challenge
algo que sobresaliera de las dems reas en el cual todos son expertos. Sabemos que
cualquiera pueda explotar un SQL Injection, descargar y compilar exploits, Defacear un
sitio Web o utilizar Frameworks de explotacin, pero pocos pueden
entender/programar en Ensamblador y muy pocos pueden realizar Ingeniera Inversa.
Aqu la diferencia.

4
Hoy da he llegado a la conclusin de buscar dicha especializacin, es por eso que me
he decidido el enfocar mi carrera profesional al estudio y al mastering del arte del
RCE.

Hablemos un poco de aquellos temas que utilizan Ensamblador e Ingeniera Inversa.

Malware - Sabemos que se pueden utilizar lenguajes de programacin de Alto nivel


para hacer un simple virus, es ms, un simple script podra ser un virus. Ja! Pero en
dnde queda Ensamblador? Bien, pues en aquellos aos muchos de los virus que se
han creado han sido en lenguaje ensamblador y esto es simplemente por la capacidad
que tiene el propio lenguaje que en conjunto la integracin y uso de los recursos del
sistema operativo permita realizar tareas a un nivel muy bajo y por lo cual tener la
capacidad de ejecutar tareas muy especficas, tareas con las cuales probablemente con
un lenguaje de alto nivel sea un poco ms difcil. Un ejemplo prctico y puntual.
Muchos de los virus que han sido creados en lenguajes como C++, VB o .NET -por
mencionar algunos-, hacen referencia y uso a ciertas libreras que no son nativas del
S.O., lo cual desde el punto de vista de un malware developer, no sera muy prctico
en cuanto a la dependencia del propio virus al utilizar dichas libreras. Para qu
utilizar libreras si puedes hacer uso de la API del S.O. con ayuda de Ensamblador? Si
bien es cierto se pueden llamar o generar rutinas de Ensamblador dentro de cdigo de
otros lenguajes, pero bueno, esa es otra historia.

Cracking Estoy seguro les suena conocido. Como sabrn de igual modo se requiere
conocimiento de lenguaje Ensamblador para poder meterse a esta actividad y
probablemente un poco acerca de otros lenguajes, por aquello de crear algn Keygen
o alguna herramientilla por ah. La ventaja del Cracking es que existen an material no
tan anticuado el cual tocan temas acerca de cmo auto-entrenarse utilizando
programas Crackme. Cmo entra en accin Ensamblador en esta rea? Sencillo. Si
en algn momento te has bajado un Tuto de cracking, supongo que te suena familiar el
nombre de la herramienta Ollydbg, pues bueno, para utilizarla necesitas saber
Ensamblador, por lo menos lo bsico, sin embargo, si estas tomando este asunto
enserio entonces debers de incrementar tu conocimiento en Ensamblador al mximo
nivel. Siempre es divertido estar jugando en el Lado oscuro de la fuerza, sin embargo
existen grandes riesgos con la cuestin de crackear software comercial por lo que hay
que irse con cuidado con este tema.

Vulnerabilidades Oh yeah baby! - Cuando hablamos de descubrir vulnerabilidades


sabemos que existen diferentes mtodos y tcnicas para llevarlo a cabo. Es aqu donde
palabras como Fuzzing, Anlisis Dinmico/Esttico o Auditora de Cdigo entran en
accin, sin embargo la mejor forma y tal vez no la ms trivial- de encontrar
vulnerabilidades es a travs del Anlisis Binario. Compaas como Secunia, VUPEN,
CORE Security o Immunity Inc. son algunas de las empresas que utilizan gran parte del
conocimiento de lenguaje ensamblador para poder realizar este tipo de actividades.

5
Actividades que van desde el reversing de Software as como el de la realizacin de
exploits para aprovecharse de dichas vulnerabilidades. Si lo que estas buscando es una
carrera formal en RCE, encontrar vulnerabilidades 0-day en Software de alto perfil y
probablemente ser entrevistado en algunas revistas, definitivamente tienes que
dominar Ensamblador como primer prioridad.

Como se habrn dado cuenta, Ensamblador es una pieza esencial para la rea lizacin de
este tipo de actividades, afortunadamente todas las herramientas pueden ser
utilizadas y combinadas- acorde a tu necesidad. Por ejemplo; podras utilizar OllyDBG
para realizar un anlisis dinmico de tus muestras de malware, si ests dispues to a
tomar el reto de resolver un Crackme o en su caso utilizarlo para analizar un software
en busca de vulnerabilidades. As que si te especializas en una herramienta, estars
matando dos pjaros de un tiro o ms.

Temas y Objetivo
Esta es una pregunta interesante. Planeo cubrir temas relacionados a RCE,
Ensamblador x86/IA32 (principalmente) en plataforma Windows (Win32), Linux
(POSIX) y algunas otras arquitecturas, y muchas cosas ms. Sin embargo, conforme
vayamos avanzando es como iremos cubriendo dichos temas.

El objetivo es obvio... APRENDER. T sabrs como utilizar el conocimiento. Manejar


un esquema de adquisicin del conocimiento de manera emprica ms prctico que
terico, o lo que es lo mismo, aprenderemos la teora sobre la prctica. Si tienes
conocimiento en el tema y deseas ayudar, bienvenido(a).

Notas finales
No me considero ni creo ser un experto en el tema, por lo cual el contenido de esta
serie de posts podran contener algunos errores por lo cual cualquier sugerencia es
bienvenida. Para las crticas no-constructivas, ahrrense su tiempo. Como dicen... Si no
ayudas no estorbes. Sin ofender.

Quiero agradecer de antemano a todos aquellos amigos con los que hemos pasado
grandes momentos desde hace ya muchsimos aos.

Para concluir con esta entrada me gustara dejar unas palabras de +ORC...

"Give a man a crack, and he'll be hungry again tomorrow,

teach him how to crack, and he'll never be hungry again".

Enfoquen la fuerza de este mensaje a donde ustedes deseen.

Bien, el momento ha llegado. Es tiempo de que empecemos a poner manos a la obra.

6
Antes que nada, asumo que ustedes

1. No tienen problema con el idioma Ingls Esto es esencial ya que *casi* toda
la informacin disponible se encuentra en este idioma.
2. Manejo y entendimiento bsico de programacin con ANSI C/C++ o algn otro
lenguaje de Alto nivel, as como el uso de sus respectivos compiladores.
3. Tienen experiencia trabajando con Mquinas Virtuales Requeriremos de un
entorno virtual para poder trabajar durante todas las sesiones.

Requerimientos
Hasta este momento deben contar con lo siguiente:

1. Mquina virtual con Windows XP (de preferencia sin Service Pack). No importa
si utilizan VMWare o VirtualBox. En lo personal recomiendo VirtualBox ya que
como saben es gratuito y se evitan problemas futuros con respecto a
actualizaciones y similares.
2. Haber descargado el Software que se encuentra en la siguiente direccin:
http://www.resrever.net/p/software.html . OJO: Solamente descargado (no
instalarlo). Hay algunas adecuaciones que tendremos que realizar a la
configuracin del software para que puedan interactuar entre ellos sin ningn
problema. El proceso de instalacin/configuracin, dependiendo el caso los
estaremos cubriendo en las siguientes secciones.

Instalacin de MASM32
Amonos Rickys! Es hora de instalar el corazn de todo este asunto de
Ensamblador y me refiero al Compilador y Linker los cuales nos permitirn
convertir nuestro cdigo en Ensamblador a un hermoso archivo ejecutable.

Pasos a seguir:

1. Descargar el archivo .zip (masm32v11r.zip) que contiene MASM32.


2. Ejecutamos el instalador (install.exe)
3. Seguir el wizard, no hay pierde, hasta concluir con la instalacin.
4. Confirmar que el path al final de la instalacin sea: C:\masm32.
5. Al finalizar, se ejecutar automticamente el IDE que trae por default
MASM32. No se espanten! Sabemos que no es muy agraciado y por lo cual
utilizaremos un IDE que nos inspire programar en Ensamblador.

7
Instalacin y Configuracin de WinAsm Studio
Para poder generar nuestro cdigo en ensamblador vamos a requerir de un IDE. El
IDE que eleg para trabajar es WinAsm Studio y prcticamente cuenta con una
Interfaz muy accesible e intuitiva. Una de las mejores caractersticas de este
software es que ya est configurado para trabajar con MASM32 (Compilador y
Linker) y de igual modo ya tiene una integracin con OllyDbg el cual nos ser de
gran utilidad en las prcticas posteriores.

Pasos a seguir:

1. Descargar el archivo .zip (WinAsm515Full.zip) que contiene WinAsm Studio.


2. Descomprimir el contenido en c:\WinAsm.
3. Ejecutar el IDE (WinAsm.exe).
4. Creen un nuevo folder en el cual vamos a ir guardando todos los programas que
vayamos generando. En mi caso es c:\reversing.
5. En el men Tools => Options => Files & Paths vern que el IDE ya trae configurados
los paths de MASM32 y del propio WinAsm.
6. En la seccin Projects Path, den click y seleccionen c:\reversing.

Como nota adicional. Recuerden que deben respetar los paths de las herramientas y
no crear folders especiales para de este modo no experimentemos algn problema
despus.

Ahora, en la pestaa Miscellaneous veremos que de igual modo que OllyDbg es el


debugger por default del IDE.

8
Comprobacin de funcionamiento: WinAsm Studio y MASM32
Perfecto! Hasta este momento tenemos el Compilador, Linker y nuestro IDE instalados. Ahora,
probemos que no hay ningn problema y generemos un pequeo programa de prueba.

Para algunos se les har conocido el ya famoso programa de prueba de programacin en


Ensamblador para Win32 de Iczelion. Bueno, pues ste mismo ser el que utilizaremos.

Pasos a seguir:

1. Abran WinAsm Studio.


2. En el men, File => New project, seleccionen: Standard Exe

3. Copien el siguiente cdigo a WinAsm Studio:

9
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
MsgBoxCaption db "Resrever.Net",0
MsgBoxText db "Ensamblador r0x!",0

.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption,
MB_OK
invoke ExitProcess, NULL
end start

Y guarden el archivo como: c:\reversing\programa1.asm

4. Den click en el men: File => Save Project As y les pedir que asignen un nombre al
proyecto. Pueden utilizar el mismo nombre del proyecto para su programa.

5. Ahora vayan al men: Make => Go All o la combinacin de teclas: Shift + F8 para
compilar y linkear el cdigo ensamblador. Posterior a esta accin aparecer de
forma automtica la siguiente ventana:

10
Nice, eso quiere decir que nuestra instalacin de WinAsm Studio y MASM32
est trabajando a la perfeccin. Si a este momento a ustedes no les apareci la
pantalla anterior, verifiquen que paso omitieron.

Finalmente, nuestra carpeta c:\reversing debe lucir de la siguiente manera:

Se preguntarn en este momento que significa todo ese cdigo que pegamos
en WinAsm Studio, pues bien, no se preocupen ya que explicaremos la funcin
de cada uno y de igual manera agregar ligas a sitios en donde profundizan en
la estructura del programa, opciones de configuracin y dems. El objetivo de
este paso fue bsicamente verificar que todo este correcto y en perfecto orden.

Instalacin de Visual C++ 2005 Express


Otro de los componentes esenciales es el compilador de C++. Vamos a utilizar esta
herramienta para generar pequeos programas en C que al momento de compilarlos podamos
de igual modo generar su respectivo cdigo en Ensamblador. Esto es muy interesante ya que
podremos visualizar un mismo cdigo desde dos perspectivas (lenguajes) diferentes.

11
Pasos a seguir:

1. Descargar el archivo .exe (vcsetup.exe) que descargar los archivos


necesarios para instalar Visual C++ 2005 Express.
2. Instalamos el compilador.
3. Terminamos. La etapa de configuracin la realizaremos cuando vayamos a
generar el primer programa en C/C++.

Instalacin de Cygwin (Compilador gcc)


Cygwin es bsicamente un paquete que simula el entorno UNIX/Linux bajo Windows. A lo largo
de las prcticas nos encontraremos con la necesidad de utilizar el compilador gcc que al igual
que con Visual C++ generaremos cdigo C y al mismo tiempo generando cdigo Ensamblador
pero ahora con una ventaja ms; en sus diferentes sintaxis: Intel y AT&T.

Pasos a seguir:

1. Descargar el archivo .exe (setup.exe) que descargar los archivos necesarios


para instalar Cygwin.
2. Continuamos la instalacin normalmente.
3. Al momento de que nos pida seleccionar los paquetes; en el campo
Search vamos a escribir: gcc y dentro de Devel damos doble click en
gcc-core: C compiler como lo muestra la siguiente pantalla:

4. La siguiente ventana nos indicar las dependencias de gcc-core (binutils,


gcc-mingw-core, etc.). Dejamos la opcin default y continuamos.

12
5. Al finalizar, nos presentar una pantalla preguntando si queremos generar
los iconos de acceso directo, dejamos seleccionadas dichas opciones y
finalizamos la instalacin.
6. Veremos que en el Escritorio ya tenemos el acceso directo a Cygwin y
accedemos a l.

7. Al entrar en la Shell de Cygwin, vamos a teclear: gcc v para confirmar


que el compilador gcc ha sido instalado correctamente. En caso afirmativo
veremos una pantalla igual a la que se muestra a continuacin:

13
Instalacin y Configuracin de OllyDBG
OllyDbg es una herramienta De facto en la cuestin de debuggear aplicaciones y
hay muchas reas que hacen uso de ella. Por ejemplo; los analistas de Malware las
utilizan para realizar un anlisis dinmico de sus muestras (samples). Los crackers
lo utilizan para identificar los puntos de entrada de datos (inputs) o para analizar
o tratar de identificar- los algoritmos utilizados para la proteccin de un software...
los security researchers quienes de igual modo lo utilizan para identificar el punto
de quiebre de un software y de este modo determinar el fault que les permitir
de algn modo controlar dicho comportamiento y convertirlo posteriormente en
una vulnerabilidad explotable. Interesante no? Bueno, OllyDbg es nuestro mejor
amigo desde este momento.

Pasos a seguir:

1. Descargar el archivo .zip (odbg110.zip) que contiene OllyDbg.


2. Extraer el contenido del archivo en c:\OllyDbg.
3. Aparecer una ventana mostrando lo siguiente:

Simplemente den click en Si para continuar. Esto es simplemente para decirle a


OllyDbg cual DLL utilizar, si la propia de la herramienta o la del SO.

4. Den click en el menu: Options => Just in-time debugging

5. Den click en las opciones: Make OllyDbg just-in-time debugger y en


Confirm before attaching y posteriormente click en el botn Done.

14
6. Den click en el menu: Options => Add to Explorer.

7. Den click en las opciones: Add OllyDbg to menu in Windows Explorer y


posteriormente click en el botn Done.

15
Esta accin permitir agregar al Explorador de Windows agregar un men para
que podamos abrir cualquier ejecutable utilizando el debugger.

8. Den click en el menu: Options => Debugging options.

En la pestaa CPU habiliten las opciones tal como son mostradas con el
marcador amarillo en la imagen.

16
Esta accin permitir a OllyDbg mostrarnos la ruta de los llamados utilizando
los CALLS de ensamblador, lo cual nos permitir trazar los saltos en el
cdigo.

Con esto concluimos con la personalizacin de la configuracin de OllyDbg.


Cabe mencionar que OllyDbg tiene la posibilidad de utilizar varios plug-ins.

En posteriores cursos vamos a ver cmo es que agregamos plug-ins a


OllyDbg, como utilizarlos y con qu objetivo. Por el momento para la
finalidad que estamos buscando en este documento es ms que suficiente.

Instalacin de IDA Freeware


Para los que ya tienen un poco de experiencia en el RCE el nombre de IDA se les
har muy conocido. Pues bueno, para los que no lo conocen IDA es un software
que es utilizado por mucha gente, tanto para los investigadores de cuestiones de
seguridad, analistas, ingenieros, etc. IDA es comnmente nombrado como IDA
Pro el cual es bsicamente la versin comercial/profesional de dicho software.
Afortunadamente existe una versin Freeware que es la que utilizaremos.

Pasos a seguir:

1. Descargar el archivo .exe (idafree50.exe) que contiene IDA Freeware.


2. Continuar con el proceso de instalacin tradicional.
3. Al trmino de la instalacin, ejecutamos el programa y nos deber mostrar
la siguiente pantalla:

Existen excelentes tutoriales y libros acerca del uso de la interfaz de IDA Pro, de
OllyDbg y prcticamente de todo el software que estaremos utilizando. Pueden
encontrar dichos recursos en el apartado Referencias en mi sitio web.

17
Les sugiero que visiten la seccin antes mencionada ya que siempre es bueno de cierto
modo dominar la interfaz de las herramientas que estemos usando, esto nos
permitir una mayor flexibilidad y facilidad de acceso a ciertas funcionalidades del
programa mientras nos encontremos manipulando archivos ejecutables.

Hasta este momento ya tenemos los componentes necesarios para irnos con todo a
aprender Ensamblador, recapitulemos:

1. WinAsm LISTO
2. MASM32 LISTO
3. Visual C++ 2005 LISTO
4. Cygwin LISTO
5. OllyDbg LISTO
6. IDA Freeware LISTO
7. Fuerza y Ganas LISTAS! ;)

Y bien... Seores pasajeros, sean tan amables de abrocharse sus cinturones que ya
estamos por empezar lo bueno. Hehehe.

18
Importancia del dominio de las Herramientas
Para poder llegar a ser experto en un rea en especfico debers dominar las
herramientas, es por ello que como ya hemos mencionado anteriormente, OllyDbg
e IDA sern *casi* nuestras herramientas principales y es por ello que veremos de
primer instancia como dominarlas para posteriormente no tener problemas con su
uso cuando ya estemos entrado en materia fuerte.

Conociendo la interfaz y funcionamiento de OllyDbg


Como ya muchos de ustedes saben, hay algunas guas que explican acerca de la
interfaz de OllyDbg sin embargo voy a intentar reinventar la rueda, pero tampoco
explicare a tan Alto nivel ya que probablemente hay personas que estn leyendo
este documento que nunca han visto tales guas, as que comencemos.

Para familiarizarnos con la interfaz de OllyDbg vamos a utilizar el programa de


prueba (programa1.exe) que generamos al inicio de este libro.

1. Vayan a la carpeta c:\reversing


2. Click derecho en programa1.exe y Open with OllyDbg.

1. Barra de Botones Estos botones son la parte principal de la herramienta, ya que


desde aqu nos permitir el acceso a diferentes funcionalidades que nos ayudarn
a explorar el ejecutable que hayamos cargado.

De izquierda a derecha, accedamos a cada una de ellas:

1. - Esta funcionalidad nos permite ver cules son los mdulos o dlls-
cargados por nuestro programa ejecutable entre otras cuestiones
relacionadas a mostrar un estatus.

19
En el primer recuadro de lado izquierdo se muestra la locacin de memoria
en donde los mdulos se han cargado y en el recuadro derecho el mdulo
en cuestin.

Veamos ms a detalle:

1. Selecciona la direccin de memoria 00400000, den click derecho y


den click en el menu Dump at address.

La accin anterior har que nos muestre en la pantalla principal de


OllyDbg lo que se encuentra en la direccin de memoria 00400000.

20
Ahora dividir en columnas esta pantalla para explicar a detalle que
significa cada cosa.

La primera columna de izquierda a derecha, tal como comentamos


anteriormente, contiene las direcciones de memoria de nuestro
ejecutable.

La segunda columna muestra el contenido del la direccin de


memoria correspondiente lo cual bsicamente es una
representacin en cdigo Hexadecimal de los datos.

En la siguiente figura realizaremos la conversin de Hexadecimal a


ASCII utilizando una herramienta en lnea.
http://www.dolcevie.com/js/converter.html

La tercera columna muestra los datos contenidos en la direccin de


memoria pero ahora en su representacin en cdigo ASCII.

4D 5A = M Z

Pueden encontrar una gran variedad de herramientas en lnea o


documentos relacionados a la representacin de datos en la seccin
de Recursos en mi blog.

21
Ahora hablemos un poco acerca de los archivos o libreras cargadas
junto con el programa:

En el recuadro se podr ver que la primer lnea contiene


programa1.exe el cual es el que estamos cargando, posteriormente
vern que se cargan algunas DLLs adicionales pertenecientes al
Sistema Operativo. Esto es muy importante, interesante y til desde
la perspectiva de estar realizando un anlisis de malware o de
vulnerabilidades en software, ya que de este modo podremos saber
que otros componentes son requeridos por un ejecutable en
especfico y probablemente nos d una pista de dnde mirar, ya sea
que tengamos una muestra de malware y tengamos que identificar
que DLLs son cargadas o identificar la DLL afectada por alguna
vulnerabilidad. Nasty! Hehe

Para finalizar con en anlisis de la funcionalidad Log data, veamos


la lnea correspondiente al Entry point.

1. Den doble click en la lnea que indica Program entry point.

22
Esta accin nos direccionar a la pantalla principal de OllyDbg
posicionndonos en la direccin de memoria 00401000 o mejor
dicho Program entry point lo cual en palabras ms entendibles
significa que es el inicio del programa programa1.exe, es decir, el
lugar desde el cual se iniciar la ejecucin de instrucciones del
programa.

No se preocupen por entender mucho de lo que voy comentando,


conforme vayamos avanzando las cosas se tornarn ms claras.

Como nota adicional, la funcionalidad de OllyDbg llamada Show


modules window - tambin nos muestra prcticamente las
mismas opciones que en la funcionalidad Show Log window -
sin embargo es mayormente recomendable utilizar la funcionalidad
Show modules window ya que tambin contiene opciones ms
avanzadas las cuales nos sern de gran utilidad en un futuro.

Continuemos con la siguiente funcionalidad de OllyDbg

2. - Esta funcionalidad al igual que las acciones que realizamos en el


funcionalidad Show Log window nos permite ver cules son los
mdulos o dlls- cargadas por nuestro programa ejecutable, sin
embargo nos ofrecer opciones mucho ms potentes.

Como hemos hecho anteriormente, dividir la pantalla en columnas


para una mejor explicacin.

23
La primera columna tenemos la direccin Base. Una cosa es la
direccin base y otra el Entry point. Veamos la diferencia de
manera grfica.

Por el momento anoten cuales son las direcciones Base y Entry:

Base = 00400000
Entry = 00401000

1. Den click derecho en la primer lnea y seleccionen la opcin View


code in CPU.

Veamos ahora como se visualiza en el Mapa de memoria.

24
En la primera lnea del recuadro en la primera columna (columna de
las direcciones de memoria) veremos que contiene: 00400000. Algo
interesante aqu es que como pueden ver que en la columna
Section se encuentra en blanco, es decir, que no tiene una seccin
de instrucciones lo cual confirma que la direccin Base o el rea de
memoria reservada para programa1.exe que empieza en 00400000.

Si dan click en esa primer lnea vern que el contenido es


bsicamente la cabecera PE (Portable Executable) y dems
informacin. Veamos:

En esta imagen se puede apreciar en la parte superior izquierda del


recuadro la direccin Base (00400000) y veremos de igual modo
que en la tercer columna de izquierda a derecha contiene ASCII
MZ lo cual indica NO el principio de las instrucciones, sino el
principio del archivo ejecutable cabecera PE.

Como dato curioso, MZ son las iniciales del creador del formato
ejecutable Mark Zbikowski, un ingeniero de Micro$oft.

Regresemos a la captura de pantalla anterior (La copio


nuevamente a continuacin para fcil identificacin)

25
Ahora veamos donde se sita el Entry point el cual acorde a la
nota previamente indica que es: 00401000 y curiosamente vemos
que es la siguiente direccin de memoria (segunda lnea, primer
columna) es esta misma direccin. Sin embargo, en este caso en la
columna Section vern que ahora si contamos con una seccin, y
es la seccin .text la cual contiene las instrucciones que ejecutar
el procesador a la hora de ejecutar el programa programa1.exe.

Nos mostrar la siguiente pantalla:

Detallemos de izquierda a derecha

El primer recuadro muestra la direccin de memoria la cual ya


hemos explicado con anterioridad. El segundo recuadro muestra el
cdigo en Ensamblador de programa1.exe o lo que es lo mismo, el
cdigo contenido en la seccin .text.

Por el momento hagan una nota mental acerca de las secciones


como las que hemos visto hasta este momento. Cuando entremos
en accin en la estructura de un programa en ensamblador vern a
que me refera con esto de las secciones.

26
Para concluir veamos las ltimas columnas que faltan por explicar:

La segunda columna llamada Size en este caso contiene el valor:


00004000 lo cual indicar el tamao requerido para programa1.exe.

Regresemos a la imagen inicial del mapa de memoria de


programa1.exe:

En este caso vern que desde la direccin 00400000 hasta 00403000


contiene cuatro veces 00001000 y si se suma da un igual de
00004000. Por lo cual, este es el espacio de memoria asignado para:

Cabecera PE + seccin .text + seccin .rdata + seccin .data


00001000 00001000 00001000 00001000

=
27
Por ltimo, la quinta columna llamada File version es de gran ya
que nos muestra la versin del archivo.

Esto sirve por ejemplo, para identificar versiones vulnerables de


libreras de algn programa de las cuales tenemos conocimiento,
por lo cual si hay algn programa que utilice dicha librera pudiera
existir el caso de poder explotarla.

Sigamos con la funcionalidad Show Memory window.

3. - Esta funcionalidad es muy poderosa y til ya que nos permite ver una
radiografa de la memoria tanto desde la perspectiva del archivo ejecutable
que estamos cargando, como de la memoria utilizada por programas del
propio Sistema Operativo (kernel32.dll, gdi32.dll, user32.dll, etc.).

Afortunadamente para este momento ya he explicado detalladamente


cmo utilizar ciertas funcionalidades que hacen uso del mapa de memoria
(Memory map), sin embargo en este caso me enfocar a solamente explicar
aquellas cuestiones que me parecen importantes de mencionar.

28
En el primer recuadro de izquierda a derecha encontrarn las columnas que
contienen las direcciones de memoria, tamao, el owner (el programa), las
secciones y el tipo de contenido.

En este caso, un punto importante es que como ya lo hicieron


anteriormente que es el identificar en la direccin base base address y el
punto de entrada Entry point, bsicamente aqu es lo mismo, sin embargo
aplica para aquellos mdulos o libreras cargadas por el Sistema
Operativo (tercer columna). La cuarta y quinta columna muestran el tipo de
seccin y una descripcin de que es lo que contiene.

Para el caso de las secciones, las ms significativas a este momento con la


seccin .text que contiene cdigo, imports y exports y la seccin .data
que contiene datos o variables- a utilizarse en el programa. No sientan
pnico.

Por ltimo las columnas Access e Initial (sptima y octava columna) de


las cuales la primera muestra los permisos de acceso a cada una de las
secciones del programa.

29
Veamos cuales son los permisos de las secciones en programa1.exe.

1. Doble click en la lnea que contiene PE header.

2. Se abrir el Dump o volcado de la cabecera PE.

Como podrn ver, cada una de las secciones tiene su propios permisos.

30
La seccin .text puede ejecutar y leer (EXECUTE|READ), la seccin .rdata
solamente leer (READ) y por ltimo la seccin .data solo puede leer y
escribir (READ|WRITE).

Bsicamente la asignacin de permisos son para controlar en donde se


pueden escribir datos, por default hay secciones como la .text- en la cual
no se puede escribir datos, ya que un usuario no debera escribir en una
seccin de instrucciones, Correcto? Sin embargo el control de acceso
puede ser controlado por el usuario ya sea utilizando herramientas a la
hora del debugging o a travs de programas con rutinas especficas.

4. - Esta funcionalidad nos sirve bsicamente para mostrar la interfaz


principal de OllyDbg. Pueden presionar este botn si se encuentran
perdidos entre miles de ventanas ;).

Aprovechar para mencionar los componentes de la interfaz de OllyDbg de


manera muy rpida y sencilla. Recuerden, NO pretendo hacer una gua
completa del uso del debugger. Existen MILLONES de guas acerca del uso
de la interfaz de esta herramienta, as que si les qued duda o requieren
mayor informacin...

1. Busquen en la seccin Recursos de mi sitio web.


2. Google => OllyDbg tutorial.

Continuemos...

2. Barra de Control Los botones contenidos en esta barra nos permitirn controlar
la ejecucin del programa.

Como desde un inicio he recalcado que este e-Book sera prctico,


veamos cmo se reflejan por lo menos las acciones que no son obvias
utilizando el programa de prueba programa1.exe.

31
Veamos

1. Reiniciar el programa = Ctrl +F2


2. Cerrar el programa = Alt + F2
3. Ejecutar el programa = F9
4. Pausar la ejecucin del programa = F12
5. In paso un paso. Esta opcin nos permite ir bsicamente de lnea en lnea
sobre la ejecucin del programa = F7

Esta es una de las opciones que mas estars utilizando. Tal como lo dice la
explicacin, se trata de ir paso a paso sobre cada lnea de instrucciones del
programa.

1. Posicionan el mouse en el primer CALL y presionas la tecla F2. Esta


accin asignar un Breakpoint el cual cuando se ejecute el
programa se pausar en esa posicin. Breakpoint = pausar

2. Presionas Ctrl + F2, click en Si.


3. Presionas F7 cinco veces seguidas.
4. Vers que a pesar de tener un Breakpoint asignado, no se gener
ninguna pausa, es decir, se fue de largo.

6. Similar al anterior, pero en este caso ejecuta las funciones que se va


encontrando durante la ejecucin = F8

5. Presionas Ctrl + F2, click en Si.

32
6. Presionas F8 cinco veces seguidas.
7. Ahora, veremos que la ejecucin par en el Breakpoint que
asignaste anteriormente y adems ejecut la rutina.

7. Se ejecutan las instrucciones y ejecutando las subrutinas que se va


encontrando durante la ejecucin = Ctrl + F11
8. Similar al anterior, pero en este caso ejecuta las llamadas o calls- que se va
encontrando durante la ejecucin de igual manera = Ctrl + F12

8. Presionas Ctrl + F2, click en Si.


9. Presionas Ctrl + F12.
10. Esta accin brinca directamente a la instruccin CALL:

9. Ejecutar hasta retornar o llegar a RETN- = Ctrl + F9

11. Presionas Ctrl + F2, click en Si.


12. Presionas Ctrl + F9.

33
13. Esta accin brinca directamente a la instruccin RETN que es
la que indica el trmino de la ejecucin del programa.

10. Una forma rpida para dirigirnos hacia una direccin de memoria en
especfico es dando click en el ltimo botn: Go to Address in
Disassembler. Veamos que sucede.

14. Presionas Ctrl + F2, click en Si.


15. Click en el botn Go to Address in Disassembler.
16. Escribes la direccin de memoria de RETN (7C91EB94) y
presionas Enter.

Como resultado saltar directamente a dicha direccin de


memoria tal como se muestra en la siguiente pantalla:

34
Bien, por ltimo veamos de manera muy general los componentes de la
interfaz principal (ventanas) de OllyDbg.

Para mayor entendimiento dividir y agregar numeracin a cada una de las


secciones contenidas en la interfaz de OllyDbg.

1. Esta es la seccin principal, en donde veremos las direcciones


de memoria, los opcodes, las instrucciones contenidas en el
programa y de igual modo una excelente funcionalidad de
OllyDbg que muestra en un formato sencillo la
representacin del cdigo en Ensamblador pero desde la
perspectiva de un programa de Alto nivel o mejor dicho,
como se vera desde la perspectiva de Windows a travs de
la API de Windows.

2. En esta seccin de muestran los registros y de igual modo


aqu vern los datos que son contenidos en ellos. Los
registros es un tema muy importante e interesante, y lo
estaremos abordando ms a detalle posteriormente.
3. En esta seccin de muestra el resultado de las operaciones
de las instrucciones tal y como se van ejecutando.

4. Aqu se muestra el Dump, o lo que es lo mismo el volcado


de los datos en memoria.

35
5. Y por ltimo el viejo pero poderoso Stack!. Aqu es en
donde vern cmo es que los datos se van comportando
conforme un programa se encuentra en ejecucin. Acciones
como asignacin de variables las vern en el Stack de
OllyDbg.

Aqu concluimos nuestra visita a cada una de las funcionalidades principales de


OllyDbg y su interfaz. Hay algunas funcionalidades que no cubr en esta seccin, como
es el uso de Search for, Find references to, Follow in Dump es porque en
posteriores prcticas las utilizaremos y explicar en su momento el funcionamiento de
cada una de ellas.

Antes de cerrar este captulo de la interfaz de OllyDbg les comentar que para los que
no saban es posible disfrazar la interfaz con colores distintos a los que trae Olly por
default. Dirjanse aqu para saber las instrucciones que necesitan para que
personalicen su OllyDbg al gusto: http://www.ollydbg.de/schemes.htm.

En mi caso, pongo guapo a mi OllyDbg con el mismo tema que usa ImmunityDbg ])

36
Conociendo la interfaz y funcionamiento de IDA Dissassembler
r0x! Hemos llegado a un tema que a mucha gente le interesa y
desafortunadamente ha sido el menos documentado o explicado y me refiero al
uso de IDA.

En internet es mejor conocido como IDA Pro, y que como lo comentamos


anteriormente la cuestin del es Pro es porque es la versin comercial, sin
embargo para la finalidad de este e-Book utilizaremos la versin Freeware. Si
desean ver especficamente la diferencia entre las versiones Freeware y
comerciales al momento de iniciar IDA Freeware les desplegar la ayuda en
automtico, y es all en donde podrn ver a detalle la cuestin de las diferencias.

A este punto ya debers tener instalado el software en tu PC/VM. Empecemos!

Pasos a seguir:

1. Ejecutamos IDA Freeware, nos aparecer la pantalla (banner) inicial. Click en OK.

2. Aparecer la pantalla de accin en la cual dars click en el botn New.

37
3. Posteriormente seleccionars la opcin Portable Executable:

4. Seleccionas: programa1.exe y das click en el botn Abrir.

5. En la siguiente pantalla, mostrar la opcin Analysis options. Esta opcin


permitir personalizar la opcin del anlisis del ejecutable en caso de ser
necesario. Esta opcin la dejars sin seleccionar.

38
6. La pantalla siguiente por default viene habilitada la opcin Create imports
segment y bsicamente su funcin es la de incluir en una ventana todos los
imports que utilice el ejecutable que estas cargando en IDA.

7. Y el ltimo paso del wizard es la del inicio del anlisis. Esto quiere decir que IDA
empezar a analizar el archivo a cargar, su estructura, para que al final IDA nos
muestre todo lo relacionado al ejecutable a travs de su sexy interfaz.

39
8. Al trmino del anlisis se abrir la pantalla principal de IDA. Tal como lo he
hecho para OllyDbg, he dividido en secciones y agregado una numeracin cada
una de ellas para ir explicando cada una de ellas a detalle posteriormente.

1. Barra de botones: Aqu encontrars la barra de botones. Bsicamente son


accesos directos a cada una de las funcionalidades de IDA.

2. Barra de Desplazamiento o Navegacin: Esta opcin permite direccionarte a


travs de las secciones del ejecutable. Tiene 2 opciones principales. La primera
es utilizando un men desplegable y la segunda es con el mouse y conforme
deslizas el mouse vas viendo en la pantalla el contenido de la seccin que te
encuentres navegando.

Aqu una nota que me gustara agregar.

Como vers en la barra de lado derecho, contiene diferentes colores (azul, gris,
rosa, etc.) y esto es porque dichos colores tienen asignada una seccin.

40
5. Color Azul Si deslizas el mouse sobre esta seccin, mostrar la interfaz de
navegacin conteniendo el cdigo desensamblado del ejecutable.

6. Color Gris #1 Si deslizas el mouse sobre esta seccin, mostrar la interfaz


de navegacin conteniendo el cdigo desensamblado del ejecutable, pero
sin la interfaz de navegacin. Adems, muestra el contenido de cdigo en la
seccin .text.

7. Color Rosa Esta seccin contiene los imports del ejecutable.


Hablaremos ms adelante acerca del significado de los imports.

41
8. Color Gris #2 Como vers hay 2 colores grises, uno como ya mencionamos
muestra el contenido de la seccin .text y el segundo muestra el contenido
en la seccin .data, es decir, los datos utilizados (variables) en el ejecutable.

En la pantalla anterior vern que las strings de texto que asignamos a


programa1.exe. Recordemos:

Como podrn apreciar, la seccin .data contiene las variables asignadas con
db las cuales contienen el texto que elegimos. Vean la diferencia de cmo se
visualiza a nivel cdigo y a nivel desensamblado. Hace sentido?

Bien, continuemos con el anlisis de la interfaz de IDA

42
3. Barra de funciones: Esta opcin contiene varias sub-opciones las cuales
veremos a continuacin:

9. IDA View-A Aqu muestra bsicamente el contenido desensamblado


utilizando la interfaz de navegacin de IDA. Simple.

10. Hex View-A Lo mismo que IDA View-A con la diferencia que se muestra
el cdigo sin la interfaz de navegacin.

11. Exports Aqu nos mostrar los exports utilizados por el ejecutable. Los
exports son bsicamente las funciones con las que cuenta el programa. En
este caso tenemos start el cual significa el inicio del programa.

43
Como nota adicional, vean como de igual manera nos indica la direccin de
memoria de la funcin. Muchas de las funcionalidades nos proveen de mucha
informacin la cual es muy til para la tarea que ests ejecutando.

12. Imports Los imports -a diferencia de los exports- importan funciones


desde libreras externas. En este caso como programa1.exe utiliza la API de
Windows (ExitProcess y MessageBox) las cuales para que puedan ser
utilizadas por el programa debern ser importadas desde kernel32.dll y
user32.dll respectivamente. Observen la columna Library.

13. Functions Aqu se muestran las funciones utilizadas por el programa. En


este caso muestra la funcin start y MessageBoxA.

44
Veamos a detalle

14. Start, como sabes es una funcin, la cual obviamente tiene un principio y un
fin. En este caso tenemos en el primer recuadro el inicio de la funcin y el
segundo su finalizacin. Podemos decir que start es la funcin de
inicializacin del cdigo del programa.

15. Otro tipo de funcin (o rutina) es la utilizada por la instruccin CALL. Lo


que hace es mandar llamar a la funcin, brincar a esa parte en el cdigo y
ejecutar las instrucciones que se encuentran dentro de ella.

En la imagen pueden observar que el cdigo empieza con push 0 y


posteriormente finaliza con la llamada call. Bueno, lo que hace es formar el
cuerpo de los argumentos requeridos para invocar a la funcin MessageBox.
No qued claro? Veamos

Segn la pgina de MSDN de Microsoft indica que la funcin MessageBox utiliza


en total 4 parmetros (hWnd, lpText, lpCaption y uType).

45
Veamos una como hace match entre la funcin MessageBox y el cdigo
Ensamblador en IDA:

Tal como lo habamos mencionado, los parmetros utilizados por la funcin


MessageBox debern de igual modo ser asignados mediante la instruccin
push en cdigo Ensamblador, lo cual agrega dichos valores al Stack. Una
vez que se tienen todas las variables en memoria por ltimo se ejecuta el call a
MessageBox el cual ejecuta la funcin.

Como nota adicional, observen el orden de los parmetros pasados a la funcin


MessageBox. Podemos apreciar como el ltimo parmetro (uType) se
encuentra ligado al primer push y as sucesivamente. Cuando llegue al tema
del Stack sabrn el por qu sucede esto.

46
4. Ventana Principal - Bien, esta es la pantalla principal en donde se desplegar la
interfaz de navegacin y prcticamente todas las vistas generadas por cada una
de las funcionalidades de IDA las cuales ya he explicado anteriormente.

5. Grfica de Navegacin Esta es una funcionalidad muy buena y atractiva, ya


que en una imagen tipo Thumbnail muestra el contenido (cdigo) del
ejecutable de una manera grfica la cual facilita precisamente la navegacin del
cdigo Ensamblador. Veamos

47
6. Names Esta funcin nos permite identificar todos los nombres contenidos
dentro del cdigo del programa. Como podemos observar en la siguiente
pantalla en donde se muestra que nos indica con la letra F las funciones, con
la letra I los nombres importados y con la letra A las strings en ASCII.

Como coment anteriormente, muchas funcionalidades contienen


informacin que nos ayudan a ciertas tareas. En este caso vemos que la
columna Address contiene las direcciones de memoria para cada uno de
los nombres mostrados en la primera columna.

En la archivo de ayuda de IDA podrn encontrar el resto de las


representaciones para sta y otras funcionalidades.

7. Strings Esta funcionalidad es de un cierto modo de los ms utilizados


principalmente para la cuestin del Cracking ya que permite identificar todos
los strings utilizados por el programa. Veamos

De igual modo, tenemos la columna que nos muestra la direccin de


memoria, el tamao, el tipo y finalmente el string.

48
Pueden notar que los strings utilizadas como variables en programa1.exe
aparecen en las dos ltimas lneas en la pantalla anterior.

8. Ventana de Estatus Tal como su nombre lo indica, aqu es en donde se podr


ver todo lo que va sucediendo con el ejecutable desde su carga y posterior.

Por ltimo, les sugiero descarguen las Cheat Sheets que pueden encontrar en
mi sitio: http://www.resrever.net/p/recursos.html de OllyDbg (Reverse-Engineering
Malware Cheat Sheet) e IDA (IDA Pro Shortcuts).

Fufff este ha sido un camino algo largo. Hasta este momento hemos dado una buena
revisin a las herramientas principales que sern de gran ayuda para aprender
Ensamblador.

Recapitulando:

1. Ya tienen instaladas y listas las herramientas, compiladores y documentacin


necesaria.
2. Ya saben cmo funciona OllyDbg e IDA. Por lo menos las funciones bsicas.

Creo que con eso ya estamos bien armados. Ahora, A darle! ])

49
Estructura de un Programa en Ensamblador
Como ustedes recordarn al inicio del e-Book empezamos haciendo un pequeo
programita el cual hemos estado utilizando como rata de laboratorio hasta este
momento. Bien, es tiempo que empecemos a meternos de lleno al tema del Lenguaje
Ensamblador; y para entenderlo tendrs que saber la estructura de un programa en
Ensamblador, sus directivas, asignacin de variables y dems.

Como ya hemos comentado con anterioridad el lenguaje Ensamblador no es solo


cdigo, sino que de igual manera hay ciertas cuestiones involucradas como lo son los
registros, banderas, etc. Si bien no es necesario enfocarnos a este tema desde un inicio
la forma que manejar ser la de ir armando el programa y a la par ir viendo como se
visualiza el programa que voy creando tanto en OllyDbg como en IDA.

A continuacin vers el cdigo que utilic para crear programa1.exe:

Aqu la descripcin de la numeracin de la figura anterior:

1. .386 - Describe el modelo de CPU para el cual el cdigo est dirigido; en este
caso como estamos haciendo el programa para x86 se puede utilizar la directiva
.386. Como nota adicional hay que poner atencin en el punto inicial el cual es
requerido antes de cualquier directiva. Ya vers en un momento ms a que me
refiero.
2. .model flat,stdcall - La directiva .model: En esta directiva se define
bsicamente el modelo o tipo- de memoria utilizado que utilizar el programa
que ests desarrollando. Aqu no hay muchas opciones por lo que solamente
tendrs una: flat y stdcall. Stdcall indica el tipo de convencin a utilizar para el
paso de parmetros al utilizar funciones. No te alarmes, pronto veremos de qu
trata este asunto con algunos ejemplos ms adelante.

50
3. include Tal como es utilizado en otros lenguajes, los includes tienen el
mismo objetivo en Ensamblador; el cual es incluir en el cdigo las libreras a
utilizarse. Para el caso de Ensamblador sobre Windows (Win32) se utiliza
principalmente las libreras e includes relacionadas a las dlls que conocemos
son parte del Sistema Operativo, y me refiero a windows, kernel32 y user32.
Cmo es esto? Sencillo. En Windows para que se puedan desplegar las
ventanas hace uso de un DLL (user32.dll) y lo que hay dentro de user32.dll
son meras funciones como lo es el caso del MessageBox, le cual al ser
llamada dicha funcin despliega una ventana de mensaje; por lo cual si se
incluye el uso de los archivos de user32 en el programa, est por entendido que
se tiene planeado el despliegue de ventanas. Claro como el agua.
4. .data - La directiva .data contiene informacin inicializada del programa. Como
te podrs dar cuenta utilizamos esta directiva para hacer la asignacin de la
variable MsgBoxCaption, asignndole el valor: Resrever.Net. Se puede decir
que la directiva tambin llamada seccin- .data ser el repositorio de las
variables inicializadas del programa. Existen otras directivas como .DATA? la
cual tiene la misma funcin que .DATA, con la nica diferencia que sta sirve
para almacenar datos no-inicializados. De igual manera se tiene la directiva
.CONST que como puede deducirse sirve para almacenar las constantes que se
quieran utilizar en el programa. Para efectos del ejemplo se usar nicamente
la directiva .data y conforme vayan avanzando los temas se irn retomando el
resto de las directivas.
MsgBoxCaption db "Resrever.Net",0 Como lo coment anteriormente,
dentro del bloque de variables (.data). En este caso se est asignando el
nombre de variable MsgBoxCaption asignando (db) el valor Resrever.net. Si
te fijas al final lleva una coma y un cero y el motivo de esto es que todas las
cadenas debern ser terminadas con 0 NULL-.
5. .code - La directiva .code, como es de suponerse es en donde se escribir el
cdigo del programa.
.start y end start Indican el principio y el fin del bloque de cdigo.
invoke Es una forma se llamar a una funcin. De igual modo se podra
utilizar una llamada CALL, sin embargo para evitar cuestiones relacionadas al
manejo de errores es mayormente recomendable el uso de invoke. En el cdigo
se utiliza invoke de la siguiente forma: invoke MessageBox, NULL, addr
MsgBoxText, addr MsgBoxCaption, MB_OK en la cual se est haciendo una
llamada a la funcin MessageBox con 4 parmetros (NULL, MsgBoxText,
MsgBoxCaption y MB_OK). Nota que los valores de MsgBoxText (Ensamblador
r0x!) y MsgBoxCaption (Resrever.Net) fueron asignadas previamente. Te
recomiendo regresar a la pgina 49 para entender un poco ms de la asignacin
de parmetros a las funciones.

51
Cada vez que generes un nuevo programa podras utilizar la siguiente pieza de cdigo
como plantilla:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data
<variables>

.code
start:
<cdigo>
end start

Si deseas obtener mayor informacin acerca de la estructura de un programa en


Ensamblador Win32 te sugiero visites el Tutorial Ensamblador Win32 de Iczelion en la
siguiente liga:

Liga: http://www.angelfire.com/rnb/byte/tut01_es.html

Entendiendo los Registros del CPU


Como ustedes recordarn al inicio del e-book, todo el tiempo me he enfocado en
primero practicar y despus entender, por lo cual eso es precisamente lo que
haremos; veremos de una manera visual y dinmica el funcionamiento de las
instrucciones x86 o lo que es lo mismo, veremos cmo se visualizan desde el punto de
vista del procesador y de ser requerido abordaremos temas tericos.

Aprendiendo el Set de Instrucciones x86


En este punto me gustara hacer una pausa y comentar algo que considero de
relevancia. En ste primer acercamiento al set de instrucciones x86 voy a realizar un
pequeo programa ejemplo por cada una de ellas y posteriormente ir trabajando
sobre el programa correspondiente.

La instruccin - INC
La instruccin INC sirve para incrementar el valor numrico que tengas en un
registro en particular. En el siguiente ejemplo vers cmo utilizar la instruccin INC
para ir sumando un nmero al registro EAX (acumulador) de de igual manera ir
explicando los eventos que me voy encontrando durante el anlisis del programa.

52
Veamos cmo se usa en la prctica:

Pasos a seguir:

1. Abran WinAsm Studio.


2. En el men, File => New project, seleccionen: Standard Exe
3. Copia el siguiente cdigo y guarda el proyecto en c:\reversing como inc.wap y el
cdigo como inc.asm.

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

.data

.code
start:
; Resrever.net
; Ejemplo de uso de la instruccin "INC"

INC eax ; Incremento de EAX = 00000001


INC eax ; Incremento de EAX = 00000002
INC eax ; Incremento de EAX = 00000003
INC eax ; Incremento de EAX = 00000004
INC eax ; Incremento de EAX = 00000005
INC eax ; Incremento de EAX = 00000006
INC eax ; Incremento de EAX = 00000007
INC eax ; Incremento de EAX = 00000008
INC eax ; Incremento de EAX = 00000009
INC eax ; Incremento de EAX = 0000000A
INC eax ; Incremento de EAX = 0000000B
INC eax ; Incremento de EAX = 0000000C
INC eax ; Incremento de EAX = 0000000D
INC eax ; Incremento de EAX = 0000000E
INC eax ; Incremento de EAX = 0000000F
INC eax ; Incremento de EAX = 00000010
INC eax ; Incremento de EAX = 00000011
INC eax ; Incremento de EAX = 00000012
INC eax ; Incremento de EAX = 00000013
INC eax ; Incremento de EAX = 00000014
INC eax ; Incremento de EAX = 00000015
INC eax ; Incremento de EAX = 00000016
INC eax ; Incremento de EAX = 00000017
INC eax ; Incremento de EAX = 00000018
INC eax ; Incremento de EAX = 00000019
INC eax ; Incremento de EAX = 0000001A
INC eax ; Incremento de EAX = 0000001B
INC eax ; Incremento de EAX = 0000001C
INC eax ; Incremento de EAX = 0000001D
INC eax ; Incremento de EAX = 0000001E
INC eax ; Incremento de EAX = 0000001F
INC eax ; Incremento de EAX = 00000020
INC eax ; Incremento de EAX = 00000021
INC eax ; Incremento de EAX = 00000022

53
INC eax ; Incremento de EAX = 00000023
INC eax ; Incremento de EAX = 00000024
INC eax ; Incremento de EAX = 00000025
INC eax ; Incremento de EAX = 00000026
INC eax ; Incremento de EAX = 00000027
INC eax ; Incremento de EAX = 00000028
INC eax ; Incremento de EAX = 00000029
INC eax ; Incremento de EAX = 0000002A
INC eax ; Incremento de EAX = 0000002B
INC eax ; Incremento de EAX = 0000002C
INC eax ; Incremento de EAX = 0000002D
INC eax ; Incremento de EAX = 0000002E
INC eax ; Incremento de EAX = 0000002F
RETN

end start

4. Presiona: Shift + F8.


5. Se genera inc.exe, da click derecho en el archivo y selecciona Open with OllyDbg.
6. Regresas a OllyDbg y vers la siguiente pantalla:

Vista - OllyDbg

Como vers, OllyDbg te posiciona el cursor en la primer lnea, lo cual quiere decir que aun no
se ha iniciado la ejecucin del programa. Nota que en la ventana de los registros (superior
derecha) indica que el registro EAX contiene el valor 00000000. Lo que haremos a
continuacin ser utilizar la funcionalidad de OllyDbg de ir paso a paso, o sea tecleando F7
para visualizar como es que en el nmero que se encuentra en el registro EAX se va
incrementando conforme la ejecucin de instrucciones va avanzando. OK, Continuemos

54
7. Presiona la tecla F7.

Bien, ahora vemos que el cursor se posiciona en la segunda lnea y ahora el registro EAX dice
que su valor es 00000001. Repite el mismo paso (presiona F7).

Tercer lnea, y el registro EAX con el valor 00000002. OK, creo que ya se entendi la idea del
INCremento. Un detalle curioso es, por si no te has dado cuenta es que estas posicionado en la
lnea 3 y el valor de EAX es 2, bueno hay que recordar que el primer INCremento es de 0,
despus, 1, 2, etc. An falta ver ms.. continuemos

8. Presiona F7 siete veces ms.

55
Ahora EAX vale 00000009, presta atencin a lo que sucede a continuacin:

9. Presiona F7 nuevamente.

WTF!! 0000000A? No se supona que sera: 00000010? NO, y esto tiene una sencilla
explicacin, esos valores que estas incrementando al registro EAX se encuentran en formato
Hexadecimal, lo cual quiere decir que tendrs un rango de: 0 a 9 (0123456789) y de la letra
A a la F (ABCDEF).

10. Presiona nuevamente F7.

56
Tal como era de esperarse, EAX = 0000000B.

11. Presiona F7 4 veces ms.

Llegaste a 0000000F, Qu seguir?

12. Presiona nuevamente F7.

57
Huh? 00000010? Recapitulando

Iniciamos en 00000000 hasta 00000009.


Despus de 0000000A hasta 0000000F.
Ahora 00000010? hasta. 0000001F!
13. Presiona F7 15 veces.

En efecto, ahora EAX vale 0000001F, Continuemos

14. Presiona F7 11 veces.

58
Ahora EAX es igual a: 0000002A. Recapitulando

Iniciamos en 0000001F hasta 0000002A, o lo que es lo mismo:


o 0000001F, 00000020, 00000021, 00000022, 00000023, 00000024, 00000025,
00000026, 00000027, 00000028, 00000029, 0000002A

..y as sucesivamente con los nmeros incrementados posteriormente . No te


preocupes por ahora por lo teora, recuerda que vamos a la inversa, primero
practicas, lo entiendes, y despus en la teora vers el por qu.

Como te dars cuenta aproveche el tema de la instruccin INC para de igual modo tocar un
poco el tema de cmo trabaja el sistema Hexadecimal en la prctica.

Vista IDA Pro


Veamos cmo se visualiza el cdigo desensamblado del programa inc.exe en IDA Pro:

;
; +------------------------------------------------------------------+
; This file is generated by The Interactive Disassembler (IDA)
; Copyright (c) 2010 by Hex-Rays SA, <support@hex-rays.com>
; Licensed to: Freeware version
; +------------------------------------------------------------------+
;
; Input MD5 : 788EE2C9F1A31F7D89DC010D8ED4D532

; File Name : C:\reversing\inc.exe


; Format : Portable executable for 80386 (PE)
; Imagebase : 400000
; Section 1. (virtual address 00001000)
; Virtual size : 00000030 ( 48.)
; Section size in file : 00000200 ( 512.)
; Offset to raw data for section: 00000200
; Flags 60000020: Text Executable Readable

59
; Alignment : default

.686p
.mmx
.model flat

; Segment type: Pure code


; Segment permissions: Read/Execute
_text segment para public 'CODE' use32
assume cs:_text
;org 401000h
assume es:nothing, ss:nothing, ds:_text, fs:nothing, gs:nothing

public start
start proc near
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax
inc eax

60
inc eax
inc eax
retn
start endp

Como vern existe una gran similitud si no es que una mera igualdad - entre el cdigo
en inc.asm y lo obtenido por IDA Pro. Era de esperarse; sin embargo mientras ms
vaya avanzando vers el poder que ofrecen ambas herramientas (OllyDbg e IDA) al
momento de analizar los programas que voy generando.

***********************************************************************

Sugerencias o Comentarios: chr1x@resrever.net

http://www.resrever.net

No olviden darse de alta en mi sitio para recibir actualizaciones acerca de este e-Book.

***********************************************************************

61

Anda mungkin juga menyukai