me pordrian explicar cual es la importancia de ebp+0x08?

Iniciado por Belial & Grimoire, 28 Junio 2012, 23:28 PM

0 Miembros y 1 Visitante están viendo este tema.

Belial & Grimoire

hola

una pregunta

he visto que despues de encontrar kernel32 buscan las funciones

por ejemplo

Código (asm) [Seleccionar]
push offset kernelbase ; direccion de kernel32.dll
   push offset nLoadLibrary ; cadena de texto con: LoadLibraryA
   push 0Dh ; longitud de LoadLibraryA + 1
   call busca_libreria ; buscamos LoadLibraryA dentro de kernel32.dll


mov eax, fs:[30h] ; puntero al PEB
   mov eax, [eax+0ch] ; puntero a la estructura de datos
   mov esi, [eax+1ch] ; extrae la primera entrada
   lodsd ; avanza a la siguiente
   mov eax, [eax+08h] ; obtiene la direccion base y la guarda en eax
   ret


; ***************************************************************************
; Buscamos la direccion de una funcion dada la direccion base de una libreria
; ***************************************************************************
busca_funcion:
   mov eax, [esp+8] ; funcion apunta al nombre de la funcion (ej: LoadLibraryA)
   mov funcion, eax
   mov eax, [esp+12] ; base apunta a la base de la libreria (ej: kernel32.dll)
   mov eax, [eax]
   mov base, eax



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 (asm) [Seleccionar]
mov eax, [eax+08h]


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

Código (asm) [Seleccionar]
mov    eax, [fs:0x30]   
mov    eax, [eax + 0x0C]   
mov    eax, [eax + 0x1C]   
mov    eax, [eax]     
mov    eax, [eax + 0x08] 

push ebp
mov ebp, esp
sub esp, 12
mov edi, [ebp + 0x08]
mov edx, edi
add edx, [edi + 0x3C]
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 (asm) [Seleccionar]
                xor eax, eax
mov eax, [fs:0x30]
mov eax, [eax+0x0C]
mov eax, [eax+0x0C]
mov eax, [eax]
mov eax, [eax]
mov eax, [eax+0x18]


Entonces quise hacer algo como esto

Código (asm) [Seleccionar]
xor eax, eax
mov eax, [fs:0x30]
mov eax, [eax+0x0C]
mov eax, [eax+0x0C]
mov eax, [eax]
mov eax, [eax]
mov eax, [eax+0x18]

push ebp
        mov ebp, esp
sub esp, 12

mov edi, [ebp + 0x08]

mov edx, edi
add edx, [edi + 0x3C]
mov [ebp - 0x0C], edx


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


Código (asm) [Seleccionar]
mov edi, [ebp + 0x08]

lo cual me parecio que debia ser

Código (asm) [Seleccionar]
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 (asm) [Seleccionar]
LoadK32Function:
       mov    eax, [fs:0x30]   ; address of PEB
       mov    eax, [eax + 0x0C]   ; PEB->Ldr
       mov    eax, [eax + 0x1C]    ; Ldr->InMemoryOrderModuleList (first element is ntdll.dll)
       mov    eax, [eax]      ; InMemoryOrderModuleList->Flink (second element is kernel32.dll)
       mov    eax, [eax + 0x08]   ; DllBase

push    ebp
mov    ebp, esp
sub   esp, 12      ; make room for 3 DWORDS
mov    edi, [ebp + 0x08]    ; edi = DosHeader
cmp word [edi], 'MZ'
mov    edx, edi
add    edx, [edi + 0x3C] 
cmp word [edx], 'PE'
jne    LoadK32Function_fail
mov   [ebp - 0x0C], edx

_WinMain@16:

       push    LoadLibraryName
       push    dword [Kernel32Addr]
       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 (asm) [Seleccionar]
                xor eax, eax
mov eax, [fs:0x30]
mov eax, [eax+0x0C]
mov eax, [eax+0x0C]
mov eax, [eax]
mov eax, [eax]
mov eax, [eax+0x18]

push    ebp
mov    ebp, esp
sub   esp, 12      ; make room for 3 DWORDS
mov    edi, [ebp + 0x18]    ; edi = DosHeader
cmp word [edi], 'MZ'
mov    edx, edi
add    edx, [edi + 0x3C] 
cmp word [edx], 'PE'
jne    LoadK32Function_fail
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
.                                 

YZT

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

Belial & Grimoire

#2
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
.                                 

Иōҳ

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.
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

x64core

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

Belial & Grimoire

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  ;-)
.                                 

Flamer

hola Belial aqui puedes descargar los 14 capitulos de la programacion de virus en asm de la web de ricardo:

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

zu-zu

#7

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 :


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.

Belial & Grimoire

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
.