Entendiendo el nuevo prólogo de gcc
Me preguntaba por qué gcc introdujo un nuevo prólogo (y también un epílogo) a las funciones, especialmente main (), ya que solo lo analicé. Por ejemplo, antes, era:
push ebp
mov ebp, esp
sub esp, 0x... ; Allocate memory space into the stack
; ... Some code
; Epilogue
leave
ret
Ahora esto es un poco más complejo (para entender, al menos):
lea ecx,[esp+0x4]
and esp,0xfffffff0
push DWORD PTR [ecx-0x4]
push ebp
mov ebp,esp
push ecx
sub esp,0x64
; Some code
; Epilogue
add esp,0x64
pop ecx
pop ebp
lea esp,[ecx-0x4]
ret
Entiendo lo que hace concretamente, pero no puedo entender elpropósito de eso ¿Es para hacer que la explotación (desbordamiento de pila) intente un poco más complicado? Otra convención de llamadas? ¿Solo para hacer la pila más segura? (Desde que me encontré con esto en un juego de guerra)
Finalmente, mi versión de gcc es: gcc versión 4.3.2 (Debian 4.3.2-1.1)
¡Gracias por adelantado!