Integer Overflow
Last updated
Last updated
Naucite i vežbajte hakovanje AWS-a:HackTricks Training AWS Red Team Expert (ARTE) Naucite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)
U srcu prekoracenja celih brojeva je ogranicenje koje namecu velicine podataka u programiranju i interpretacija podataka.
Na primer, 8-bitni neoznaceni ceo broj može predstavljati vrednosti od 0 do 255. Ako pokusate da sacuvate vrednost 256 u 8-bitnom neoznacenom celom broju, ona se obavija nazad na 0 zbog ogranicenja njegove kapaciteta za cuvanje. Na isti nacin, za 16-bitni neoznaceni ceo broj, koji može držati vrednosti od 0 do 65,535, dodavanje 1 na 65,535 ce obaviti vrednost nazad na 0.
Pored toga, 8-bitni označeni ceo broj može predstavljati vrednosti od -128 do 127. To je zato što se jedan bit koristi za predstavljanje znaka (pozitivan ili negativan), ostavljajuci 7 bitova za predstavljanje velicine. Najnegativniji broj je predstavljen kao -128 (binarno 10000000
), a najpozitivniji broj je 127 (binarno 01111111
).
Za potencijalne web ranjivosti veoma je zanimljivo znati maksimalne podržane vrednosti:
Integer overflow occurs when an arithmetic operation results in a value that exceeds the maximum size that the data type can hold. This can lead to unexpected behavior in the program, such as wrapping around to a minimum value or causing a buffer overflow. Integer overflow can be exploited by an attacker to manipulate the program's behavior and potentially execute malicious code.
```c #include #include
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; }
Razmotrite situaciju u kojoj se potpisani ceo broj čita iz korisničkog unosa, a zatim koristi u kontekstu koji ga tretira kao nepotpisani broj, bez odgovarajuće validacije:
U ovom primeru, ako korisnik unese negativan broj, biće tumačen kao veliki neoznačeni broj zbog načina tumačenja binarnih vrednosti, što potencijalno može dovesti do neočekivanog ponašanja.
Koristi se samo 1B za čuvanje veličine lozinke, pa je moguće prekoračenje i naterati je da misli da je dužina 4, dok je zapravo 260, kako bi se zaobišla provera dužine
Dati par brojeva i koristeći z3 pronaći novi broj koji pomnožen sa prvom vrednošću daje drugu vrednost:
Koristi se samo 1B za čuvanje veličine lozinke, pa je moguće prekoračenje i naterati je da misli da je dužina 4, dok je zapravo 260, kako bi se zaobišla provera dužine i prepisala sledeća lokalna promenljiva na steku i zaobišla obe zaštite
Ovo se ne menja u ARM64 kao što možete videti u ovom blog postu.