Qu'est-ce qu'un Integer Overflow?
FAQ Cette réponse a été écrite par k4thryn:
Un dépassement d'entier, d'emballage ou entier, est un problème potentiel dans un programme fondé sur le fait que la valeur que peut avoir lieu dans un nombre de données est limité par le type de données de la taille en octets. ANSI C utilise les dimensions minimales suivantes:
| type de données | taille (en octets) |
|---|---|
| char | 1 |
| court | 2 |
| int | 2 |
| long | 4 |
Dans la pratique, la plupart des compilateurs un 4-byte int. Il convient également de noter que les fourchettes pour les types de données dépendent, qu'ils soient ou non signé. par exemple, la signature d'un 2-byte court mai entre -32767 et 32767, tandis que unsigned short mai entre 0 et 65535. Reportez-vous [y compris] / limits.h fichier de chiffres précis pour le compilateur.
Pourquoi devriez-vous des soins? Si vous essayez de mettre une valeur dans un type de données est trop petite pour le tenir, le haut-order bits sont abandonnées, et seul le bas afin bits sont stockés. Une autre façon de dire que c'est que modulo-arithmétique est réalisée sur la valeur avant de les ranger afin de vous assurer qu'il s'inscrit dans les données. Unsigned short Prenant notre exemple:
| Limite: | 65535 ou 1111 1111 1111 1111 |
| Trop grand: | 65.536 ou 1 0000 0000 0000 0000 |
| Quel est stocké: | 0 ou 0000 0000 0000 0000 |
Comme ci-dessus met en évidence, ce résultat est dû au fait que le haut-commande (ou la plus à gauche) bit de la valeur qui est trop gros est tombé. Ou vous pourriez dire que ce qui est stocké est le résultat de
= valeur stockée% (limite de + 1) ou 65,536% (65535 + 1) = 0
En signé de données, le résultat est un peu différente et les résultats en apparence étrange comportement:
| Positive limite: | 32767 ou 0111 1111 1111 1111 |
| Trop grand: | 32768 ou 1000 0000 0000 0000 |
| Quel est stocké: | -32768 |
Pourquoi ça? C'est en raison de "2 de compliment», ce qui est de savoir comment les nombres négatifs sont représentés en binaire. Pour rendre une longue histoire courte, la première moitié de la distance (de 0 à 0111 1111 1111 1111) est utilisé pour les nombres positifs en vue de moins à la plus grande. la seconde moitié de la gamme est ensuite utilisé pour les nombres négatifs dans l'ordre d'au moins les plus grands. de sorte que le négatif d'une gamme signé 2-byte est court -32.768 par -1, dans cet ordre.
Vous êtes toujours demandé pourquoi cette question est importante, n'est-ce pas? Supposons que la mémoire est allouée sur la base d'un type de données entier non signé de la valeur. Si cette valeur est enroulé autour, elle mai être que trop peu de mémoire sera disponible. Ou si une comparaison est faite entre un entier signé de valeur et nombre d'autres, à supposer que l'ancien devrait être inférieur à celui-ci, si cette valeur a survolé dans la négative, la comparaison devrait passer. Mais les choses vont se comporter de la façon dont le programmeur destiné? Probablement pas.
Autres sources d'information sur Integer Overflows
Alors qu'il est au-delà du champ d'application du présent article, il existe d'autres ressources qui vont en plus de bugs d'entier, de leur prévention, et leur exploitation. Notamment, il ya deux articles très intéressants dans Phrack # 60 (un par Oded Horovitz, et un par blexim) integer overflow sur les vulnérabilités. Integer emballage est également visé dans le "code source professionnelle d'audit de" présentation de la Black Hat USA 2002 Briefings (Dowd, et als).
Un outil d'expérimentation avec Integer Overflows
Le programme int_wrap.c vous permet de jouer avec ce problème en spécifiant sur la ligne de commande si le type de données (short) doivent être signés ou non signés, et dont la valeur que vous souhaitez utiliser.
Note: Perl semble avoir un chiffre de 250-limite sur le nombre, et meurt avec l'erreur "Nombre trop long" (version 5.8.0 testé). Toutefois, le nombre de chiffres significatifs est beaucoup moins que cela.
|






