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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  duda add esp, 4 y crash
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda add esp, 4 y crash  (Leído 6,108 veces)
asmnb

Desconectado Desconectado

Mensajes: 10


Ver Perfil
duda add esp, 4 y crash
« en: 12 Agosto 2011, 05:02 am »

hola ando decidio a apreder asm  :silbar:, trato de compilar este pequeño programa pero no anda (pero compila), compilado con fasm. agradeceria sus correcciones de las cosas que esten mal . mi duda primero es porque no anda y  despues tube que comentar los add esp, 4 que estaban originalmente en el codigo porque no entiendo bine su funcion, si entiendo que suma 4 (un doble palabra) a puntero pila pero no entiendo el objetivo. gracias  :-*
Código:

format pe console
entry main
include 'c:\fasm\include\win32a.inc'
section ".data" data readable writeable
 

hello db 'Hello, world!'
pausa db 'pause'

section ".code" code readable writeable

main:
 
push hello
call printf
;add esp,4
 
push pausa
call system
;add esp,4
 
mov eax,0
ret

section ".idata" import data readable
library msvcrt, "msvcrt"
import msvcrt, printf, "printf" , system, "system"



« Última modificación: 12 Agosto 2011, 05:04 am por asmnb » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: duda add esp, 4 y crash
« Respuesta #1 en: 12 Agosto 2011, 10:44 am »

Para hacerla bien corta tenes que poner los nombres de las funciones importadas entre corchetes:

call [printf]
y
call [system]

Esto se debe a que el nombre por si mismo (printf, sleep, etc.) apunta a la sección de datos de tu programa donde el loader pone despues la direccion de la funcion cuando se carga el ejecutable. Cuando no usas los corchetes estas llamando a esa direccion y ahi no hay codigo sino un puntero a una funcion.

Los add los tenes que volver a poner, existen diferentes convenciones de llamada (las mas usadas en Windows son STDCALL y C) y la que usan estas dos funciones al ser de la Run Time de C (MSVCRT= Microsoft Visual C Run Time) es obviamente C. Esta convencion de llamada establece que el llamador es el encargado de sacar lo que puso en la pila (esto permite tener funciones con un numero de parametros variable como printf justamente), en este caso vos pasas un parametro en cada llamada y por eso despues ajustas la pila sumandole el valor de un DWORD.


Código
  1. format pe console
  2. entry main
  3. include 'win32a.inc'
  4. section ".data" data readable writeable
  5.  
  6.  
  7. hello db 'Hello %d!', 0
  8. year dd 2011
  9.  
  10. section ".code" code readable writeable
  11.  
  12. main:
  13. ;db 0xCC
  14. push [year]
  15. push hello
  16. call [printf]
  17. add esp,8
  18.  
  19. mov eax,0
  20. ret
  21.  
  22. section ".idata" import data readable
  23. library msvcrt, "msvcrt"
  24. import msvcrt, printf, "printf"

Si hay algo que no entendes lo mejor que podes hacer es descomentar el breakpoint (db 0xCC) y depurar el programa con el WinDbg asi vas a ir viendo por ejemplo que hay en la pila en cada paso (dd @esp).


« Última modificación: 12 Agosto 2011, 10:46 am por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: duda add esp, 4 y crash
« Respuesta #2 en: 13 Agosto 2011, 14:35 pm »

Solo un pequeño agregado, si usas funciones de la c runtime, y no quieres estar contando la cantidad de parametros que pushas para luego hacer add esp, X....

fasm te lo puede hacer por vos, win32a.inc incluye la macro ccall y cinvoke.
Código:
ccall [printf], szStr, szMessage

;y si no quieres usar los corchetes a cada rato, usa el equivalente

cinvoke printf, szStr, szMessage
ccall va convertir el codigo en:
Código:
push szMessage
push szStr
call [printf]
add esp, 8


saludos.

http://www.serviciotecnicocelular.com
« Última modificación: 29 Agosto 2011, 23:01 pm por _Enko » En línea

asmnb

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: duda add esp, 4 y crash
« Respuesta #3 en: 13 Agosto 2011, 18:31 pm »

gracias  ;-) entendi todo lo que explicaron x zuerte  :xD
si tengo mas dudas las voy a decir de nuevo
chau
En línea

asmnb

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: duda add esp, 4 y crash
« Respuesta #4 en: 13 Agosto 2011, 18:35 pm »


Código:
format PE console
entry main
include 'c:\fasm\include\win32a.inc'
section '.data' data readable writeable
msg db "hello world!",0
p db "pause>nul",0

section '.code' code readable executable
main:
push ebp
mov ebp,esp
sub ebp,4
mov dword [esp],msg
call [printf]
mov dword [esp],p
call [system]
mov dword [esp],0
call [exit]

section '.idata' import data readable
library msvcrt,'msvcrt.dll'
import msvcrt,\
printf,'printf',\
system,'system',\
exit,'exit'  

mas dudas me surgieron por favor necestio comprender esto

Código:
push ebp
mov ebp,esp
sub ebp,4

el registro ebp se usa  como auxiliar de la pila para dentro de las rutinas es verdad?
entonces entiendo que mueva esp a ebp para tener una copia, y despues porque substrae 4 (DWORD)  ? :huh:


y por otro lado me  pregunto, porque guarda la direccion de msg en esp?
osea seria como hacer un push msg? pero no me queda claro
Código:
mov dword [esp],msg
call [printf]

aparte no usa add, 4 en la pila luego de llamar :huh:

En línea

_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: duda add esp, 4 y crash
« Respuesta #5 en: 13 Agosto 2011, 21:09 pm »

Hola, en este caso, en si la linea "push ebp" no es para resguardar el valor de epb, porque en el codigo, el valor de ebp nunca se restaura.

es mas, cambia "push ebp" por "push 0" y veras el mismo resultado.
Es mas, aqui el mismo sin las lineas de mas.
Código:
push 0
mov dword [esp],msg
call [printf]
mov dword [esp],p
call [system]
mov dword [esp],0
call [exit]

despues del printf, no suma 4 a la pila, porque el valor pusheado se sigue utilizando. (mov dword[esp],p)

Finalmente, despues de exit, no se suma 4 a la pila porque exit, creo que no es cdecl, es decir, es stdcall  y se encarga de liberar la pila.
En realidad, de otra forma no podria ser, porque despues de call[exit] ya no se ejecuta mas codigo de tu programa, se termina.


Ahora, sobre push ebp/mov ebp, esp/....

Se utiliza para usar variables locales en los procedimientos sin perder el registro de los argumentos que se les pasa.
Código:
push 1234
push 2345
call  proca


;etc..............................


proca:
push ebp ;salvamos ebp original
mov ebp, esp
sub esp, 8  ;dejamos espacio para 2 variables locales

mov dword[ebp -8], 0 ;variable local 1
mov dword[ebp -4], 0 ;variable local 2

mov eax, [ebp + 8]; parametro 1
mov eax, [ebp + 12]; parametro 2

mov esp, ebp ;restauramos la pila quitanod
pop ebp ;las dos variables locales
ret 8 ;retornamos quitando 2 argumentos de la pila


Por cierto, de donde sacas esos ejemplos raros?
normalmente se haria
Código:
section '.code' code readable executable
main:
cinvoke printf, msg
cinvoke system, p
invoke exit, 0
tendria que buscar, pero exit no deberia ser cdecl sino stdcall, es decir restaura completamente la pila por si solo
En línea

asmnb

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: duda add esp, 4 y crash
« Respuesta #6 en: 14 Agosto 2011, 05:46 am »

gracias por la explicacion, voy a seguir estudiando esto. si vuelvo a tener dudas ya sabran de mi   :laugh:
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Smartcheck + Crash
Ingeniería Inversa
APOKLIPTICO 8 6,575 Último mensaje 31 Octubre 2008, 23:27 pm
por apuromafo CLS
Crash en IE
Hacking
dimitrix 8 4,716 Último mensaje 13 Junio 2011, 20:53 pm
por dimitrix
Duda sobre crash
Programación C/C++
Shout 2 1,956 Último mensaje 10 Octubre 2012, 21:38 pm
por Shout
Crash AppHangB1
Seguridad
JOSE_CRISANT 0 2,025 Último mensaje 3 Junio 2017, 12:24 pm
por JOSE_CRISANT
threads crash riched20.dll vb net
Programación General
asdexiva 1 2,442 Último mensaje 9 Marzo 2019, 09:51 am
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines