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 1

Nivel Principiante

Empezaremos con conceptos y términos importantes que nos ayudaran a entender los ataques y exploits que después usaremos.

Veremos CPU, instrucciones, registros, lenguaje máquina y ensamblador, memoria y muchas cosas más.

CPU, ISA y Ensamblador

La unidad central de procesamiento (CPU) es la parte encargada de ejecutar el lenguaje máquina de un programa. El lenguaje máquina o código máquina, es el conjunto de instrucciones que el CPU procesa. Cada instrucción es un comando primitivo que ejecuta una operación especifica tal como mover datos, cambiar el flujo de ejecución del programa, desarrollar operaciones aritméticas y lógicas entre otros.

Las instrucciones del CPU son representadas en formato hexadecimal (HEX). Debido a su complejidad es imposible para las personas utilizar en su formato natural, por lo tanto, el lenguaje maquina es traducido en código nemotécnico (un lenguaje mas legible). Esto es llamado lenguaje ensamblador (ASM). Los dos mas populares son NASM (Netwide Assembler) y MASM (Microsoft Macro Assembler). El ensamblador que vamos a usar es NASM.

En este ejemplo vemos las diferencias entre ambos:

Machine language vs Assembler

Cada CPU tiene su propia arquitectura del conjunto de instrucciones (ISA). ISA es lo que un programador (o un compilador) debe entender y usar para escribir un programa correctamente para un CPU especifico. En otras palabras ISA es lo que un programador ve: memoria, registros, instrucciones, entre otros.

Uno de los mas comunes ISA es el conjunto de instrucciones (o arquitectura) X86, originada del Intel 8086. El acronimo X86 identifica procesadores de 32 bits, mientras X64 (conocido como X86_64 o AMD64) identifica las versiones de 64 bits. (En otros posts veremos con mas detalle este tema).

Registros

El numero de bits, 32 o 64, se refiere al ancho de los registros del CPU. Cada CPU tiene un conjunto fijo de registros que son accedidos cuando sean requeridos. Se puede imaginar a los registros como las variables temporales usadas por el CPU para conseguir y almacenar datos.

Aunque la mayoría de los registros son pequeñas porciones de memoria en el CPU y sirven para almacenar datos temporalmente, nos enfocaremos en un grupo especifico de registros: The General Purpose Registers (GPRs).

La siguiente tabla resume los 8 registros de propósito general. Note que la nomenclatura se refiere a la arquitectura X86.

Nomenclatura X86La nomenclatura para el viejo CPU de 8 bits tiene registros de 16 bits dividido en dos partes: un bit bajo, identificado por una L (Low) al final del nombre, y un bit alto, identificado por una H (High) al final del nombre.

La nomenclatura de 16 bits combina la L y la H, y las reemplaza con una X. Mientras que para los registros Stack Pointer, Base Pointer, Source Pointer y Destination únicamente elimina la L.

En los 32 bits, el acronimo del registro utiliza una E al inicio, significa extendido. Mientras que la arquitectura de 64 bits, la E es reemplazada con una R.

Lo siguiente resume las nomenclaturas utilizadas:

Nomenclatura Arquitectura

En adición a los 8 registros de propósito general, existe otro registro que es importante: EIP (nomenclatura X86). Instruction Pointer (EIP) controla la ejecución del programa almacenando un puntero a la dirección de la siguiente instrucción (lenguaje máquina) que sera ejecutada, en otras palabras le indica al CPU en donde es la siguiente instruccion.

En el siguiente post de arquitectura veremos el proceso de memoria, la pila, endianness y NOPs.

Pura Vida!!!

D3N.