Si può esporre questo codice usando Buffer Overflow?

-2

Ho un pezzo di codice che contiene un ovvio buffer overflow a strcpy(buf, x) poiché non controlla se buf è abbastanza grande da contenere la stringa x . Mi sto chiedendo come sfruttare questo bug.

void fun(char *x) {
    char buf[10];
    strcpy(buf, x);
    printf("You gave me this: %s", buf);
    exit(0);
}

Ed ecco come viene chiamata la funzione da main:

fun(argv[1]);

La tecnica classica per sfruttare un buffer overflow nello stack sovrascrive l'indirizzo di ritorno con un puntatore al codice shell. Questo eseguirà il codice shell una volta che ret pop modifica l'indirizzo di ritorno dallo stack e lo salta. Ma questa tecnica non funzionerà qui perché la funzione fun non viene restituita. Invece, viene eseguito exit(0) .

Inoltre, non posso eseguire un attacco di stringa formato perché printf viene usato in modo sicuro (credo). All'inizio pensavo che questo non potesse essere sfruttato. Poi ho fatto qualche ricerca e ho scoperto la speleologia del codice. Ma il problema è che la speleologia del codice richiede la modifica del file binario.

Quindi, la mia domanda è possibile sfruttare l'overflow del buffer nel codice precedente? In caso contrario, quali altre tecniche possono essere utilizzate dato che non esiste un altro codice vulnerabile in main() ?

PS: Linux, 32-bit, Intel. Supponi che nessuna protezione come ASLR ecc. sia attiva .

PS: lo exploit dovrebbe comportare l'ottenimento di una shell di root .

    
posta David Mealy 05.03.2014 - 12:33
fonte

1 risposta

2

Originariamente pensavo che il codice fosse vulnerabile, tuttavia dopo aver letto il commento di @CodesInChaos ho deciso di esaminarlo di più. Questo codice NON è vulnerabile. EIP è possibile, tuttavia questo non ha senso, ciò non cambierebbe il flusso di esecuzione. Se questo codice non contiene exit (0); Allora sarebbe possibile sfruttare. Ecco una spiegazione. La fornitura del codice con cui non ho potuto lavorare è stata modificata.

-#/home/tim/scripts/fun "'perl -e 'print "a"x22 . "\x21\x43\x65\x87";''"

Breakpoint 1, main (argc=2, x=0xbffff184) at mod2.c:6  
6   strcpy(buffer, x[1]);  
(gdb) info frame  
Stack level 0, frame at 0xbffff0f0:  
 eip = 0x8048486 in main (mod2.c:6); saved eip 0xb7e29905  
 source language c.  
 Arglist at 0xbffff0e8, args: argc=2, x=0xbffff184  
 Locals at 0xbffff0e8, Previous frame's sp is 0xbffff0f0  
 Saved registers:  
  ebp at 0xbffff0e8, eip at 0xbffff0ec  
(gdb) disas main  
Dump of assembler code for function main:  
   0x0804847d <+0>: push   %ebp  
   0x0804847e <+1>: mov    %esp,%ebp  
   0x08048480 <+3>: and    $0xfffffff0,%esp  
   0x08048483 <+6>: sub    $0x20,%esp  
=> 0x08048486 <+9>: mov    0xc(%ebp),%eax   
   0x08048489 <+12>:    add    $0x4,%eax  
   0x0804848c <+15>:    mov    (%eax),%eax  
   0x0804848e <+17>:    mov    %eax,0x4(%esp)  
   0x08048492 <+21>:    lea    0x16(%esp),%eax <-This is where EIP is overwritten   
   0x08048496 <+25>:    mov    %eax,(%esp)  
   0x08048499 <+28>:    call   0x8048340 <strcpy@plt>  
   0x0804849e <+33>:    lea    0x16(%esp),%eax  
   0x080484a2 <+37>:    mov    %eax,0x4(%esp)  
   0x080484a6 <+41>:    movl   $0x8048550,(%esp)  
   0x080484ad <+48>:    call   0x8048330 <printf@plt>  
   0x080484b2 <+53>:    movl   $0x0,(%esp)  
   0x080484b9 <+60>:    call   0x8048360 <exit@plt>  
End of assembler dump.  
(gdb) list  
1   #include <string.h>  
2   #include <stdlib.h>  
3   #include <stdio.h>  
4   void main(int argc, char *x[]) {  
5   char buffer[10];  
6   strcpy(buffer, x[1]);  
7   printf("You gave me this: %s\n", buffer);  
8   exit(0);  
9   }  
(gdb) break 7  
Breakpoint 2 at 0x804849e: file mod2.c, line 7.  
(gdb) cont  
Continuing.  

Breakpoint 2, main (argc=0, x=0xbffff184) at mod2.c:7  
7   printf("You gave me this: %s\n", buffer);  
(gdb) info frame  
Stack level 0, frame at 0xbffff0f0:  
 eip = 0x804849e in main (mod2.c:7); saved eip 0x87654321 <-EIP is overwritten   
 source language c.  
 Arglist at 0xbffff0e8, args: argc=0, x=0xbffff184  
 Locals at 0xbffff0e8, Previous frame's sp is 0xbffff0f0  
 Saved registers:  
  ebp at 0xbffff0e8, eip at 0xbffff0ec  
(gdb) cont  
Continuing.  
You gave me this: aaaaaaaaaaaaaaaaaaaaaa!Ce�  
[Inferior 1 (process 30432) exited normally] <-Program exists without a problem  
(gdb)  
    
risposta data 05.03.2014 - 14:11
fonte

Leggi altre domande sui tag