Bien les cuento, la idea de hacer una introducción (serie de
tutoriales) sobre desarrollo de malware en un entorno de windows x86
desde ASM que al parecer serán muchas partes ya que es un tema grande
aun siendo solo una introducción nace desde hace un tiempo y de lo que
siempre me invitaban a escribir al respecto cuando fui moderador en
indetectables.net y hackxcrack.es , lo cual por cierto les recomiendo,
son grandes foros relacionados a la inseguridad informática donde se
habla de seguridad web, reversing/cracking, malware, exploits, etc ,
donde ronda gente grande en los temas, por ejemplo estuvo por ahí mi
buen amigo German Sánchez mejor conocido por otros en su web www.enelpc.com y que actualmente forma parte del equipo del gran Chema Alonso en elevenpaths
(que muchos conocen y no hace falta presentación), así como el muchos
otros colegas que hacían la estancia dentro del foro muy agradable con
aportaciones muy buenas, lamentablemente por falta de tiempo he decidido
alejarme un poco; regresando en lo que estaba, una introducción la cual
también me inspiro a escribir sobre este tema es la de hace varios años
redactada por fabio escudero (zeropad) al cual le mande un mail para
comentarle de mi proyecto y su respuesta fue “la idea es compartir
información con la mayor cantidad de personas y que entre todos
aportemos nuestro granito de arena.” y me ofrecio su ayuda en caso de
necesitarla , claro que este será un tema algo parecido pero van
cambiando muchas cosas a nuestro modo 3:).
El objetivo principal de esta serie de tutoriales que se irán
liberando por partes es que al término se comprenda como funciona
internamente un malware; comprendiendo paso a paso como se desarrollan y
como es que realizan los procesos de infección y si todo marcha bien
ustedes puedan desarrollar una muestra desde cero y ya obtenidos los
conocimientos así apoyarse en el momento de querer analizar un malware a
mano, empezaremos armando nuestro laboratorio y explicare
instrucciones basicas de ASM, la estructura de los binarios win32, la
cabecera, secciones, movimientos en memoria, uso del debugger,
inyecciones de código hasta concluir con el desarrollo del bicho con un
cifrado simple y quizás terminemos con algo mas complejo..
Esta primer parte empezaremos a armas nuestra mesa de trabajo,
conociendo las herramientas y configurando en caso de ser necesario, ya
teniendo todo listo podríamos pasar con detalles importantes para
después empezar con el desarrollo de los bichos.
Laboratorio:
Maquina virtual: Windows 32 bits ( windows xp o windows 7)
Masm32 –
Radasm (IDE) –
Todas las herramientas que usaremos para empezar son gratuitas y pueden ser descargadas sin problemas.
Conociendo y configurando las herramientas:
Masm32 , El Microsoft Macro Assembler (MASM) es un ensamblador para
la familia x86 soportó una amplia variedad de facilidades para macros y
programación estructurada, incluyendo construcciones de alto nivel para
bucles, llamadas a procedimientos y alternación, este lenguaje es el que
usaremos y el que mejor manejo, en la parte de abajo en la zona de
“referencias” agregare algunos enlaces de tutoriales para que practique
ligeramente sobre como desarrollar en masm que hoy en día sigue siendo
de los assemblers más populares.
Ahora hablemos de nuestro IDE Radasm, les cuento, Radasm es un
entorno integrado de desarrollo que nos permite programar en diferentes
lenguajes pero en este caso usaremos únicamente MASM.
Para pasar a la parte de instalación he decidido usar una mini tool
desarrollada por RVLCN que facilita instalar Masm32 en conjunto con
Radasm (nuestro IDE) ya configurado en un solo paso:
Ya descargado desde el enlace de arriba, al correr la aplicación nos aparece la pantalla inicial
Seleccionamos la casilla “Instalar Radasm” seleccionamos ruta a instalar y presionamos “instalar” , al terminar nos dira que ha terminado y listo con eso nos ahorramos unos min.
Ya una vez instalado podríamos ir a la carpeta donde lo hemos instalado y abrimos el ejecutable “Radasm.exe” para probar si ya esta todo configurado y listo para empezar a desarrollar
Ahora seleccionamos en el menú “Archivo- Nuevo Proyecto” y nos aparecerá una ventana como esta:
Seleccionamos “Win32 app” y escribimos el nombre y descripción de nuestro proyecto, al presionar siguiente nos aparecera un lista con las plantillas disponibles:
Seleccionamos “Dialog app” que en este caso es la que nos interesa para probar, y si todo marcha bien nos mostraría una ventana de dialogo predeterminada, al presionar siguiente tendriamos todo el codigo que mas adelante explicare de que trata todo este rollo de codigo que es el que no hace mostrar una simple ventana de dialogo, presionamos “CTRL + f5″ y veamos:
Listo todo marcha bien y nos ha mostrado la ventana de dialogo tal cual esperabamos, por lo tanto todo está bien configurado.
Ahora les platicare acerca del debugger que usaremos, para los que no lo conozcan les platicare de él; Olly debugger es un debugger para programas en Windows de 32 bits y este es para trabajar en ring 3
Los procesadores X86 de Intel y compatibles tienen 4 niveles de privilegio:
Ring 0: mayor privilegio (nivel kernel), sobre este se ejecuta el sistema operativo
Ring 1
Ring 2
Ring 3: menor privilegio (nivel usuario)
Win32 solamente soporta ring 0 y ring 3, pero nosotros trabajaremos en nivel de usuario (ring 3) por eso de mayor compatibilidad y además que debemos comenzar por un nivel muy basico, cabe mencionar que algunos bichos (rootkits) que se ejecutan en ring 0 son muy poderosos y empezar a jugar con nivel kernel y hacer mal resultaría desastroso.
Cuando trabajamos con ring 3 estaremos invocando a las API’s de Windows (de las que les explicare mas adelante) y estas entraran a nivel kernel (ring 0) a ejecutarse y después retornar a nivel usuario, de esta forma nos aísla del ring 0.
Ya descargado nuestro debugger seleccionamos en el menú “file – open” y seleccionamos un ejecutable (el que sea) y veríamos algo como esto:
Es esencial conocer las partes de nuestro debugger, sigamos y les explicare una barra de los botones de nuestro debugger:
L: log data, muestra un detalle de lo que va haciendo el Olly (cuando arranca el programa, cuando genera un error, etc.)
E: executable modules, muestra todos los módulos que utiliza el programa debuggeado, el propio exe, las librerías que carga, etc.
M: memory map, como su nombre lo indica nos muestra un mapa de la memoria donde está nuestro programa, las dll que utiliza, etc.
T: threads, nos muestra los hilos de ejecución que utiliza nuestro proceso (esto lo vamos a ver luego con mas detalle)
W: windows, nos muestra las ventanas que tiene abiertas el programa
H: handles, son los manejadores que utiliza nuestro programa (también lo vamos a ver bien mas adelante)
C: cpu, la pantalla principal del Olly
/: patches, muestra los parches que se aplicaron al programa
K: call stack of main thread, muestra los distintos calls a los que vamos entrando
B: breakpoints, nos muestra los distintos breakpoints que hemos puesto en nuestro programa (lo que hacen es interrumpir la ejecución y darle el control al debugger)
R: references, nos muestra las referencias cuando realizamos alguna búsqueda
Bien ahora configuraremos nuestro debugger de tal forma que se nos haga mucho mas comodo trabajar con él, para los que ya han tomado clase conmigo en el área de cracking de la certificación ya les será mas fácil hacer todo este procedimiento ;), para los que no, les explico vamos a la pantalla “disassemble” y damos click derecho nos aparecerá un menú en el cual haremos lo siguiente:
Bien esto es para que nos remarque con colores algunos saltos condicionales, incondicionales y llamadas, y quedara algo asi:
Lo que están remarcados como les explique son algunos saltos condicionales e incondicionales como los son (JNZ, JE, JMP,etc), también se han remarcado las llamadas (call). Lo que sigue es en el menú “options” del debugger modificar lo siguiente:
Esto es para que tengamos un cómodo control de a dónde se dirige el flujo del programa, mostrándonos una flecha al estar encima de algún salto condicional también nos indicara si el salto será tomado o no, algo como esto:
Creo que por ahora hemos terminado la parte
del laboratorio y configurar las primeras y mas importantes herramientas
(aunque despues en el transcurso agregaremos otras mas), les advierto
que la segunda y tercer parte son las mas intensas y pesadas de todo el
curso, ya que trataremos temas como lenguaje ensamblador, estudio de la
cabecera PE, estructura de los binarios, y conceptos de windows y demas
detalles que son muy interesantey esenciales pero a veces un dolor de
cabeza si no nos gusta leer. Aproximadamente para la cuarta parte en
adelante estaremos entrando de lleno a programar nuestro primer bicho!
metodos de inyeccion y conceptos basicos de cifrado.
No hay comentarios:
Publicar un comentario