Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: kub0x en 15 Marzo 2014, 15:53 pm



Título: Implementar Stack Trace (Walk through stack)
Publicado por: kub0x en 15 Marzo 2014, 15:53 pm
Buenas tardes foreros,

ando con un proyecto entre manos en C++ y me tocó implementar la parte del stack trace tanto en el tratamiento de excepciones como en las llamadas de las funciones clave.

La verdad que ésto me impresiono bastante y me gustaría plantear lo mismo en ASM.

En ASM tenemos que la pila se divide en stack frames (marcos de pila). El registro EBP apuntará al marco de pila actual, pero claro, cada frame tiene propio tamaño, por lo que me imposibilita el poder 'caminar' por la pila en busca de las direcciones de las funciones o métodos contenidos en la pila.

Para poder calcular el tamaño de una frame podriamos restar EBP y ESP, ya que a ESP le quitamos el tamaño de los parámetros y variables locales reservadas por la función.

¿Podría alguien encaminarme? En caso de conseguirlo entonces publicaría el code.

Un saludo!


Título: Re: Implementar Stack Trace (Walk through stack)
Publicado por: ThunderCls en 15 Marzo 2014, 16:52 pm
Para windows puedes usar las API's StackWalk64/CaptureStackBackTrace lee acerca de ellas en la MSDN para que veas como se usan  ;)
Saludos


Título: Re: Implementar Stack Trace (Walk through stack)
Publicado por: kub0x en 15 Marzo 2014, 22:02 pm
ando con un proyecto entre manos en C++ y me tocó implementar la parte del stack trace tanto en el tratamiento de excepciones como en las llamadas de las funciones clave.

Bueno como arriba dije, esta parte ya la tengo cubierta. CaptureBackStackTrace no es funcional a la hora de tratar con excepciones ya que no devuelve toda la Stack Trace, así que me pasé a StackWalk. Con StackWalk no he tenido ningún problema, actualmente funciona al pelo ;)

Os pido consejo porque me gustaría implementar una rutina que haga lo mismo en ASM.

Saludos!


Título: Re: Implementar Stack Trace (Walk through stack)
Publicado por: Eternal Idol en 16 Marzo 2014, 02:42 am
¿Ya tenes el codigo que necesitas en la API de Windows? Podes usar el WinDbg o el IDA para ver el codigo en cuestion.


Título: Re: Implementar Stack Trace (Walk through stack)
Publicado por: xv0 en 16 Marzo 2014, 18:11 pm
Por lo que entendi quieres una funcion que determine el tamaño de la pila no? O el espacio que gasta cada funcion?

Si es el primero, lo puedes implementar con codigo muy simple, que es mas o menos lo que dijiste, pero no tiene por que ser ebp, puede ser cualquier registro que apunte a una direccion anterior a esp.

Código
  1. .section .text
  2. .globl _start
  3.  
  4. movq %rsp, %rbp
  5. pushq %rax
  6. pushq %rax      ;------> imaginate que esos push son una llamada a una funcion
  7. sub %rsp, %rbp

Como se trata de un x64 los pushq restan 8 bytes en teoria la pila estaria en 16 bytes, tendrias 16 en rbp "o en cualquier otro registro" pero tambien puedes guardar datos en la pila sin decrementar esta, y ese metodo no valdria.

Un saludo.


Título: Re: Implementar Stack Trace (Walk through stack)
Publicado por: Arkangel_0x7C5 en 16 Marzo 2014, 19:21 pm
Si lo que quieres es ir localizando los stack frame para luego ver su tamaño, simplemente tienes que ir usando ebp para localizar el frame actual
Luego en [ebp] encontraras el valor anterior de ebp. por lo que solo tienes que hacer esto hasta llegar al final de la pila....

Saludos Ark