Integer Overflow

HackTricks'i Destekleyin

Temel Bilgiler

Tamsayı taşmasının merkezinde, bilgisayar programlamasındaki veri türlerinin boyutu ve verinin yorumlanması tarafından uygulanan sınırlama bulunmaktadır.

Örneğin, bir 8-bit işaretsiz tamsayı, 0 ile 255 arasındaki değerleri temsil edebilir. Bir 8-bit işaretsiz tamsayıya 256 değerini saklamaya çalışırsanız, saklama kapasitesinin sınırlılığı nedeniyle değer 0'a döner. Benzer şekilde, 16-bit işaretsiz tamsayı için, 0 ile 65,535 arasındaki değerleri tutabilir, 65,535'e 1 eklemek değeri tekrar 0'a döndürecektir.

Ayrıca, bir 8-bit işaretli tamsayı, -128 ile 127 arasındaki değerleri temsil edebilir. Bu, bir bitin işareti (pozitif veya negatif) temsil etmek için kullanılması nedeniyle, büyüklüğü temsil etmek için 7 bitin kullanılması nedeniyle gerçekleşir. En negatif sayı -128 olarak temsil edilir (ikili 10000000), ve en pozitif sayı 127 olarak temsil edilir (ikili 01111111).

Maksimum Değerler

Potansiyel web güvenlik açıkları için desteklenen maksimum değerleri bilmek oldukça ilginçtir:

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

Tamsayı Taşması

Tamsayı taşması, bir değişkenin maksimum değerini aştığında oluşan bir durumdur. Bu durum, beklenmedik sonuçlara neden olabilir ve kötü niyetli kullanıcılar tarafından istismar edilebilir. Tamsayı taşması genellikle işaretçilerle veya bellek tahsis işlemleriyle ilgili işlemlerde karşılaşılır.

Tamsayı taşması saldırıları genellikle bellek bölgelerine yazma, hizmet reddi veya kötü amaçlı kod yürütme gibi tehlikeli sonuçlara yol açabilir. Bu tür saldırılardan korunmak için giriş doğrulaması yapılmalı ve güvenlik kontrolleri uygulanmalıdır.

Örnek bir tamsayı taşması durumu aşağıdaki gibi olabilir:

int a = INT_MAX;
a = a + 1;

Bu durumda, a değişkeni maksimum tamsayı değerini aştığı için bir tamsayı taşması oluşacaktır.

Tamsayı taşması genellikle dikkatsizce yazılmış kodlardan kaynaklanır ve iyi bir kod incelemesi ve test süreci ile tespit edilebilir.

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

Örnekler

Saf taşma

Yazdırılan sonuç 0 olacaktır çünkü char'ı aştık:

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

İmzalıdan İmsiz Dönüşüm

Kullanıcı girdisinden okunan bir imzalı tamsayı düşünün ve ardından uygun doğrulama yapılmadan onu imzalı bir tamsayı olarak işleyen bir bağlamda kullanılır:

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

Bu örnekte, bir kullanıcı negatif bir sayı girerse, ikili değerlerin nasıl yorumlandığından dolayı büyük bir işaretsiz tamsayı olarak yorumlanabilir, bu da beklenmeyen davranışlara yol açabilir.

Diğer Örnekler

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

ARM64

Bu ARM64'te değişmez bu blog yazısında görebileceğiniz gibi.

HackTricks'i Destekleyin

Last updated