¿Por qué la pila no está en la misma dirección cuando exec se ejecuta en GDB?

1

Durante la escritura de algunos desafíos básicos, descubro que las vulnerabilidades no funcionan si no se lanzan en GDB. Para probar este comportamiento, el siguiente programa imprime los valores de registro y la dirección del código:

#include <stdint.h>

intptr_t esp;
intptr_t ebp;

void call_me()
{
  asm("movl %%esp, %0" : "=r" (esp) );
  asm("movl %%ebp, %0" : "=r" (ebp) );
  printf("call_me: %8x\n", call_me);
  printf("esp: %8x\n", esp);
  printf("ebp: %8x\n", ebp);
}


int main(char *argv[], int argc) 
{
   call_me();    
}

Cuando se compila con -fno-stack-protector y -z execstack y se ejecuta con ASLR deshabilitado ( kernel.randomize_va_space=0 ), el programa devuelve:

call_me: 804841c 
esp: bffff720
ebp: bffff738

Pero cuando se ejecuta dentro de GDB, el programa devuelve:

call_me: 804841c
esp: bffff6f0
ebp: bffff708

¿Por qué las diferencias de 0x30 para $ esp y $ ebp? ¿GDB agrega algo?

    
pregunta Kartoch 12.02.2014 - 14:11
fuente

1 respuesta

2

La diferencia es muy probable debido a las diferencias en las variables ambientales del proceso cuando el programa se ejecuta con gdb en comparación con cuando se ejecuta fuera de gdb . Dado que las variables ambientales se almacenan en la pila, esto puede afectar las ubicaciones de la memoria.

    
respondido por el Ayrx 12.02.2014 - 14:23
fuente

Lea otras preguntas en las etiquetas