6.8 KiB
Ganzzahlüberlauf
Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
- Wenn Sie Ihr Unternehmen in HackTricks beworben sehen möchten oder HackTricks im PDF-Format herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merch
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud Github-Repositorys senden.
Grundlegende Informationen
Im Herzen eines Ganzzahlüberlaufs liegt die Begrenzung durch die Größe von Datentypen in der Computerprogrammierung und die Interpretation der Daten.
Beispielsweise kann ein 8-Bit-Unsigned-Integer Werte von 0 bis 255 darstellen. Wenn Sie versuchen, den Wert 256 in einem 8-Bit-Unsigned-Integer zu speichern, wird er aufgrund der Begrenzung seiner Speicherkapazität auf 0 zurückgesetzt. Ebenso wird bei einem 16-Bit-Unsigned-Integer, der Werte von 0 bis 65.535 speichern kann, durch Hinzufügen von 1 zu 65.535 der Wert auf 0 zurückgesetzt.
Darüber hinaus kann ein 8-Bit-Signed-Integer Werte von -128 bis 127 darstellen. Dies liegt daran, dass ein Bit zur Darstellung des Vorzeichens (positiv oder negativ) verwendet wird, sodass 7 Bits zur Darstellung des Betrags verbleiben. Die negativste Zahl wird als -128 dargestellt (binär 10000000
), und die positivste Zahl ist 127 (binär 01111111
).
Maximalwerte
Für potenzielle Web-Schwachstellen ist es sehr interessant, die maximal unterstützten Werte zu kennen:
{% tabs %} {% tab title="Rust" %}
fn main() {
let mut quantity = 2147483647;
let (mul_result, _) = i32::overflowing_mul(32767, quantity);
let (add_result, _) = i32::overflowing_add(1, quantity);
println!("{}", mul_result);
println!("{}", add_result);
}
{% endtab %}
{% tab title="C" %}
Integer-Overflow tritt auf, wenn eine Operation das Maximum oder Minimum eines Datentyps überschreitet. Dies kann zu unerwartetem Verhalten führen, wie z.B. dem Zurücksetzen des Zählers auf den niedrigsten Wert nach dem Erreichen des Maximums. Integer-Overflow kann von Hackern ausgenutzt werden, um Speicherfehler zu verursachen oder die Kontrolle über ein Programm zu übernehmen. Es ist wichtig, Eingaben zu validieren und Überlaufbedingungen in Code zu vermeiden, um Sicherheitslücken zu verhindern.
Ein Beispiel für Integer-Overflow ist die Verwendung von malloc
in C, um Speicher für ein Array zuzuweisen. Wenn die Größe des Arrays mit einem negativen Wert berechnet wird, kann Integer-Overflow auftreten und zu einer zu kleinen Speicherzuweisung führen, was zu einem Pufferüberlauf führen kann. Es ist wichtig, solche Szenarien zu erkennen und entsprechende Maßnahmen zu ergreifen, um Sicherheitslücken zu vermeiden.
Um Integer-Overflow zu vermeiden, sollten Entwickler sicherstellen, dass alle Berechnungen innerhalb der Grenzen des Datentyps bleiben und Eingaben validiert werden, um Überlaufbedingungen zu verhindern. Die Verwendung von sicheren Funktionen wie calloc
anstelle von malloc
kann ebenfalls dazu beitragen, Integer-Overflow zu vermeiden. Es ist wichtig, sich bewusst zu sein, wie Integer-Overflow auftreten kann, und entsprechende Vorkehrungen zu treffen, um die Sicherheit von Anwendungen zu gewährleisten.
{% endtab %}
#include <stdio.h>
#include <limits.h>
int main() {
int a = INT_MAX;
int b = 0;
int c = 0;
b = a * 100;
c = a + 1;
printf("%d\n", INT_MAX);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
Beispiele
Reines Überlauf
Das gedruckte Ergebnis wird 0 sein, da wir das Zeichen überlaufen haben:
#include <stdio.h>
int main() {
unsigned char max = 255; // 8-bit unsigned integer
unsigned char result = max + 1;
printf("Result: %d\n", result); // Expected to overflow
return 0;
}
Vorzeichenbehaftete in vorzeichenlose Konvertierung
Betrachten Sie eine Situation, in der eine vorzeichenbehaftete Ganzzahl aus Benutzereingaben gelesen und dann in einem Kontext verwendet wird, der sie als vorzeichenlose Ganzzahl behandelt, ohne ordnungsgemäße Validierung:
#include <stdio.h>
int main() {
int userInput; // Signed integer
printf("Enter a number: ");
scanf("%d", &userInput);
// Treating the signed input as unsigned without validation
unsigned int processedInput = (unsigned int)userInput;
// A condition that might not work as intended if userInput is negative
if (processedInput > 1000) {
printf("Processed Input is large: %u\n", processedInput);
} else {
printf("Processed Input is within range: %u\n", processedInput);
}
return 0;
}
Andere Beispiele
- https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html
- Es wird nur 1B verwendet, um die Größe des Passworts zu speichern, daher ist es möglich, es zu überlaufen und es glauben zu machen, dass seine Länge 4 beträgt, während es tatsächlich 260 beträgt, um den Längenprüfschutz zu umgehen.
- https://guyinatuxedo.github.io/35-integer_exploitation/puzzle/index.html
- Gegeben ein paar Zahlen, finden Sie mit z3 eine neue Zahl, die mit der ersten multipliziert die zweite ergibt:
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
- https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/
- Es wird nur 1B verwendet, um die Größe des Passworts zu speichern, daher ist es möglich, es zu überlaufen und es glauben zu machen, dass seine Länge 4 beträgt, während es tatsächlich 260 beträgt, um den Längenprüfschutz zu umgehen und im Stapel die nächste lokale Variable zu überschreiben und beide Schutzmechanismen zu umgehen.
ARM64
Dies ändert sich nicht in ARM64, wie Sie in diesem Blog-Beitrag sehen können.