domingo, 3 de marzo de 2013

#How to Exploit. - Comienzo.. -1-


#How to Exploit. - Comienzo..
Estos papers que pienso escribir iran enfocados para aquellos que tengan curiosidad sobre como explotar vulnerabilidades, descubrirlas, realizar ingeniería inversa, etc etc..
Me enfocare desde mi entorno Linux, pero es viable para Windows también, salvo excepciones de algunas herramientas, la esencia es la misma.

¿Requisitos?.
Simplemente tener conocimientos basicos de programación.. compiladores, arquitectura, todo lo que nos rodea y usamos habitualmente, y en otros casos lo usamos pero no tenemos idea que lo hacemos.. Un requisito mas podria ser el saber y querer entender 'el porque de las cosas', no tirar un exploit a lo scriptkiddie. De todas maneras intentare enfocarme y detallar lo maximo que pueda. Para el resto, Google. Usare muchas herramientas como GDB, Objdump, IDA, GCC, Python,etc, etc..

 #Primero, lo aburrido, pero necesario para entender.
Vamos a familiarizarnos un poco con el código fuente, compilar, desensamblar, algunas herramientas que ayudan este proceso y todas esas cosas.
Para empezar tenemos preparado para esta prueba un pequeño codigo fuente  "analizaMe",
esta codeado en C, y es de lo mas básico, pero me ayudara a explicarlo de manera rápida.. asi que deberíamos compilarlo. ¿Compilar?.

Suponiendo que si llegan hasta aca, siguieron al pie los requisitos de tener conocimientos basicos de programacion, assembler, etc..  no sera muy dificil entender lo que refresco por encima a continuacion. Para comprender realmente el significado de Compilar, tenemos que movernos al origen de los procesadores, pero resaltaremos lo importante, el procesador x86.
Intel desarrollo la cpu 8086 que fue el priemr procesador x86.. luego creo otros mas avanzados como el 386, 486.. etc.. El procesador x86 que se refiere a los anteriormente mencionados, posee varios registros que son como las 'variables' internas para dicho procesador. Algunos de estos registros son los conocidos 'EAX,ECX,EDX,EBX', son registros usados para varios fines, entre ellos como contadores o acumuladores.. sirven como variables temporales para el procesador cuando esta ejecutando instrucciones. Hay 4 registros mas a resaltar que son 'EBP, ESP, ESI y EDI'.
Estos registros llevan el nombre de EBP puntero base, ESP puntero de pila, ESI indice de origen y EDI indice destino. El puntero EIP, es el puntero de instruccion, es quien nos ayuda y nos señala a la instruccion que el procesador esta leyendo en ese preciso momento.

Bueno, como sabran con el codigo fuente no vamos a poder hacer nada, hasta el momento en el que lo compilamos y lo convertimos en un archivo ejecutable.
Let's Go!

El programa analizaMe:

#include <stdio.h>
int main() {
  int contar;
  for(contar=0; contar < 5; contar++)
  {
    printf("La variable contar vale: %i \n", contar);
  }
}

Bien, lo primero sera explicar un poco este codigo, y luego compilarlo.
Basicamente y de manera rapida, este programa lo que hace es mostrar en pantalla un mensaje y el valor de la variable 'contar'. Mientras sea la variable menor de 5 el mensaje sera mostrado via la funcion 'printf'. Cuando llega a 5, el programa finaliza. Analicemoslo mas en detalle..
(cada vez que vean $> es la manera de decirles que son comandos a tipear en la shell)

Vamos a compilarlo con GCC (es el GNU Compiler Collection), la funcion de los compiladores basicamente es la de convertir el codigo fuente en lenguaje maquina, la manera en la que entienden los procesadores.

$> gcc analizaMe.c -o analizaMe
$> chmod +x
$> ./analizaMe


Invocamos al compilador y le decimos que nos compile el codigo fuente en c. El resultado es un nuevo archivo llamado analizaMe. Le damos permisos de ejecución. Y luego lo ejecutamos..
El resultado es el siguiente:

La variable contar vale: 0
La variable contar vale: 1
La variable contar vale: 2
La variable contar vale: 3
La variable contar vale: 4

Ok, vemos el resultado del programa, pero veamos que es lo que no esta a simple vista, como es que funciona este programa realmente..

Invocamos en la shell, a ojbdump, es una gran utilidad para desensamblar facilmente binarios compilados.

$> objdump -D analizaMe -M intel |grep -A15 main.:


(Le decimos a objdump que (-D) desensamble el binario 'analizaMe', (-M intel) que nos muestre el resultado con la sintaxis Intel ya que es mas prolija y acostumbrado que la de AT&T (por default objdump nos arroja esta ultima por eso es que forzamos a que nos muestre con la de Intel)).. (grep -A15 main.:) invocamos a 'grep' y aplicamos una expresión regular para que nos muestre solo las primeras 15 lineas de la funciona principal, main.
Podríamos no limitar a 15, pero arrojaria muchas lineas innecesaria para este momento.
Y hasta acá esta primera parte..

1 comentario:

Deja un comentario..