elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Parchear ejecutable y direcciones de memoria
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Parchear ejecutable y direcciones de memoria  (Leído 2,630 veces)
jmpesp

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Parchear ejecutable y direcciones de memoria
« en: 25 Junio 2019, 15:47 pm »

Estoy teniendo el siguiente problema:

Digamos que abro un ejecutable con un debugger y agrego el siguiente codigo:

Código:
push rbp
mov rbp, rsp
push r9
push r8
push rdx
push rcx
sub rsp, 20
mov r9, 0
mov r8, 0x0000F7855219251      ; en esta direccion hay una cadena
mov rdx, 0x0000F7855219251    ; ^
mov rcx, 0
call user32.MessageBoxA
add rsp, 20
pop rcx
pop rdx
pop r8
pop r9
pop rbp

Funciona perfecto y sin problemas, pero a la hora de parchear el ejecutable y ejecutarlo de nuevo, las direcciones quedan obsoletas.

Es decir, la cadena ya no esta en 0x0000F7855219251 si no que se cargo en otra direccion diferente, lo mismo pasa con la direccion de user32.MessageBoxA.
Esto por supuesto produce que el programa crashee.

Para destacar: La cadena se carga en una direccion diferente, pero es la misma direccion relativa al codigo. Es decir, esta siempre a 55 bytes desde el inicio del codigo.
Lo mismo con la funcion MessageBoxA, pero la libreria user32 se carga en una direccion diferente.

Como puedo resolver este problema?

Gracias
« Última modificación: 25 Junio 2019, 16:13 pm por jmpesp » En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.470


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Parchear ejecutable y direcciones de memoria
« Respuesta #1 en: 25 Junio 2019, 20:14 pm »

Hola!

Todas las direcciones de los binsarios cambian cada vez que se ejecutan. Mas aun con ASLR. Para saber mas sobre el tema, busca info sobre la tabla de relocaciones de los binarios.

Ahora, para solucionar el problema, como bien has dicho, la direccion es relativa al inicio del ejecutable. Si miras en memoria, veras que aunque cambie la direccion, la "distancia" entre el encabezado MZ del binario y la cadena es la misma.

Para obtener la la direccion en que esta corriendo el binario, llama a GetModuleHandle con NULL (cero) y te devolvera la base del binario. Despues solo debes sumarle el offset (distancia) de la cadena y listo.

Si la API no esta en la IAT, vas a tener que usar un resolver.

Saludos!
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

jmpesp

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Parchear ejecutable y direcciones de memoria
« Respuesta #2 en: 25 Junio 2019, 20:47 pm »

Hola!

Todas las direcciones de los binsarios cambian cada vez que se ejecutan. Mas aun con ASLR. Para saber mas sobre el tema, busca info sobre la tabla de relocaciones de los binarios.

Ahora, para solucionar el problema, como bien has dicho, la direccion es relativa al inicio del ejecutable. Si miras en memoria, veras que aunque cambie la direccion, la "distancia" entre el encabezado MZ del binario y la cadena es la misma.

Para obtener la la direccion en que esta corriendo el binario, llama a GetModuleHandle con NULL (cero) y te devolvera la base del binario. Despues solo debes sumarle el offset (distancia) de la cadena y listo.

Si la API no esta en la IAT, vas a tener que usar un resolver.

Saludos!

El problema es que para llamar a GetModuleHandle (o a cualquier funcion de la API) necesito de igual manera conocer la direccion de esta funcion (kernel32 + offset).

Si en el desensamblador "hardcodeo" esta direccion (call kernel32.GetModuleHandle) va a suceder lo mismo.

Gracias por tu respuesta


En línea

LUX-FERO

Desconectado Desconectado

Mensajes: 4



Ver Perfil
Re: Parchear ejecutable y direcciones de memoria
« Respuesta #3 en: 27 Junio 2019, 16:42 pm »

HI.

Puede utilizar el ejemplo:

EIP - 350

o EDI - ..........

En lugar de un valor fijo.
Saludos.
En línea

jmpesp

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Parchear ejecutable y direcciones de memoria
« Respuesta #4 en: 27 Junio 2019, 17:42 pm »

HI.

Puede utilizar el ejemplo:

EIP - 350

o EDI - ..........

En lugar de un valor fijo.
Saludos.

Podria funcionar para localizar la cadena, no lo habia pensado.

Pero para localizar la funcion parece que voy a tener que parsear la cabecera PE.

Gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Parchear un ejecutable,posible en asm? « 1 2 »
ASM
Monica_Barcelona 14 9,623 Último mensaje 22 Abril 2010, 19:53 pm
por Eternal Idol
Direcciones de memoria
Programación C/C++
Maik33 4 2,589 Último mensaje 17 Octubre 2012, 14:48 pm
por Maik33
Duda direcciones de memoria C « 1 2 3 »
Programación C/C++
dRak0 23 9,139 Último mensaje 19 Julio 2013, 16:38 pm
por rir3760
Las direcciones virtuales de un ejecutable, ¿pueden variar?
Ingeniería Inversa
0x98364 3 3,189 Último mensaje 1 Junio 2018, 20:24 pm
por Geovane
Problema al parchear ejecutable para DOS con dosbox-x e ida
Ingeniería Inversa
principito 2 2,466 Último mensaje 23 Marzo 2023, 00:51 am
por principito
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines