¿Se puede expozar este código utilizando Desbordamiento de búfer?

-2

Tengo un fragmento de código que contiene un obvio desbordamiento de búfer en strcpy(buf, x) , ya que no comprueba si buf es lo suficientemente grande como para ajustarse a la cadena x . Me pregunto cómo explotar realmente este error.

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

Y así es como se llama la función desde main:

fun(argv[1]);

La técnica clásica para explotar un desbordamiento de búfer en la pila es sobrescribir la dirección de retorno con un puntero al código de shell. Esto ejecutará el código de shell una vez que ret haga estallar la dirección de retorno de la pila y salte a ella. Pero esta técnica no funcionará aquí porque la función fun no está regresando. En su lugar, se ejecuta exit(0) .

Además, no puedo realizar un ataque de cadena de formato porque printf se está usando de forma segura (creo). Al principio, pensé que esto no puede ser explotado. Luego hice una investigación y descubrí el código espeleología. Pero el problema es que el código espeleología requiere la modificación del binario.

Entonces, mi pregunta es ¿se puede explotar el desbordamiento de búfer en el código anterior? De lo contrario, ¿qué otras técnicas se pueden usar dado que no hay otro código vulnerable en main() ?

PS: Linux, 32 bits, Intel. Suponga que no hay activos como ASLR, etc. .

PS: Exploit debería dar como resultado que obtenga un shell de root .

    
pregunta David Mealy 05.03.2014 - 12:33
fuente

1 respuesta

2

Originalmente pensé que el código era vulnerable, sin embargo, después de leer el comentario de @CodesInChaos, decidí investigarlo más. Este código NO es vulnerable. Es posible para EIP, sin embargo, esto no tiene sentido, esto no cambiaría el flujo de ejecución. Si este código no contenía exit (0); Entonces sería posible explotar. Aquí hay una explicación. No pude trabajar con el código de fuente, así que lo modifiqué.

-#/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)  
    
respondido por el Tim Jonas 05.03.2014 - 14:11
fuente

Lea otras preguntas en las etiquetas