Come ottenere questo buffer overflow?

8

Sto cercando di capire l'overflow del buffer e sto lavorando con una semplice parte di codice, come di seguito.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int bof(char *str)
{
    char buffer[12];
    strcpy(buffer,str);
    return 1;
}

int main(int argc, char **argv)
{
    char str[517];
    FILE *badfile;

    badfile = fopen("badfile", "r");
    fread(str, sizeof(char), 517, badfile);
    bof(str);
    printf("Returned Properly\n");
    return 1;
}

Capisco che ho bisogno di iniettare il codice shell in "badfile", supponiamo che creo un file cattivo come questo:

char buffer[517];
FILE *badfile;
memset(&buffer, 0x90, 517);
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);

Lo inietto al 12 ° indice del buffer []? Sto affrontando un problema con quello. Ma credo che sia perché non è la posizione di ritorno. Devo calcolare la posizione di ritorno? Grazie.

    
posta nubela 09.10.2012 - 08:08
fonte

3 risposte

8

No, non proprio.

Ci sono due cose su cui concentrarsi:

  • Sovrascrivere l'indirizzo di ritorno. È necessario capire quali byte nel file finiranno per sovrascrivere l'indirizzo di ritorno. Supponiamo che questi siano byte 20-23 del file (per esempio).

  • La posizione dello shellcode. Dovresti inserire il codice shell più avanti nel file (ad esempio, vicino alla fine). Quindi è necessario prevedere quale indirizzo verrà caricato il codice shell nella memoria in. Supponiamo che A sia l'indirizzo in cui lo shellcode sarà caricato in memoria. Devi conoscere questo indirizzo, perché questo è quello che devi usare per sovrascrivere l'indirizzo di ritorno.

Una volta che conosci entrambi, sei a posto. Memorizzi il valore A nei byte 20-23 del file e il codice della shell in un secondo momento nel file in cui hai deciso di inserirlo.

Per capire queste due cose, dovrai controllare il layout dello stack.

  • Innanzitutto, trova lo spostamento tra la posizione in cui l'inizio di str viene visualizzato nello stack e la posizione in cui appare l'indirizzo di ritorno. Questo offset indica quale byte nel file finirà per sovrascrivere l'indirizzo di ritorno. Se questo offset è, diciamo, 20 byte, i byte 20-23 del file finiranno per essere scritti sopra l'indirizzo di ritorno. Per far funzionare l'attacco, 20 byte nel file devi inserire un valore nel punto in cui vuoi che il programma passi (l'indirizzo dell'inizio del tuo codice shell). Questo valore sovrascriverà l'indirizzo di ritorno. Il valore da mettere lì è l'indirizzo A sopra citato.

  • In secondo luogo, inserire il codice shell ancora più avanti nel file, prevedere quale indirizzo verrà memorizzato il codice shell in memoria una volta che il file viene letto in memoria e utilizzare quell'indirizzo iniziale come valore per sovrascrivere il ritorno indirizzo con.

Ti consiglio di leggere Smashing The Stack For Fun And Profit di Aleph One. Ha un eccellente tutorial sull'apprendimento di come sfruttare un exploit di sovraccarico del buffer. (Suggerimento: su sistemi moderni, assicurati di disabilitare manualmente ASLR e DEP prima, in modo che l'exploit funzioni.)

    
risposta data 09.10.2012 - 10:05
fonte
0

È sicuramente un overflow del buffer della vaniglia. Ma devi anche trovare l'offset esatto di dove il puntatore di ritorno è memorizzato nello stack. (Suggerimento: non è sicuramente di 12 byte, considera l'EBP salvato che è stato memorizzato). Hai ragione, devi anche calcolare l'indirizzo di ritorno del codice shell che inserisci nel file cattivo. Lasciate che vi avverta, dato che qui il buffer ha solo 12 byte, credo che sia difficile iniettare un codice shell da 12 byte in quello spazio. Guardati intorno per vedere se riesci a trovarne uno. Ma puoi inserire il codice shell nella parte successiva dello stack poichè il buf in main è lungo 517 byte. Ciò significa che i primi 12 byte del tuo file possono essere spazzatura.

Suggerimenti : link

Tratta il tutorial video sopra per bufferizzare gli overflow come una bibbia per i buffer overflow

Usa GDB, traccia il tuo codice, tieni d'occhio il puntatore dello stack, lo stack stesso.

    
risposta data 10.10.2012 - 02:27
fonte
0

Il tuo buffer è troppo piccolo per adattarsi al codice shell + indirizzo di ritorno. Rendilo un po 'più grande se hai intenzione di testare il concetto. Inoltre, puoi inserire lo shellcode in ENV.

    
risposta data 12.03.2014 - 08:24
fonte

Leggi altre domande sui tag