6.3 KiB
Prekoracenje celih brojeva
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite svoju kompaniju reklamiranu na HackTricks-u ili da preuzmete HackTricks u PDF formatu proverite PLANOVE ZA PRIJATELJSTVO!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte Porodicu PEASS, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
U srcu prekoracenja celih brojeva je ograničenje koje nameću veličine tipova podataka u programiranju i interpretacija podataka.
Na primer, 8-bitni neoznačeni ceo broj može predstavljati vrednosti od 0 do 255. Ako pokušate da sačuvate vrednost 256 u 8-bitnom neoznačenom celom broju, ona će se preklopiti na 0 zbog ograničenja njegove skladišne sposobnosti. Slično tome, za 16-bitni neoznačeni ceo broj, koji može držati vrednosti od 0 do 65.535, dodavanje 1 na 65.535 će preklopiti vrednost nazad na 0.
Osim 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), ostavljajući 7 bitova za predstavljanje veličine. Najnegativniji broj je predstavljen kao -128 (binarno 10000000
), a najpozitivniji broj je 127 (binarno 01111111
).
Maksimalne vrednosti
Za potencijalne web ranjivosti veoma je zanimljivo znati maksimalne podržane vrednosti:
{% 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 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. To prevent integer overflow, it is important to check the result of arithmetic operations and ensure that the result does not exceed the maximum value that the data type can hold. {% 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;
}
Primeri
Čisti prekoračenje
Odštampani rezultat će biti 0 jer smo prekoračili karakter:
#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;
}
Pretvaranje potpisanog u nepotpisani oblik
Razmotrite situaciju u kojoj se potpisani celi broj čita iz korisničkog unosa, a zatim koristi u kontekstu koji ga tretira kao nepotpisani celi broj, bez odgovarajuće validacije:
#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;
}
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.
Ostali Primeri
- https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html
- Program samo validira poslednji bajt broja kako bi proverio veličinu unosa, stoga je moguće dodati bilo koju veličinu sve dok je poslednji bajt unutar dozvoljenog opsega. Zatim, unos stvara preplavljivanje bafera koje se iskorišćava sa ret2win.
- https://guyinatuxedo.github.io/35-integer_exploitation/puzzle/index.html
- Dajući par brojeva, saznajte koristeći z3 novi broj koji pomnožen sa prvom vrednošću daje drugu vrednost:
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
\
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite svoju kompaniju reklamiranu na HackTricks-u ili da preuzmete HackTricks u PDF formatu Proverite PLANOVE ZA PRIJAVU!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi](https://t.me/peass) ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.