Documentos de Académico
Documentos de Profesional
Documentos de Cultura
REVERSING
Daniel Kazimirow
Ricardo Narvaja
(2020)
https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format
00000000
Physical
Memory
Operating
Virtual System
Address
Space
Processor Other
Storage
(HD/
SWAP)
FFFFFFFF
43 4f 52 45
CORE o EROC
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
32 BITS 32 BITS
ESP SP
1 BYTE 1 BYTE
EBP BP
ESI SI
EDI DI
EIP
EFL
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
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
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0
not 1 = 0
not 0 = 1
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Original Empacado
Encuesta:
https://es.surveymonkey.com/r/2NXK8WP
https://www.coresecurity.com/core-labs/articles
Twitter:
Ricardo: @ricnar456
Solid: @solid_cls
Canal YouTube: https://www.youtube.com/channel/UCPNPSP20z4FGfgMJ71VOJjw
(cursoreversing)