Wat is een integer overflow?
Deze FAQ antwoord was geschreven door k4thryn:
Een integer overflow, of integer inwikkeling, is een potentieel probleem in een programma gebaseerd op het feit dat de waarde die kan worden gehouden in een numeriek datatype wordt beperkt door het soort gegevens de grootte in bytes. ANSI C gebruikt de volgende minimumafmetingen:
| gegevenstype | grootte (bytes) |
|---|---|
| char | 1 |
| kort | 2 |
| int | 2 |
| lang | 4 |
In de praktijk veel samenstellers gebruik van een 4-byte int. Tevens moet worden opgemerkt dat de werkelijke marges voor de gegevens zijn afhankelijk van of ze al dan niet zijn gesloten. bijvoorbeeld een getekende 2-byte kort kan worden tussen -32767 en 32767, terwijl een niet-ondertekende kort kan worden tussen 0 en 65535. Zie je [ook] / limits.h bestand voor specifieke nummers voor je compiler.
Waarom zou u schelen? Als u probeert om een waarde in een data-type dat is te klein te houden, is de high-order bits zijn gedaald, en alleen de low-order bits zijn opgeslagen. Een andere manier om te zeggen dat is dat modulo-rekenkundig wordt uitgevoerd op de waarde voor het opslaan om ervoor te zorgen dat het past binnen het datatype. Rekening onze unsigned korte voorbeeld:
| Limiet: | 65535 of 1111 1111 1111 1111 |
| Te groot: | 65.536 of 1 0000 0000 0000 0000 |
| Wat is opgeslagen: | 0 of 0000 0000 0000 0000 |
Zoals uit bovenstaande maakt duidelijk, dat resultaat is, omdat de high-order (of meest linkse) wat de waarde die is te groot is gedaald. Of je zou kunnen zeggen dat wat er opgeslagen is het resultaat van
opgeslagen = waarde% (maximum + 1) of 65,536% (65.535 + 1) = 0
In ondertekend datatypes, het resultaat is een beetje anders dan anders en de resultaten in een aantal ogenschijnlijk raar gedrag:
| Positieve beperken: | 32767 of 0111 1111 1111 1111 |
| Te groot: | 32768 of 1000 0000 0000 0000 |
| Wat is opgeslagen: | -32768 |
Waarom is dat? Het is vanwege "2's compliment," dat is de manier waarop negatieve getallen zijn vertegenwoordigd in binary. Om een lang verhaal kort, de eerste helft van het bereik (0 tot en met 0111 1111 1111 1111) wordt gebruikt voor positieve getallen in volgorde van minst tot meest. de tweede helft van het assortiment wordt vervolgens gebruikt voor negatieve getallen in de volgorde van minst tot meest. zodat de negatieve reeks voor een ondertekende 2-byte korte is -32768 via -1, in die volgorde.
Je bent nog steeds de vraag waarom dit gebied, niet? Stel dat het geheugen wordt toegewezen op basis van een unsigned integer data type van de waarde. Als deze waarde is rond, het kan zijn dat veel te weinig geheugen beschikbaar zal worden gesteld. Of als een vergelijking wordt gemaakt tussen een ondertekende integer waarde en sommige ander nummer, in de veronderstelling dat de voormalige moet kleiner zijn dan de laatste, indien deze waarde is overvlogen naar de negatieve, de vergelijking zou passeren. Maar zijn dingen gaan gedragen, de manier waarop de programmeur bedoeld? Waarschijnlijk niet.
Aanvullende bronnen van informatie over integer overflows
Hoewel het buiten de werkingssfeer van dit artikel, zijn er andere middelen die het meer in detail over integer overflow bugs, de preventie en de exploitatie daarvan. Namelijk, zijn er twee zeer interessante artikelen in Phrack # 60 (een door Oded Horovitz, en een door blexim) op integer overflow kwetsbaarheden. Integer inwikkeling is ook opgenomen in de "professionele broncode accountantscontrole" presentatie van de 2002 USA Black Hat Briefings (Dowd, et ALS).
Een tool om te experimenteren met integer overflows
Het programma int_wrap.c kun je spelen met dit probleem te bepalen door op de opdrachtregel of de data type (korte) moet worden ondertekend of niet is ondertekend, en die waarde die u wilt gebruiken.
Opmerking: Perl lijkt te beschikken over een 250-cijferige limiet op het aantal, en sterft met de foutmelding "Aantal te lang" (versie 5.8.0 getest). Echter, het aantal significante cijfers is veel minder dan dat.
|






