Iniciar un nuevo shell en un exploit de strcpy usando un desbordamiento de búfer

1

Estoy aprendiendo sobre desbordamientos de búfer y tengo este código vulnerable del que estoy intentando iniciar un shell desde:

#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);
} 

Usé gdb para ver el código de ensamblaje y obtuve la siguiente información:

(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.

No estoy seguro de a dónde ir desde aquí. Cualquier consejo o tutorial sería muy útil.

    
pregunta cook1992 26.11.2013 - 23:25
fuente

1 respuesta

1

Primero necesita saber cómo está organizada la memoria del programa. Hay tres áreas:

  • Sección de código (has botado esta sección)
  • sección de datos
  • Pila (la más interesante)

Cuando la función principal llama a mi función, se empuja a la pila en la dirección de retorno de secuencia hacia el puntero de marco principal y principal. Luego, el espacio de 8 bytes, necesario para la matriz de caracteres, se asigna en la pila.

Cuando copia más datos en la matriz que su tamaño, primero invalide el puntero del cuadro principal (4 bytes en la arquitectura x86 de 32 bits) y luego invalide la dirección de retorno (también 4 bytes). La parte divertida es anular la dirección de retorno de tal manera que la dirección de retorno apunte al comienzo de la matriz de caracteres mientras llena esta matriz con código de shell. Como resultado, el programa ejecuta la matriz llena con sus instrucciones.

El problema es que los compiladores actuales adaptan las protecciones de desbordamiento de pila de forma predeterminada. Para el propósito del aprendizaje, puede usar el compilador tcc simple en lugar de gcc. El primero no protege contra este tipo de desbordamientos.

Finalmente, como referencia, recomiendo las clases de Open Security Training que se pueden encontrar aquí: enlace . Hay uno llamado "Introducción a las vulnerabilidades de software (explotaciones 1)".

    
respondido por el Topu 27.11.2013 - 14:19
fuente

Lea otras preguntas en las etiquetas