¿Qué tiene de inseguro este código?

0

Estoy tratando de aprender la explotación binaria, y pensé en usar muestras en línea para entrenarme. Aquí hay uno que he encontrado, y no puedo ver cómo descubrirlo.

int main(int argc, char** argv[])
{
  uint32_t number = 0;
  uint32_t guess = 0;
  char input[8] = {0};

  FILE* devRand = fopen("/dev/urandom", "rb");
  if(devRand == NULL)
  {
    printf("I can't think of a number");
    return EXIT_FAILURE;
  }

  fread(&number, 1, 4, devRand);
  fclose(devRand);

  printf("What number am I thinking of?\n");
  fflush(stdout);

  bool correct = false;
  do
  {
    fgets(&input[0], 28, stdin);
    guess = strtol(&input[0], NULL, 16);

    if (number == guess)
    {
      correct = true;
      printf("Yes!\n");
      fflush(stdout);
      system("/bin/sh");
    }
    else
    {
      printf("No\n");
      fflush(stdout);
    }

  }
  while(!correct);

  return EXIT_SUCCESS;
}

Se agradecería que alguien me diera una explicación detallada de la vulnerabilidad, cómo funciona y cómo puede mitigarse.

¡Gracias!

    
pregunta rashidx 04.11.2016 - 15:44
fuente

1 respuesta

3

fgets puede leer hasta 28 bytes en una matriz de 8 bytes.

char input[8];

...

fgets(&input[0], 28, stdin);

Escriba 28 bytes de datos cuando se le solicite y desbordará la variable input . Esto significa que tanto guess como number se sobrescribirán con los primeros 8 bytes de datos más allá de los 8 bytes que la matriz puede contener. Cuantos más datos proporcionados continuarán sobrescribiendo las protecciones de pila y, finalmente, la dirección de retorno de la función (y más allá).

Puede obtener más información sobre los desbordamientos de búfer en esta pregunta.

Esto puede mitigarse asegurándose de no leer en más bytes de los que se asigna el búfer.

    
respondido por el RoraΖ 04.11.2016 - 16:12
fuente

Lea otras preguntas en las etiquetas