


Que signifie le dépassement de tampon dans les programmes C/C++ ?
1, Buffer Underflow
Cet article décrira une autre situation de débordement de tampon, c'est-à-dire un sous-débordement de tampon. Le débordement de tampon a été analysé dans la rubrique précédente (voir numéro 7). Les mêmes raisons s’appliquent aux dépassements de capacité de tampon, donc les facteurs qui provoquent des dépassements de tampon ne seront pas répétés dans cet article. Pour faire simple, le débordement de tampon fait référence à la situation dans laquelle le tampon de niveau suivant est écrasé lorsque les données de remplissage débordent. Cet article décrit les dangers du dépassement de capacité de mémoire tampon, ses signes dans le code source et comment résoudre le problème.
2. Les dangers du dépassement de tampon
Dans les programmes C/C++, le dépassement de tampon est un type grave de vulnérabilité qui peut provoquer des plantages de programmes ou l'exécution de code malveillant. De janvier à octobre 2018, un total de 494 informations sur les vulnérabilités CVE ont été impliquées. Certaines des vulnérabilités sont les suivantes :
CVE | Vulnérabilité aperçu |
---|---|
CVE-2018-1000001 | Libc Realpath buffer underflow La vulnérabilité est causée. par la bibliothèque GNU C pas correctement Traiter Le chemin relatif renvoyé par l'appel système getcwd(), d'autres bibliothèques sont également susceptibles d'être affectées par cela. Sur les systèmes concernés, les privilèges root peuvent être obtenus via le binaire SUID. |
CVE-2018-1000637 | zutils est un package utilitaire de traitement de fichiers compressés. Le programme prend en charge la compression/décompression, la comparaison de fichiers compressés et la vérification de l'intégrité des fichiers compressés. zcat est l'un des utilitaires de décompression. Une vulnérabilité de débordement de tampon existe dans zcat dans les versions antérieures à zutils 1.8-pre2. Un attaquant pourrait exploiter cette vulnérabilité pour provoquer un déni de service ou exécuter du code arbitraire à l'aide d'un fichier compressé spécialement conçu. |
CVE-2018-5388 | strongSwan 5.6.3 et les versions précédentes présentent une vulnérabilité de dépassement de tampon dans l'implémentation. Un attaquant peut exploiter cette vulnérabilité pour épuiser les ressources et provoquer un déni de service. |
3. Exemple de code
L'exemple provient de Samate Juliet Test Suite pour C/C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php), nom du fichier source : CWE121_Stack_Based_Buffer_Overflow__CWE193_char_alloca_cpy_01 .c.
3.1 Code de défaut
Dans l'exemple de code ci-dessus, le pointeur data
se voit attribuer une valeur à la ligne 36. Grâce à l'affectation opération, On peut voir que le pointeur data
pointe vers dataBadBuffer
, lorsque la ligne 41 utilise strcpy()
Lors de l'exécution d'une copie mémoire, la longueur du tampon source est supérieure à la longueur du tampon de destination, ce qui entraîne un débordement, et la partie de débordement dépasse la limite inférieure de dataBadBuffer
, provoquant des problèmes de sous-débordement de tampon. data
进行赋值,通过赋值操作可以看出指针 data
指向 dataBadBuffer
,当第41行使用 strcpy()
进行内存拷贝时,源缓冲区长度大于目的缓冲区长度从而产生溢出,溢出部分超出了 dataBadBuffer
的下边界,导致缓冲区下溢问题。
使用360代码卫士对上述示例代码进行检测,可以检出“缓冲区下溢”缺陷,显示等级为高。如图1所示:
图1:缓冲区下溢检测示例
3.2 修复代码
在上述修复代码中,Samate 给出的修复方式为:在第37行对指针 data
进行赋值,将 data
指向 dataGoodBuffer
,此时 data
的长度与 source
一致,当第42行使用 strcpy()

Figure 1 : Exemple de détection de sous-débordement de tampon
3.2 Code de réparation
données
vers dataGoodBuffer, à l'heure actuelle, la longueur des <code class="prettyprint code-in-text Prettyprinted">données
est la même que celle de la source code> est cohérent. Lorsque la ligne 42 utilise <code class="prettyprint code-in-text Prettyprinted">strcpy()
pour effectuer une opération de copie, le tampon source et le tampon de destination ont la même longueur, évitant ainsi. Correction d'un problème de dépassement de tampon. Ce problème peut également être évité par d'autres méthodes telles que les contrôles de limites. 🎜4. Comment éviter un sous-débordement de tampon🎜🎜🎜Pour éviter un sous-débordement de tampon, vous devez faire attention aux points suivants : 🎜🎜🎜 ( 1) Essayez d’éviter d’utiliser des fonctions de manipulation de mémoire non sécurisées. 🎜🎜🎜 (2) Pour les fonctions d'opération de mémoire qui ont une indication claire de la valeur de retour, la valeur de retour de la fonction doit être efficacement jugée pour déterminer si l'opération est réussie. 🎜🎜(3) La vérification des limites doit être effectuée lors du remplissage des données dans le tampon. 🎜🎜Utilisez 360 Code Guard pour détecter le code réparé, et vous pourrez voir que le défaut "buffer underflow" n'existe plus. Comme le montre la figure 2 :
Figure 2 : Résultats de détection après réparation
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





C Structure des données du langage: La représentation des données de l'arborescence et du graphique est une structure de données hiérarchique composée de nœuds. Chaque nœud contient un élément de données et un pointeur vers ses nœuds enfants. L'arbre binaire est un type spécial d'arbre. Chaque nœud a au plus deux nœuds enfants. Les données représentent StrustReenode {intdata; structTreenode * gauche; structureReode * droite;}; L'opération crée une arborescence d'arborescence arborescence (prédécision, ordre dans l'ordre et ordre ultérieur) Le nœud d'insertion de l'arborescence des arbres de recherche de nœud Graph est une collection de structures de données, où les éléments sont des sommets, et ils peuvent être connectés ensemble via des bords avec des données droites ou peu nombreuses représentant des voisins.

La vérité sur les problèmes de fonctionnement des fichiers: l'ouverture des fichiers a échoué: les autorisations insuffisantes, les mauvais chemins de mauvais et les fichiers occupés. L'écriture de données a échoué: le tampon est plein, le fichier n'est pas écrivatif et l'espace disque est insuffisant. Autres FAQ: traversée de fichiers lents, encodage de fichiers texte incorrect et erreurs de lecture de fichiers binaires.

C Guide de programmation multithreading Language: Création de threads: Utilisez la fonction PTHREAD_CREATE () pour spécifier l'ID de thread, les propriétés et les fonctions de thread. Synchronisation des threads: empêchez la concurrence des données via des mutex, des sémaphores et des variables conditionnelles. Cas pratique: utilisez le multi-lancement pour calculer le numéro Fibonacci, attribuer des tâches à plusieurs threads et synchroniser les résultats. Dépannage: résoudre des problèmes tels que les accidents de programme, les réponses d'arrêt de fil et les goulots d'étranglement des performances.

C Structure des données du langage: Aperçu du rôle clé de la structure des données dans l'intelligence artificielle dans le domaine de l'intelligence artificielle, les structures de données sont cruciales pour traiter de grandes quantités de données. Les structures de données fournissent un moyen efficace d'organiser et de gérer les données, d'optimiser les algorithmes et d'améliorer l'efficacité du programme. Les structures de données courantes utilisées couramment les structures de données dans le langage C comprennent: les tableaux: un ensemble d'éléments de données stockés consécutivement avec le même type. Structure: un type de données qui organise différents types de données ensemble et leur donne un nom. Liste liée: une structure de données linéaire dans laquelle les éléments de données sont connectés ensemble par des pointeurs. Stack: Structure de données qui suit le dernier principe de premier-out (LIFO). File: Structure de données qui suit le premier principe de première sortie (FIFO). Cas pratique: le tableau adjacent dans la théorie des graphiques est l'intelligence artificielle

Dépannage des conseils pour les fichiers de traitement du langage C Lors du traitement des fichiers dans le langage C, vous pouvez rencontrer divers problèmes. Les problèmes suivants sont des problèmes communs et des solutions correspondantes: Problème 1: Impossible d'ouvrir le code de fichier: fichier * fp = fopen ("myfile.txt", "r"); if (fp == null) {// ouverture de fichier a échoué} Raison: le fichier d'erreur de fichier Fichier ne existe pas sans la lecture de fichier Code de lecture de fichier: Charbuffer [100]; size_tread_bytes = Fread (tampon, 1, siz

La fonction ReadDir dans le système Debian est un appel système utilisé pour lire le contenu des répertoires et est souvent utilisé dans la programmation C. Cet article expliquera comment intégrer ReadDir avec d'autres outils pour améliorer sa fonctionnalité. Méthode 1: combinant d'abord le programme de langue C et le pipeline, écrivez un programme C pour appeler la fonction readdir et sortir le résultat: # include # include # include # includeIntmain (intargc, char * argv []) {dir * dir; structDirent * entrée; if (argc! = 2) {

C convient à la programmation système et à l'interaction matérielle car elle fournit des capacités de contrôle proches du matériel et des fonctionnalités puissantes de la programmation orientée objet. 1) C Grâce à des fonctionnalités de bas niveau telles que le pointeur, la gestion de la mémoire et le fonctionnement des bits, un fonctionnement efficace au niveau du système peut être réalisé. 2) L'interaction matérielle est implémentée via des pilotes de périphérique, et C peut écrire ces pilotes pour gérer la communication avec des périphériques matériels.

CLORATION DE FICHIER DE LANGUE C: LIRE Le traitement des fichiers de fichiers est une partie cruciale de la programmation de langage C, qui permet aux programmes d'interagir avec des périphériques de stockage externes tels que les disques et les lecteurs flash. Cet article explorera comment lire des fichiers dans le langage C. Étapes pour lire un fichier pour ouvrir le fichier: utilisez la fonction fopen pour ouvrir le fichier. Cette fonction nécessite deux paramètres: nom de fichier et mode ouvert. Vérifiez si le fichier est ouvert: vérifiez si le pointeur renvoyé par la fonction FOPEN est nul. Si NULL, le fichier ne peut pas être ouvert. Lire Fichier: Utilisez la fonction Fread pour lire les données du fichier vers le tampon. Cette fonction nécessite quatre paramètres: adresse de tampon, taille de l'élément tampon, nombre d'éléments à lire et pointeur de fichier. Fermez le fichier: utilisez f
