J'ai mentionné "débordements de tampon" dans un commentaire à la réponse de Pythagras, je devrais probablement clarifier ce que je voulais dire un peu. En C, il ne suffit pas de savoir que travailler directement avec la mémoire est dangereux - vous devez également comprendre les façons précises dont il est dangereux. Je n'aime pas vraiment la métaphore "se tirer dans le pied" pour tous ces cas - la plupart du temps, ce n'est pas vous qui appuyez sur la gâchette, mais souvent c'est un acteur avec des intérêts contraires au vôtre et / ou à vos utilisateurs '' .
Par exemple, dans une architecture avec une pile décroissante (les architectures les plus courantes correspondent à cette facture - x86 et ARM généralement inclus), lorsque vous appelez une fonction, l'adresse de retour de la fonction sera placée sur la pile après les variables locales définies dans le corps de la fonction. Donc, si vous déclarez un tampon en tant que variable locale et exposez cette variable au monde extérieur sans vérifier le dépassement de tampon, comme ceci:
void myFn(void) {
char buf[256];
gets(buf);
}
un utilisateur externe peut vous envoyer une chaîne qui écrase l'adresse de retour de la pile - en gros, il peut changer l'idée d'exécution de votre programme du call-graph qui mène à la fonction actuelle. Ainsi, l'utilisateur vous donne une chaîne qui est la représentation binaire d'un code exécutable pour votre architecture, suffisamment de remplissage pour déborder la pile myFn
et quelques données supplémentaires pour écraser l'adresse de retour pour myFn
pointer vers le code qu'il vous a donné. Si cela se produit, alors quand myFn
aurait normalement retourné le contrôle à son appelant, il se connectera au code fourni par l'utilisateur malveillant. Si vous écrivez du code C (ou C ++) susceptible d'être exposé à des utilisateurs non fiables, vous devez comprendre ce vecteur d'attaque. Vous devez comprendre pourquoi un débordement de tampon contre la pile est souvent (mais pas toujours) plus facilement exploitable qu'un autre contre le tas, et vous devez comprendre comment la mémoire du tas est disposée (pas trop en détail, nécessairement, mais le L'idée qu'une malloc()
région a des structures de contrôle qui l'entourent peut aider à comprendre pourquoi votre programme se bloque dans une autre malloc()
, ou dans free()
).
C vous expose à des détails de bas niveau sur le fonctionnement de votre machine, et il vous donne un contrôle plus direct sur votre machine que tout autre langage édité par l'utilisateur largement utilisé aujourd'hui. Une grande puissance s'accompagne d'une grande responsabilité - vous devez réellement comprendre ces détails de bas niveau afin de travailler avec C de manière sûre et efficace.