C++ Débordement De La Mémoire Tampon

Je suis en train de me former sur les dépassements de mémoire tampon et d'exploitation en C++. Je suis un intermédiaire en C++ mec, au mieux, si patient avec moi. J'ai suivi quelques tutos, mais voici un exemple de code pour illustrer ma question:

#include <string>
#include <iostream>

using namespace std; 

int main()
{
  begin:
  int authentication = 0;
  char cUsername[10], cPassword[10];
  char cUser[10], cPass[10];

  cout << "Username: ";
  cin >> cUser;

  cout << "Pass: ";
  cin >> cPass;

  strcpy(cUsername, cUser);
  strcpy(cPassword, cPass);

  if(strcmp(cUsername, "admin") == 0 && strcmp(cPassword, "adminpass") == 0)
  {
    authentication = 1;
  }
  if(authentication)
  {
    cout << "Access granted\n";
    cout << (char)authentication;
  } 
  else 
  {
    cout << "Wrong username and password\n";
  }

  system("pause");
  goto begin;
}

Je sais qu'il y a toutes sortes de mauvais juju ici avec cin << String, etc... de toute façon, quand j'entre dans un trop grand nombre de lettres (une tonne de A's par exemple) dans cUser et cPass, je viens d'obtenir une Violation d'Accès à partir de Visual Studio. Si, toutefois, j'type 20ish A's, puis un espace, puis un autre A en cUser, il saute de me demander de cPass (en supposant que parce qu'il a été rempli après le caractère espace causé l'appel précédent de cin de retour) et il suffit de m'en donne l'accès.

À ce point, et pourquoi, sont des données qui débordent dans "authentification" et pourquoi ça ne se passe lorsque je avoir de l'espace et non pas quand j'ai un million de As '... je n'ai jamais eu la "Violation d'Accès" lorsque j'utilise un espace dans l'entrée pour cUser.

system("pause"); goto begin; Nope, assez sûr que vous êtes un débutant.
Êtes-vous essayer d'obtenir le débordement et vous demandez-vous pourquoi il fait ça? Ou voulez-vous pas de débordement et demandent une solution? Aussi, vous ne devriez pas le système(). C'est une énorme porte dérobée pour un pirate.
Aussi, j'ai un programme appelé pause sur mon système qui lance des missiles nucléaires. Donc, je ne devrais pas exécuter votre programme.
pourquoi utilisez-vous le char arrarys lorsque vous avez inclus la chaîne d'en-tête ??? aussi goto et system("pause")... je ne peux pas punir votre auto plus que vous l'avez fait.
system("command") est requis par la norme et hérité par le C++, sur toutes les plateformes. Mais son comportement est complètement plate-forme spécifique. Sur certaines plates-formes, un hacker pourrait installer un fichier qui serait jugée et exécutée à la place de celui prévu.

OriginalL'auteur sraboy | 2012-01-09