Cosa non è sicuro di questo codice?

0

Sto cercando di imparare lo sfruttamento binario e ho pensato di usare campioni online per allenarmi. Eccone uno che ho trovato, e non riesco a vedere per capire come sfruttarlo.

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

Sarebbe gradito se qualcuno potesse darmi una spiegazione dettagliata dell'uso, come funziona e come può essere mitigato.

Grazie!

    
posta rashidx 04.11.2016 - 15:44
fonte

1 risposta

3

fgets può leggere fino a 28 byte in un array da 8 byte.

char input[8];

...

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

Digita 28 byte di dati quando richiesto e esegui l'overflow della variabile input . Ciò significa che sia guess che number verranno sovrascritte con i primi 8 byte di dati oltre gli 8 byte che l'array può contenere. Qualsiasi altro dato fornito continuerà a sovrascrivere le protezioni dello stack e, infine, l'indirizzo di ritorno della funzione (e oltre).

Puoi saperne di più sui buffer overflow in questa domanda.

Questo può essere mitigato assicurandosi di non leggere più byte di quello che viene assegnato al buffer.

    
risposta data 04.11.2016 - 16:12
fonte

Leggi altre domande sui tag