Es necesario saber programar para ser hacker?

Esto, por supuesto, es la habilidad fundamental del hacking debido a que si conoce la programación, podrá diseccionar el código y analizarlo, por ejemplo entender el funcionamiento de un exploit, ademas de ser capaz de escribir sus propios scripts o sus propias herramientas de hacking y no ser únicamente un script kiddie.

Vamos a ver diferentes lenguajes de programación, no desde un punto de vista de aprendizaje del mismo ya que para eso existen bastantes sitios en Internet sino mas bien en temas de hacking.

Hay dos lenguajes muy importantes para un hacker en la actualidad: Python y Ruby. Sin embargo para desarrollar habilidades como hacker es ideal aprender estos cinco: Python, C / C ++, Java, Perl y LISP debido a que representan enfoques muy diferentes de la programación así como diferente nivel de dificultad.

Python es el core para crear exploits y herramientas, aquí hay muchos tutoriales para aprenderlo, ademas si usted nunca ha programado le recomiendo empezar por este lenguaje debido a su simpleza para principiantes y que ademas existe mucha documentación.

Ruby también es muy útil para escribir exploits. Ademas Metasploit fue hecho en Ruby por lo que nos sirve para hacer scripts.

También tenemos otros utilizados para diferentes ataques como HTML, Java, PHP y SQL para la parte web, ensamblador para ingeniería inversa y C/C++ debido a que es el lenguaje core de Unix.

PV.

D3N.

 

 

 

Fundamentos de Arquitectura 2

Nivel Principiante

Continuando con lo visto en el post anterior esta vez hablaremos de otros temas que nos servirán para buffer overflows, shellcode, análisis de malware, entre muchas cosas más. La teoría es algo aburrida pero es necesaria para luego entrar a la parte divertida.

Proceso de memoria

Cuando un proceso se ejecuta, este es organizado en la memoria tal como se muestra:

Proceso Memoria

El proceso es dividido en cuatro regiones: Text, Data, Heap y Stack.

La parte Text, o segmento de instrucción, es fijada por el programa y contiene el código del programa (instrucciones). Esta región es marcada como read-only, debido a que el programa no debería cambiar durante la ejecución.

La región Data es dividida en inicializada y no inicializada. Datos inicializados incluyen items tales como variables declaradas que son predefinidas y pueden ser modificadas. Datos no inicializados, llamados Block Started by Symbol (BSS), también inicializa variables que son inicializadas a cero o no tiene inicialización explicita (por ejemplo static int x).

El siguiente es Heap e inicia después del segmento BSS. Durante su ejecución el programa puede solicitar mas espacio en memoria mediante llamadas al sistema vía brk y sbrk, y utilizados por malloc, realloc y free. Por lo tanto el tamaño de los datos de esta región puede ser extendido. En otros post profundizamos sobre este tema.

La ultima región de la memoria es Stack, la cual es la mas importante para nuestros propósitos.

Pila (Stack)

La pila es un bloque de memoria tipo LIFO (Last-in-First-out). Esta ubicada en la parte mas alta de la memoria. La pila puede ser usada para guardar las direcciones de retorno de una función, pasar los argumentos de una funcion, almacenar variables locales, entre otros. El propósito del registro ESP (Stack Pointer) es identificar la parte superior de la pila y si es modificada cada vez que un valor ingresa pushed in (PUSH), o sale popped out (POP).

Antes de ver como la pila trabaja y como operar en ella, es importante entender como la pila crece. La pila puede crecer hacia arriba, hacia las direcciones de memoria mas altas y también puede crecer hacia abajo, hacia las direcciones de memoria mas bajas.

En resumen, la pila es una estructura LIFO y las operaciones mas fundamentales son PUSH y POP. El puntero principal para estas operaciones es ESP, el cual contiene las direcciones de memoria para lo mas alto de la pila y cambia durante cada operación PUSH y POP.

instrucción PUSH: PUSH E

Proceso PUSH: Un PUSH es ejecutado, y el registro ESP es modificado.

Valor de inicio: ESP apunta a lo mas alto de la pila

Proceso: La instrucción PUSH resta 4 (en 32 bits) u 8 (en 64 bits) del ESP y escribe los datos a la dirección de memoria del ESP, luego actualiza el ESP a lo mas alto de la pila. Recuerde que la Pila crece hacia atrás, por lo tanto PUSH resta 4 u 8, con el fin de apuntar a la ubicación de memoria mas baja de la pila. Si no lo restamos, la operación PUSH sobreescribira la ubicación actual apuntada por ESP (lo mas alto) y podremos perder datos.

Valor final: ESP apunta a la parte superior de la pila -4

PUSH

Ahora, un ejemplo mas detallado de la instrucción PUSH:

Valor de inicio: ESP apunta a la dirección de memoria 0x0046A3B0

Proceso: El programa ejecuta la instrucción PUSH 1. ESP disminuye en 4, llegando a ser 0x0046A3AF, y el valor 1 sera empujado a la pila.

Valor final: ESP apunta a la siguiente dirección de memoria: 0x0046A3AF

PUSH1.png

Proceso POP: Un POP es ejecutado, y el registro ESP es modificado.

Valor de inicio: ESP apunta a la parte superior de la pila (Previo ESP +4)

Proceso: La operación POP es lo opuesto a PUSH y recupera datos de lo mas alto de la Pila. Por lo tanto los datos contenidos en la ubicación de la dirección en el ESP (la parte superior de la pila) es recuperada y almacenada (usualmente en otro registro). Después de la operación POP el valor de ESP es incrementado, en x86 por 4 o en x64 por 8.

Valor final: ESP apunta a la parte superior de la pila (igual que la ubicación anterior antes del PUSH).

POP

Ahora, un ejemplo mas detallado de la instrucción POP:

Valor de inicio: ESP contiene el valor de la dirección de memoria. Después de PUSH 1, ESP apunta a la siguiente dirección de memoria: 0x0046A3AF

Proceso: El programa ejecuta la instrucción inversa POP EAX. El valor (00000001) contenido en la dirección del ESP sera sacado de la pila y sera copiado en el registro EAX. Luego ESP es actualizado agregando 4 y llegara a ser 0x0046A3B0.

Valor final: ESP apunta a la siguiente dirección de 0x0046A3B0. El regresa a su valor original.

POP1.png

Cuando el valor es sacado de la pila no es borrado o puesto es cero. El se mantendrá en la pila hasta que otra instrucción lo sobreescriba.

Ya que conocemos mas sobre la Pila, en el siguiente post analizaremos como trabajan los procedimientos y funciones, esto es importante ya que los procedimientos y funciones alteran el flujo normal del proceso.

D3N.

Black Hat Hacker, White Hat Hacker o Penetration Tester

A veces puede existir alguna confusión con los términos utilizados para describir a un hacker. Para un mejor entendimiento estas son las diferencias:

  • Black Hat Hacker: esta persona solo necesita encontrar una simple falla o debilidad en cualquier área de un sistema para atacarlo y utilizar la información para beneficio personal o en mala fe (por ejemplo vender información clasificada / confidencial).
  • White Hat Hacker / Ethical Hacker: esta persona encuentra una simple falla en el sistema pero utiliza la información para mejorar el sistema (por ejemplo reportar la falla a la empresa).
  • Penetration Tester: esta persona es más experto a los otros debido a que tiene que encontrar todas las fallas en un sistema, anotarlas, crear un reporte e incluir detalles de como el hackeo o ataque fue ejecutado y como puede ser replicado. Ademas involucra una metodología, evaluación de riesgos y el alcance de una prueba de penetración está enfocada a un área particular de un sistema, red o  aplicación.

La gran mayoría de los temas que veremos en futuros posts son aplicables para todos los tipos descritos anteriormente, en algunos casos hablaremos sobre temas que únicamente aplican para Pentesting y también veremos como defendernos ante ciertos tipos de ataques.

Feliz hacking!!

D3N