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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  me pordrian explicar cual es la importancia de ebp+0x08?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: me pordrian explicar cual es la importancia de ebp+0x08?  (Leído 6,020 veces)
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
me pordrian explicar cual es la importancia de ebp+0x08?
« en: 28 Junio 2012, 23:28 pm »

hola

una pregunta

he visto que despues de encontrar kernel32 buscan las funciones

por ejemplo

Código
  1. push offset kernelbase ; direccion de kernel32.dll
  2.   push offset nLoadLibrary ; cadena de texto con: LoadLibraryA
  3.   push 0Dh ; longitud de LoadLibraryA + 1
  4.   call busca_libreria ; buscamos LoadLibraryA dentro de kernel32.dll
  5.  
  6.  
  7. mov eax, fs:[30h] ; puntero al PEB
  8.   mov eax, [eax+0ch] ; puntero a la estructura de datos
  9.   mov esi, [eax+1ch] ; extrae la primera entrada
  10.   lodsd ; avanza a la siguiente
  11.   mov eax, [eax+08h] ; obtiene la direccion base y la guarda en eax
  12.   ret
  13.  
  14.  
  15. ; ***************************************************************************
  16. ; Buscamos la direccion de una funcion dada la direccion base de una libreria
  17. ; ***************************************************************************
  18. busca_funcion:
  19.   mov eax, [esp+8] ; funcion apunta al nombre de la funcion (ej: LoadLibraryA)
  20.   mov funcion, eax
  21.   mov eax, [esp+12] ; base apunta a la base de la libreria (ej: kernel32.dll)
  22.   mov eax, [eax]
  23.   mov base, eax
  24.  
  25.  

Tengo una duda sobre las funciones

al inicio de busca_funcion... hay mov eax, [esp+8]

yo al principio creia o talvez no lo entiendo bien, que esp+8 era donde se habia guardado MZ

Código
  1. mov eax, [eax+08h]
  2.  

entonces quise hacer algo como esto para ir guardando en la pila los datos

Código
  1. mov    eax, [fs:0x30]  
  2. mov    eax, [eax + 0x0C]  
  3. mov    eax, [eax + 0x1C]    
  4. mov    eax, [eax]      
  5. mov    eax, [eax + 0x08]  
  6.  
  7. push ebp
  8. mov ebp, esp
  9. sub esp, 12
  10. mov edi, [ebp + 0x08]
  11. mov edx, edi
  12. add edx, [edi + 0x3C]
  13. mov [ebp - 0x0C], edx

al compilarlo no tuve problemas pero al ejecutarlo salia un error y se cerraba la aplicacion, pero...bueno, como uso windows 7 hay otra forma de encontrar kernel

Código
  1.                xor eax, eax
  2. mov eax, [fs:0x30]
  3. mov eax, [eax+0x0C]
  4. mov eax, [eax+0x0C]
  5. mov eax, [eax]
  6. mov eax, [eax]
  7. mov eax, [eax+0x18]

Entonces quise hacer algo como esto

Código
  1. xor eax, eax
  2. mov eax, [fs:0x30]
  3. mov eax, [eax+0x0C]
  4. mov eax, [eax+0x0C]
  5. mov eax, [eax]
  6. mov eax, [eax]
  7. mov eax, [eax+0x18]
  8.  
  9. push ebp
  10.        mov ebp, esp
  11. sub esp, 12
  12.  
  13. mov edi, [ebp + 0x08]
  14.  
  15. mov edx, edi
  16. add edx, [edi + 0x3C]
  17. mov [ebp - 0x0C], edx
  18.  

y tampoco tuve problemas y el error no me parecio, pero si se dan cuenta de algo, puse


Código
  1. mov edi, [ebp + 0x08]

lo cual me parecio que debia ser

Código
  1. mov edi, [ebp + 0x18]

al compilarlo tampoco hubo algun problema, pero al investigar mas me encontre con otro ejemplo, donde hace lo mismo que el primer ejemplo

Código
  1. LoadK32Function:
  2.       mov    eax, [fs:0x30]   ; address of PEB
  3.       mov    eax, [eax + 0x0C]   ; PEB->Ldr
  4.       mov    eax, [eax + 0x1C]    ; Ldr->InMemoryOrderModuleList (first element is ntdll.dll)
  5.       mov    eax, [eax]      ; InMemoryOrderModuleList->Flink (second element is kernel32.dll)
  6.       mov    eax, [eax + 0x08]   ; DllBase
  7.  
  8. push    ebp
  9. mov    ebp, esp
  10. sub   esp, 12      ; make room for 3 DWORDS
  11. mov    edi, [ebp + 0x08]    ; edi = DosHeader
  12. cmp word [edi], 'MZ'
  13. mov    edx, edi
  14. add    edx, [edi + 0x3C]  
  15. cmp word [edx], 'PE'
  16. jne    LoadK32Function_fail
  17. mov   [ebp - 0x0C], edx
  18.  
  19. _WinMain@16:
  20.  
  21.       push    LoadLibraryName
  22.       push    dword [Kernel32Addr]
  23.       call    LoadK32Function

Y aqui ya estoy confundido, que hace realmente ebp+0x08? porque al segundo ejemplo que puse de WinMain, si cambio de igual forma como encontrar kernel en sistemas windows 7, sigue funcionando ebp+0x08 pero si lo cambio a 0x18 ya no funciona

Código
  1.                xor eax, eax
  2. mov eax, [fs:0x30]
  3. mov eax, [eax+0x0C]
  4. mov eax, [eax+0x0C]
  5. mov eax, [eax]
  6. mov eax, [eax]
  7. mov eax, [eax+0x18]
  8.  
  9. push    ebp
  10. mov    ebp, esp
  11. sub   esp, 12      ; make room for 3 DWORDS
  12. mov    edi, [ebp + 0x18]    ; edi = DosHeader
  13. cmp word [edi], 'MZ'
  14. mov    edx, edi
  15. add    edx, [edi + 0x3C]  
  16. cmp word [edx], 'PE'
  17. jne    LoadK32Function_fail
  18. mov   [ebp - 0x0C], edx  

Esta es una explicacion que dieron pero no entiendo porque comenzar con 0x08

Citar
;------------------------------------
       ;          +-----------------------+
       ; ebp-0x0C | PE Header             |
       ;          +-----------------------+
       ; ebp-0x08 | Export table addr     |
       ;          +-----------------------+
       ; ebp-0x04 | AddressOfNames        |
       ;          +-----------------------+
       ; .....
       ;          +-----------------------+
       ; ebp+0x08 | kernel32 base address |
       ;          +-----------------------+
       ; ebp+0x0C | function name         |
       ;          +-----------------------+
       ;------------------------------------

espero me puedan ayudar con esta duda, porque me gustaria saber porque ebp tendria que comenzar con 0x08, porque no se si tambien podria haber comenzado con 0x04 y "function name" comenzar con 0x08 y si es "MZ" porque no comienza con 0x18, al principio tambien crei que era porque MZ era un DWORD pero es WORD, pero ahora no tengo idea sobre ebp, espero me puedan explicar

salu2
En línea

.                                 
YZT

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #1 en: 29 Junio 2012, 04:01 am »

http://win32assembly.online.fr/pe-tut7.html

Leete el formato PE si no vas andar y andar preguntando hasta que se cansen de darte explicaciones y empiezen los insultos.

Por cierto EBP es el registro que apunta a la base de la pila , pero generalmente dentro de las llamadas "funciones" se guarda esp en ebp y se usa para acceder a los datos que se ingresaron en la pila ..

Espero ser de ayuda

Salu2
En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #2 en: 29 Junio 2012, 06:39 am »

hola

es que y entendi PE, por eso no pido que me expliquen sobre eso, lo que quiero saber es porque ebp + 0x08 tiene a "MZ" si supuestamente deberia ser 0x18, o acaso 0x08 no tiene nada que ver con lo que se guarda en eax?

porque como lo menciono, tengo la idea que eax tiene "MZ", y al abrir la funcion con push ebp crei que para acceder a MZ otra vez tenia que ser 0x18 pero me aparece un error, y si le pongo 0x08 la aplicacion se executa bien

y al revisar otros ejemplos, veo que usan 0x08, pero porque?, de donde sale o porque se accede a ese hexadecimal?

porque bueno, ya entendi el formto PE, como llegar a EAT y que tengo que hacer una comparacion de de las funciones y al encontrarlas se guardan y luego se reutilizan y asi ya no se importa nada

porfavor, no pido explicacion de PE, solo de porque [ebp + 0x08] o [esp + 8]

se que

push ebp
mov ebp, esp
sub esp, 12

es para reservar espacio, algo de esto lo lei del manual de rodojos sobre exploits

espero me puedan ayudar, pero repito no es explicacion sobre formato PE ni como llegar a tal direccion ni nada de eso

salu2 y gracias
« Última modificación: 29 Junio 2012, 06:42 am por Belial & Grimoire » En línea

.                                 
Иōҳ


Desconectado Desconectado

Mensajes: 563


Ver Perfil
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #3 en: 29 Junio 2012, 07:45 am »

Porque no vas depurando y comparando estructuras?, como te dice YZT tienes que leerte el formato PE, de acuerdo a la base que tengas en el formato PE, y la documentación que tengas sobre las estructuras más que manejas (como el peb), no sería dificultad programar algo así.

Si lees el tute de zeropad que te puse en el anterior link, ahí está todo explicadito...

Saludos,
Nox.
En línea

Eres adicto a la Ing. Inversa? -> www.noxsoft.net
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #4 en: 29 Junio 2012, 08:10 am »

ya entendi el formato PE dice...
para saber cual es el problema de tu codigo, depura el codigo, sino os basta el depurador del compilador que usas pues hay
muchos otros
En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #5 en: 29 Junio 2012, 19:45 pm »

ok gracias, voy a seguir buscando

Nox, del link intente descargar el mas reciente archivo pero el doc me parece como dañado solo puedo ver el codigo y el doc creo del 2008 no se si solo esta por partes

bueno, voy a seguir intentando, lo frustante no es que no sepa como, porque de tanto que busque y lei, ya logre entender que debo hacer, los pasos son casi sencillos, buscar kernel32, buscar EAT y RVA, hacer comparacion de las funciones que necesito,   guardarlas y luego usarlas, bueno otra opcion es hacer comparaciones solo con el hash de las funciones, pero es frustante que pequeñas cosas como ebp+0x08 no lo entiendas y te tengas que detener

lo maximo que puedo imaginar es que cuando meto en la pila la funcion que necesito "db 'GetProcAddress'" son 4 bytes "0x04" y cuando meto la base de kernel32 como DWORD son 4 bytes "0x08" entonces seria

0x04 -->funcion
0x08 -->kernel32

push ebp
mov ebp, esp
/////////

y al meter esp en ebp

0x08 --> kernel32
0x0C --> funcion

mov edi, [ebp + 0x08] --> kernel32 --> "MZ"

bueno, tratare de seguirle por mi parte para no comenzar con problemas como menciono YZT, por lo menos el como hacerlo y que tengo que hacer, podria decir que ya tengo la idea, solo me hace falta practicar mas con ASM y ver el porque de varias cosas

gracias, salu2  ;-)
En línea

.                                 
Flamer


Desconectado Desconectado

Mensajes: 1.051


crack, crack y mas crack...


Ver Perfil WWW
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #6 en: 29 Junio 2012, 21:34 pm »

hola Belial aqui puedes descargar los 14 capitulos de la programacion de virus en asm de la web de ricardo:
Código:
http://ricardonarvaja.info/WEB/OTROS/PROGRAMACION%20DE%20VIRUS/
espero que tesirba yo lla enpese a leerlos pero me atore en un capitulo y decidi bajarme los capitulos de programacion de masm y radasm que son 7 creo y boy en el 4
saludos flamer
En línea

Mi Canal De Youtube y Blog

https://elblogdeflamer.blogspot.com

zu-zu

Desconectado Desconectado

Mensajes: 31



Ver Perfil
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #7 en: 30 Junio 2012, 03:02 am »

Código:
push ebp
mov ebp, esp
;sub esp,x ; opt

;EBP = Valor anterior de EBP
;EBP+4 = Dirección de retorno
;EBP+8 = 1er parámetro
;EBP+C = 2do parámetro
;...etc

mov esp, ebp
pop ebp
retn cArgs*4

Cuando vemos algo así, es porque estamos frente a una función de alto nivel o "stack frame". Un stack frame permite manejar parámetros y/o variables locales (espacio reservado en la stack restando una cantidad determinada al registro Extended Stack Pointer o "ESP").

También existen los opcodes "ENTER" y "LEAVE" que se encargan de crear y liberar el stack frame.

Funcionamiento de un stack frame :

Código:
push 0
push 1234
call fnExample
ret

fnExample:
push ebp
mov ebp, esp

mov eax, dword ptr[ebp+0x08] ; eax = 1234
mov eax, dword ptr[ebp+0x0C] ; eax = 0

leave
retn 2*4

PD: Ahora que puedo darme el gusto de leer completamente el hilo, sería recomendable que en vez de usar funciones que encuentres por Internet, aprendas a programar correctamente en ASM ya que tus dudas son muy básicas, y el código del ejemplo que has facilitado está terriblemente desorganizado. Además que no es nada complicado recorrer el Export Directory, comparar, y encontrar la función que se requiera.
« Última modificación: 30 Junio 2012, 03:14 am por zu-zu » En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: me pordrian explicar cual es la importancia de ebp+0x08?
« Respuesta #8 en: 30 Junio 2012, 03:28 am »

hola

Flamer

gracias por el link

zu-zu

lo siento,  :rolleyes:, llevo 2 meses usando ASM y todavia hay muchas cosas muy basicas que no entiendo, espero con mas practica pueda entender mas cosas

gracias, salu2
En línea

.                                 
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
uso de LSet tiene importancia?
Programación Visual Basic
LeandroA 2 1,683 Último mensaje 30 Noviembre 2008, 00:01 am
por LeandroA
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines