Avvio di una nuova shell in un exploit strcpy utilizzando l'overflow del buffer

1

Sto imparando i buffer overflow e ho questo codice vulnerabile che sto provando ad avviare una shell da:

#include <string.h>

void myfunction(char *arg);

int main(int argc, char **argv)
{
     myfunction(argv[1]);
     return 0;
}

void myfunction(char *arg)
{
    char stuff[8];
    strcpy(stuff, arg);
} 

Ho usato gdb per vedere il codice assembly e ho ricevuto le seguenti informazioni:

(gdb) disassemble main
Dump of assembler code for function main:
   0x08048434 <+0>:   push   %ebp
   0x08048435 <+1>:   mov    %esp,%ebp
   0x08048437 <+3>:   and    $0xfffffff0,%esp
   0x0804843a <+6>:   sub    $0x10,%esp
   0x0804843d <+9>:   mov    0xc(%ebp),%eax
   0x08048440 <+12>:  add    $0x4,%eax
   0x08048443 <+15>:  mov    (%eax),%eax
   0x08048445 <+17>:  mov    %eax,(%esp)
   0x08048448 <+20>:  call   0x8048454 <myfunction>
   0x0804844d <+25>:  mov    $0x0,%eax
   0x08048452 <+30>:  leave
   0x08048453 <+31>:  ret
End of assembler dump.

Non sono sicuro da dove andare. Qualsiasi consiglio e procedura dettagliata sarebbe molto utile.

    
posta cook1992 26.11.2013 - 23:25
fonte

1 risposta

0

Per prima cosa devi sapere come è organizzata la memoria del programma. Ci sono tre aree:

  • Sezione codice (hai scaricato questa sezione)
  • Sezione dati
  • Stack (il più interessante)

Quando la funzione principale chiama myfunction, spinge nello stack in sequenza all'indirizzo di ritorno nel main e main frame pointer. Quindi lo spazio della dimensione di 8 byte, necessario per il char array, viene allocato nello stack.

Quando copi più dati nell'array rispetto alla sua dimensione, per prima cosa sostituisci il puntatore del frame principale (4 byte su architettura x86 a 32 bit) e quindi sostituisci l'indirizzo di ritorno (anche 4 byte). La parte divertente è l'override dell'indirizzo di ritorno in modo tale che l'indirizzo di ritorno punta all'inizio del char array durante il riempimento di questo array con il codice shell. Come risultato, il programma esegue un array pieno di istruzioni.

Il problema è che i compilatori di oggi adattano le protezioni di overflow dello stack per impostazione predefinita. Per l'apprendimento proposto puoi usare un semplice compilatore tcc invece di gcc. Il primo non protegge da questo tipo di overflow.

Infine, come riferimento, raccomando le lezioni di Open Security Training che possono essere trovate qui: link . Ce n'è uno chiamato "Introduzione agli exploit software (Exploits 1)".

    
risposta data 27.11.2013 - 14:19
fonte

Leggi altre domande sui tag