Was ist ein Integer-Überlauf?
Diese FAQ Antwort wurde von k4thryn:
Ein Integer-Überlauf, oder Integer-Verpackung, ist ein potentielles Problem in einem Programm auf der Grundlage der Tatsache, dass der Wert, kann in einen numerischen Datentyp ist durch die Art der Größe in Bytes. ANSI-C verwendet folgende Mindestgrößen:
| Datentyp | Größe (Bytes) |
|---|---|
| char | 1 |
| kurz | 2 |
| Int | 2 |
| lang | 4 |
In der Praxis, viele Compiler eine 4-Byte-int. Es sollte auch darauf hingewiesen, dass die tatsächlichen reicht für die Datentypen hängt davon ab, ob oder nicht sie unterzeichnet werden. zum Beispiel, eine unterzeichnete 2-Byte kurz kann zwischen -32767 und 32767, während ein unsigned short kann zwischen 0 und 65535 liegen. Sehen Sie Ihre [ua] / limits.h-Datei für bestimmte Nummern für Ihren Compiler.
Warum sollten Sie das an? Wenn Sie versuchen, einen Wert in einen Datentyp zu klein ist, um sie sicher zu halten, die High-Bits sind gesunken, und nur die Low-Bits gespeichert sind. Eine andere Art zu sagen, dass ist, dass die Modulo-Arithmetik wird auf den Wert, bevor Sie ihn aufbewahren, um sicherzustellen, dass es passt in den Datentyp. Angesichts unserer unsigned short Beispiel:
| Limit: | 65535 oder 1111 1111 1111 1111 |
| Zu groß: | 65.536 oder 1 0000 0000 0000 0000 |
| Was gibt's gespeichert: | 0 oder 0000 0000 0000 0000 |
Da die oben macht deutlich, dass Ergebnis ist, weil die High-Auftrag (oder links-die meisten) etwas der Wert, der zu groß ist, fallen gelassen. Oder man könnte sagen, dass das, was gespeichert ist das Ergebnis der
gespeichert = Wert% (max. + 1) oder 65.536% (65535 + 1) = 0
In unterzeichnet Datentypen, ist das Ergebnis ein wenig anders und die Ergebnisse in einigen scheinbar seltsame Verhalten:
| Positive begrenzen: | 32767 oder 0111 1111 1111 1111 |
| Zu groß: | 32768 oder 1000 0000 0000 0000 |
| Was gibt's gespeichert: | -32768 |
Warum ist das? Es ist wegen der "2's Kompliment," die ist, wie negative Zahlen werden im Binär. Um eine lange Geschichte kurz, die erste Hälfte des Bereichs (0 bis 0111 1111 1111 1111) wird für die positiven Zahlen in der Reihenfolge der am wenigsten zur größten. der zweiten Hälfte der Serie ist dann verwendet werden, für negative Zahlen in der Reihenfolge der am wenigsten zur größten. so dass die negativen Bereich für eine unterzeichnete 2-Byte kurz ist -32768 bis -1, in dieser Reihenfolge.
Du bist immer noch fragen, warum diese Fragen, sind Sie nicht? Angenommen, Speicher zugewiesen wird auf der Grundlage eines unsigned integer Datentyp Wert. Wenn dieser Wert ist verpackt herum, kann es sein, dass viel zu wenig Speicher zur Verfügung gestellt werden. Oder wenn ein Vergleich gemacht werden zwischen vorzeichenbehafteten Integer-Wert und eine andere Zahl, vorausgesetzt, dass die ehemaligen sollten niedriger als die letztere, wenn dieser Wert in den negativen überflogen, den Vergleich würde. Aber sind die Dinge zu verhalten, wie die Programmierer gedacht? Wahrscheinlich nicht.
Zusätzliche Quellen von Informationen über Integer-Überläufe
Es ist zwar über den Rahmen dieses Artikels sprengen, gibt es andere Mittel, die mehr ins Detail gehen zu Integer-Überlauf-Fehler, der Verhütung und ihrer Nutzung. Nämlich, gibt es zwei sehr interessante Artikel in Phrack # 60 (eine von Oded Horovitz, und eine von blexim) auf Integer-Überlauf Schwachstellen. Integer Verpackung ist auch in der "Professional-Source-Code Audit" der Präsentation von 2002 USA Black Hat Briefings (Dowd, und ALS).
Ein Werkzeug zum Experimentieren mit Integer-Überläufe
Das Programm int_wrap.c können Sie spielen um mit diesem Problem, indem Sie auf der Befehlszeile, ob der Datentyp (kurz) unterzeichnet werden sollte oder nicht, und die Wert, den Sie verwenden möchten.
Hinweis: Perl hat eine 250-stellige Grenze von Zahlen, und stirbt mit der Fehlermeldung "zu lang" (Version 5.8.0 getestet). Allerdings ist die Zahl der signifikanten Stellen ist viel weniger.
|






