Perché lo stack non ha lo stesso indirizzo quando viene eseguito exec in GDB

1

Durante la scrittura di alcune sfide di base, scopro che gli exploit non funzionano se non vengono lanciati in GDB. Per verificare questo comportamento, i seguenti valori del registro di stampa del programma e l'indirizzo del codice:

#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();    
}

Se compilato con -fno-stack-protector e -z execstack e in esecuzione con ASLR disabilitato ( kernel.randomize_va_space=0 ) il programma restituisce:

call_me: 804841c 
esp: bffff720
ebp: bffff738

Ma quando si esegue all'interno di GDB, il programma restituisce:

call_me: 804841c
esp: bffff6f0
ebp: bffff708

Perché le differenze 0x30 per $ esp e $ ebp? GDB aggiunge qualcosa?

    
posta Kartoch 12.02.2014 - 14:11
fonte

1 risposta

2

La differenza è molto probabile a causa delle differenze nelle variabili ambientali del processo quando il programma viene eseguito con gdb rispetto a quando viene eseguito al di fuori di gdb . Poiché le variabili ambientali sono memorizzate nello stack, ciò può influire sulle posizioni di memoria.

    
risposta data 12.02.2014 - 14:23
fonte

Leggi altre domande sui tag