Está en la página 1de 45

INTRODUCCION AL

REVERSING
Daniel Kazimirow
Ricardo Narvaja
(2020)

© HelpSystems LLC. All rights reserved.


All trademarks and registered trademarks are the property of their respective owners.
Que es Reversing ?

El reversing o ingeniería inversa es el proceso llevado a cabo con el objetivo de


obtener información o un diseño a partir de un producto, con el fin de determinar
cuáles son sus componentes y de qué manera interactúan entre sí y cuál fue el
proceso de fabricación.

2 Core Security, A HelpSystems Company. All rights reserved.


Herramientas

Cuando hacemos reversing de un binario hay 2 herramientas que son


fundamentales:

• Debugger: (OllyDbg – x64Dbg – Immunity Debugger - WinDbg) Se utiliza para ver


el comportamiento del binario mientras se esta ejecutando

• Desensamblador: (IDA Pro – Radare - Ghidra) Diseñado principalmente para


análisis de código estático (sin ejecutar el binario)

3 Core Security, A HelpSystems Company. All rights reserved.


El Formato PE

El formato Portable Ejecutable (PE) es un formato para archivos ejecutables, de


código objeto, bibliotecas de enlace dinámico (DLL), y otros usados en versiones de
32 bit y 64 bit del sistema operativo Microsoft Windows.

https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format

4 Core Security, A HelpSystems Company. All rights reserved.


El Formato PE

5 Core Security, A HelpSystems Company. All rights reserved.


El Formato PE

6 Core Security, A HelpSystems Company. All rights reserved.


Archivos Ejecutables

Info sobre el archivo Header Header size: 0x1000


bytes
Código ejecutable .text
Variables Inicializadas .data
Tabla de Importacion .idata
Recursos Secciones
.rsrc
Tabla de realocacion
.reloc
.xxxx
.yyyy

7 Core Security, A HelpSystems Company. All rights reserved.


La Memoria

00000000

Physical
Memory
Operating
Virtual System
Address
Space
Processor Other
Storage
(HD/
SWAP)
FFFFFFFF

8 Core Security, A HelpSystems Company. All rights reserved.


La Memoria

0x434f5245 (int, big endian) 0x45524f43 (int, little endian)

1000011 1001111 1010010 1000101

43 4f 52 45

CORE o EROC

9 Core Security, A HelpSystems Company. All rights reserved.


Acceso a Memoria

Byte 0 08 01 00 BD

Byte 4 31 AB 11 10
…………
………..
…………
………..
……….. …………

Byte 100 00 01 55 A7

Byte 104 00 01 55 A7

………… …………
………… …………

Byte n 41 42 43 44

10 Core Security, A HelpSystems Company. All rights reserved.


Los Registros

Un registro es una porción de memoria ultrarrápida contenida en el procesador que


sirve para almacenamiento de datos, tienen la ventaja de la rapidez de acceso y
contiene los datos necesarios para la ejecución del programa. En principio, casi
todos ellos pueden utilizarse libremente, pero cada uno tiene sus funciones
específicas.

11 Core Security, A HelpSystems Company. All rights reserved.


Los Registros (32 bits)

32 BITS 32 BITS

EAX EAX DWORD (4 bytes)


ECX AX WORD (2 bytes)
EDX AH AL
EBX

ESP SP
1 BYTE 1 BYTE
EBP BP

ESI SI
EDI DI

EIP
EFL

12 Core Security, A HelpSystems Company. All rights reserved.


Los Registros (32 vs 64 Bits)

13 Core Security, A HelpSystems Company. All rights reserved.


Calling Convention 32 vs 64 bits

En los sistemas de 32 bits los argumentos de las funciones se pasan por stack,
mientras que en 64 bits se pasan por registros. Los registros que se utilizan son:
RCX, RDX, R8 y R9, en caso de que la funcion tuviese mas de cuatro argumentos, los
restantes argumentos se pasan por stack.

32 bits 64 bits

14 Core Security, A HelpSystems Company. All rights reserved.


La Pila (Stack)

Es una porción de memoria que se utiliza para ir guardando determinados valores


que posteriormente serán recuperados. También, en los sistemas de 32 bits, se usa
para pasar los parametros de la funcion que vamos a invocar. La pila sigue la norma
LIFO (last in, first out) es decir, el ultimo valor que ingresa es el primero que sale y
funciona como si fuese una pila de platos.
La dirección para acceder al plato superior de la pila, está contenida en el registro
ESP y este valor va variando según se van añadiendo o retirando valores.

15 Core Security, A HelpSystems Company. All rights reserved.


x64Dbg

16 Core Security, A HelpSystems Company. All rights reserved.


Configurando x64Dbg

17 Core Security, A HelpSystems Company. All rights reserved.


Signed & Unsigned int

18 Core Security, A HelpSystems Company. All rights reserved.


Operaciones Logicas

Estas operaciones se ejecutan bit a bit siendo sus resultados segun se muestra en las
tablas que veremos a continuacion:
• AND El resultado es 1 si los dos operandos son 1, y 0 en cualquier otro caso.

1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
• OR El resultado es 1 si uno o los dos operandos es 1, y 0 en cualquier otro caso.

1 or 1 = 1
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0

19 Core Security, A HelpSystems Company. All rights reserved.


Operaciones Logicas

• XOR El resultado es 1 si uno y sólo uno de los dos operandos es 1, y 0 en cualquier


otro caso.

1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0

• NOT Simplemente se invierte el valor del único operando de esta función.

not 1 = 0
not 0 = 1

20 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones Logicas

AND: (Logical AND) Efectúa la operación AND entre cada uno de los bits de los dos
operandos.
OR: (Logical Inclusive OR) Efectúa una operación OR entre cada uno de los bits de los
dos operandos.
XOR: (Logical Exclusive OR) Efectúa una operación XOR entre cada uno de los bits de
los dos operandos.
NOT: (One's Complement Negation) Efectúa una operación NOT con cada uno de los
bits del único operando.

21 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Transferencia de Datos

MOV: (Move): Esta instruccion tiene 2 operandos, y copia el contenido del operando
de origen en el de destino, siendo el formato: MOV Destino, Origen
MOVSX: (Move with Sign-Extension): Copia el contenido del segundo operando en
el primero (de doble longitud que el segundo), rellenandose los bits sobrantes por la
izquierda con el valor del bit más significativo del segundo operando.
MOVZX: (Move with Zero-Extend) Es igual que Movsx, pero en este caso, los
espacios sobrantes los rellena siempre con ceros.
LEA: (Load Effective Address) Esta instruccion es similar a MOV con la diferencia que
NO ACCEDE A MEMORIA, es decir resuelve la operacion que esta entre corchetes sin
acceder a su contenido, pudiendo ser una direccion de memoria no valida.
XCHG: (Exchange Register/Memory with Register) Intercambia los valores entre los
dos operandos.

22 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones Aritméticas

INC: (Increment by 1) Incrementa el valor en 1.


DEC: (Decrement by 1) Decrementa el valor en 1.
ADD: (Add) Suma los dos operandos y guarda el resultado en el primero.
SUB: (Substract) Resta el Segundo operando del primero y guarda el resultado en el
primero.
MUL: (Unsigned Multiply) Multiplica EAX por un valor indicado sin tener en cuenta
el signo. El resultado se guarda en EDX:EAX
IMUL: (Signed Multiply) Multiplica teniendo en cuenta el signo. Puede tener hasta 3
operandos, en el primero es donde se guardar el resultado y debe ser siempre un
registro.

23 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones Aritméticas

DIV: (Unsigned divide) Divide EAX por el Segundo operando y el resultado lo guarda
en EAX y el resto en EDX.
IDIV: (Signed Divide) Igual que la anterior pero considera el signo.

24 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Comprobacion

CMP: (Compare Two Operands) La comparación entre dos valores es en realidad una
resta entre ambos, pero no guarda el resultado, por lo tanto no altera el valor de los
registros, en su lugar, de acuerdo al resultado, puede modificar los flags CF, OF, SF,
ZF, AF y PF. Por lo general luego de esta instruccion encontraremos un salto
condicional que se ejecutara o no dependiendo del resultado de la comparacion.
TEST: (Logical Compare) Esta operacion es similar a CMP, una operacion entre dos
operandos que no guarda el resultado pero que puede cambiar el valor de ciertos
Flags (en este caso, SF, ZF y PF) y determina si el salto condicional que suele
acompañar a esta instrucción se debe efectuar o no. La principal diferencia con CMP
es que en lugar de tratarse de una resta, la operación que realiza es un AND. Es
usada principalmente para saber si determinados bits de uno de los operandos
están a 1 o 0., también se usa para saber si un valor es 0 al testear consigo mismo.

25 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Salto
Basicamente existen dos tipos de saltos: Incondicionales y Condicionales, estos
ultimos estan precedidos por una comparacion y se ejecutaran segun el resultado
de la misma.
JMP: (Jump) salta a la direccion indicada por el operando, puede ser una direccion
de memoria fija, un registro o al contenido de una direccion de memoria.
JE / JZ: (Jump if equal / Jmp if zero) Salta si el resultado de una comparacion es
igual / cero.
JNE / JNZ: (Jump if not equal / jmp if not zero) Salta si el resultado de una
comparacion no es igual / no es cero.
JA: (Jump if above) Salta si es mayor. No considera el signo.
JB: (Jump if below) Salta si es menor. No considera el signo.
JG: (Jump if great) Salta si es mayor. Considera el signo.
JL: (Jump if low) Salta si es m enor. Considera el signo.
26 Core Security, A HelpSystems Company. All rights reserved.
Assembler: Instrucciones de Desplazamiento

SHL: (Shift Left) Es una instruccion de desplazamiento logico hacia la izquierda. En la


práctica, lo que hacen es multiplicar el primer operando por dos, tantas veces como
lo indique el segundo.
SHR: (Shift Right) Instrucción de desplazamiento lógico a la derecha. En la práctica
significa dividir sin signo el primer operando por dos, tantas veces como indique el
segundo, redondeando el resultado.

27 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Stack

PUSH: (Push Word or Doubleword Onto the Stack) Resta del registro ESP la
longitud de su operando y coloca el valor en el stack.
POP: (Pop a Value from the Stack) Es la inversa de la operacion anterior, es decir,
incrementa el registro ESP, retira el valor de la pila y lo coloca donde indica el
operando.
PUSHAD: (Push All General-Purpose Registers) Guarda el contenido de los registros
en la pila en un orden determinado. Pushad equivale a: push EAX, ECX, EDX, EBX,
ESP, EBP, ESI, EDI.
POPAD: (Pop All General-Purpose Registers) Es la inversa de la anterior, restituye a
los registros a los valores recuperados de la pila en el orden inverso al que se
guardaron. Popad equivale a: pop EDI, ESI, EBP, EBX, EDX, ECX, EAX.

28 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Stack

PUSHFD: (Push EFLAGS Register onto the Stack) Coloca en el stack el valor del
registro EFLAGS.
POPFD: (Pop Stack value into EFLAGS Register) Es la inversa de la anterior.
CALL: (Call Procedure) Efectúa el salto al punto de inicio de la subrutina que estamos
llamando, pero antes de saltar, coloca en la pila la dirección de la instrucción
siguiente, que será el punto de retorno después de ejecutarse la subrutina.
RET: (Return from Procedure) Complementa a la anterior y se encuentra al final de la
funcion, tiene la misión de regresar a la instrucción siguiente a la de llamada a la
subrutina. Para ello, efectúa un salto a la dirección contenida en ESP, quedando el
stack como estaba antes del call.

29 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Bucle

LOOP: (Loop According to ECX Counter) Efectua un bucle el número de veces


determinado por el registro ECX., Equivale a las instrucciones dec ecx / jnz.

LOOPE / LOOPZ: El bucle se efectua si ECX es distinto de cero y ZF=1.

LOOPNE / LOOPNZ: El bucle se efectua si ECX es distinto de cero y ZF=0.

30 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Cadenas

REP: (Repeat String Operation Prefix) Se emplea en combinación con otras


instrucciones de cadenas: MOVS, LODS, STOS, etc y tiene la finalidad de repetir la
instrucción asociada una cantidad de veces determinada por el registro ECX, que se
ira decrementando en cada repetición, hasta llegar a cero. Las instrucciones
asociadas, están relacionadas con los registros ESI y EDI, por lo que en cada
repetición dichos registros se van incrementando o decrementando para apuntar
siempre a la posición de memoria correspondiente.
REPE (Repeat While Equal) / REPZ: (Repeat While Zero) Se combinan con CMPS y
SCAS. Son similares a REP, pero en este caso la repetición está condicionada a que el
contenido del registro ECX sea distinto de cero y a que ZF = 1

31 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Cadenas

REPNE (Repeat While Not Equal) / REPNZ: (Repeat While Not Zero): Son iguales a las
anteriores, con la diferencia de qué, para que se efectúe la repetición, el flag de cero
debe ser igual a cero, en lugar de igual a uno. MOVS
(MOVSB / MOVSW / MOVSD): (Move Data from String to String) Copian el
contenido de un espacio de memoria a partir de la dirección DS:ESI (source) a otro
espacio direccionado por ES:EDI (Destination). La longitud del espacio de memoria a
copiar en cada iteración está indicada por el sufijo de la instrucción (byte, word,
doubleword) y la cantidad de iteraciones por el contenido del registro ECX.
LODS (LODSB / LODSW / LODSD): (Load String): Copian un byte, word o
doubleword, de la dirección indicada por DS:ESI al registro AL, AX o EAX, según el
tamaño indicado por el sufijo de la instrucción.

32 Core Security, A HelpSystems Company. All rights reserved.


Assembler: Instrucciones de Cadenas

STOS (STOSB / STOSW / STOSD): (Store String): Copian el valor de AL, AX o EAX,
según el tamaño a copiar indicado por el sufijo de la instrucción, en la dirección
indicada por ES:EDI.
CMPS (CMPSB / CMPSW / CMPSD): (Compare String Operands): Comparan un byte,
word o doubleword de la dirección indicada por DS:ESI con el valor del mismo
tamaño situado en la dirección ES:EDI.
SCAS (SCASB / SCASW / SCASD): (Scan String): Comparan un byte, word o
doubleword de la dirección indicada por ES:EDI con el valor del registro AL, AX o
EAX, según el tamaño indicado por el sufijo de la instrucción.

33 Core Security, A HelpSystems Company. All rights reserved.


API’s (Application Programming Interface)

Son rutinas que ya estan incorporadas en las librerias (dll’s) del Sistema Operativo y
sirven para facilitar la tarea del programador y tambien para reducir el tamaño de
los programas, ya que no hace falta incluir esas rutinas en el ejecutable. Para
acceder a esas rutinas lo unico que necesitamos es tener cargadas dichas librerias
en la memoria e invocar a las funciones que necesitemos mediante la instruccion
CALL con los parametros necesarios para cada caso.

34 Core Security, A HelpSystems Company. All rights reserved.


Breakpoints

Los breakpoints son puntos de interrupción que podemos colocar para detener la
ejecución de un programa en una determinada parte del código. Existen 3 tipos de
breakpoints
1. SOFTWARE BREAKPOINT: son los mas comunes y en consecuencia los mas
fáciles de detectar. Podemos colocar una cantidad ilimitada. Lo que en definitiva
hacen es escribir una instrucción “int 3” (byte CC) que es una interrupción que
detiene la ejecución del programa.
2. HARDWARE BREAKPOINT: Son asignados por el procesador y esta limitado a 4
por proceso los cuales son almacenados en los registros DR0 DR1 DR2 y DR3.
Solo funciona en el mismo thread en el que fue colocado. Son detectables pero
se requiere de cierto conocimiento para hacerlo. Dentro de esta categoría
tenemos 3 tipos: On Access (cuando lee o escribe) On Write (cuando escribe) On
Execution (Cuando se ejecuta) y puede abarcar 1, 2 o 4 bytes de longitud.

35 Core Security, A HelpSystems Company. All rights reserved.


Breakpoints

3. MEMORY BREAKPOINT: Se aplican en una determinada zona de la memoria y


pueden abarcar gran cantidad de bytes e incluso una sección completa, en OllyDbg
solo se permitía uno por vez, y únicamente 2 tipos: On Access (Lectura/escritura) y
On Write (escritura), pero tanto la cantidad como el funcionamiento interno
depende de la implementación que cada Debugger le haya dado. Existen debuggers
como x64Dbg que permite colocar mas de uno, incluso por ejecución.

36 Core Security, A HelpSystems Company. All rights reserved.


Protecciones de Ejecutables (Packers)

Un Packer es una protección que sirve para dificultar la ingeniería inversa del código
del binario. Funciona encriptando el código y descomprimiéndolo una vez que se
esta ejecutando en memoria, de manera que cuando el archivo esta en disco, nunca
tenemos el código desencriptado. Pero en realidad estas protecciones no solo
encriptan, sino que también utilizan otras técnicas para evitar que en algún
momento podemos obtener un ejecutable completamente desencriptado y
reconstruido.

37 Core Security, A HelpSystems Company. All rights reserved.


Protecciones de Ejecutables (Packers)

Original Empacado

38 Core Security, A HelpSystems Company. All rights reserved.


Tecnicas de Proteccion

• Anti Debug / Anti Trace


• Code Obfuscation
• Stolen Bytes
• Stolen Code
• IAT Redirection
• Api Emulation
• Anti Dump
• Nanomites
• Virtual Machines

39 Core Security, A HelpSystems Company. All rights reserved.


Reconociendo el Compilador

40 Core Security, A HelpSystems Company. All rights reserved.


Reconociendo el Compilador

41 Core Security, A HelpSystems Company. All rights reserved.


Reconociendo el Compilador

42 Core Security, A HelpSystems Company. All rights reserved.


LINKS

Encuesta:
https://es.surveymonkey.com/r/2NXK8WP

Médicos sin Fronteras:


https://iniciativassolidarias.msf.es/en/fundraisers/curso-de-introduccion-al-reversin
g-a-beneficio-de-medicos-sin-fronteras

43 Core Security, A HelpSystems Company. All rights reserved.


Lecturas Recomendadas

Reversing and exploiting with free tools (Ricardo Narvaja):

https://www.coresecurity.com/core-labs/articles

Twitter:
Ricardo: @ricnar456
Solid: @solid_cls
Canal YouTube: https://www.youtube.com/channel/UCPNPSP20z4FGfgMJ71VOJjw
(cursoreversing)

44 Core Security, A HelpSystems Company. All rights reserved.


Any
Questions

45 Core Security, A HelpSystems Company. All rights reserved.

También podría gustarte