Heelgetal Oorloop

Reading time: 4 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Basiese Inligting

In die hart van 'n heelgetal oorloop is die beperking wat opgelê word deur die grootte van datatipes in rekenaarprogrammering en die interpretasie van die data.

Byvoorbeeld, 'n 8-bis ongetekende heelgetal kan waardes van 0 tot 255 voorstel. As jy probeer om die waarde 256 in 'n 8-bis ongetekende heelgetal te stoor, draai dit terug na 0 weens die beperking van sy stoor kapasiteit. Op soortgelyke wyse, vir 'n 16-bis ongetekende heelgetal, wat waardes van 0 tot 65,535 kan hou, sal die toevoeging van 1 aan 65,535 die waarde terugdraai na 0.

Boonop kan 'n 8-bis getekende heelgetal waardes van -128 tot 127 voorstel. Dit is omdat een bit gebruik word om die teken (positief of negatief) voor te stel, wat 7 bits laat om die grootte voor te stel. Die mees negatiewe getal word voorgestel as -128 (binêr 10000000), en die mees positiewe getal is 127 (binêr 01111111).

Maks waardes

Vir potensiële web kwesbaarhede is dit baie interessant om die maksimum ondersteunde waardes te ken:

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);
}

Voorbeelde

Eenvoudige oorgang

Die gedrukte resultaat sal 0 wees aangesien ons die char oorgeloop het:

c
#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;
}

Getekende na Ongetekende Omskakeling

Overweeg 'n situasie waar 'n getekende heelgetal van gebruikersinvoer gelees word en dan in 'n konteks gebruik word wat dit as 'n ongetekende heelgetal behandel, sonder behoorlike validering:

c
#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;
}

In hierdie voorbeeld, as 'n gebruiker 'n negatiewe getal invoer, sal dit geïnterpreteer word as 'n groot ongetekende heelgetal weens die manier waarop binêre waardes geïnterpreteer word, wat moontlik tot onverwagte gedrag kan lei.

Ander Voorbeelde

(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)

ARM64

Dit verander nie in ARM64 nie, soos jy kan sien in hierdie blogpos.

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks