Heap Overflow Nedir?


Heap Overflow kısaca tanımlarsak bellekte olan veri taşmasıdır.Heap nedir derseniz Bilgisayarın belleğinde(ram) kullanıcı için önemli iki adet mantıksal birim vardır. Bunlar Heap ve Stack
Heap
Bilgisayarda programların dinamik bellek ihtiyacını karşılar Heapta veriler karışık tutulur. ve veriye ulaşmak daha maliyetlidir. Nesneler Heapta bulunur.
Stackte ise statik yer tahsisi yapılır ve veriler üst üste dizilir . bu değerleri sırayla kullanırız
Örnek ortadaki bir veriyi üsttekileri kullanmadan kullanamayız. Ayrıca stackta primitive denilen değerleri tutabiliriz. (int , short , byte , long , decimal , double , boolen , float vb.)


Heapda program alan ihtiyacı olduğunda dinamik olarak tahsis eder. C programlama Alloc() , Malloc() fonksiyonları tahsis edilir ve bu tahsis edilen alanlarla işimiz bittiğinde bu alanları yeniden yeniden kullanıma açmak için ise Free() fonksiyonu kullanılır. Daha iyi anlayabilmek için C dilinde yazılmış şu kodları inceleyelim.
Kod:
#include
#include //malloc() alloc() free() fonksiyonlarını kullanmamız için bu kütüphaneyi çağırıyoruz.
int main()
{
int *sayi; //"sayi" adında bir pointer belirledik
sayi = (int*) malloc(sizeof(int)); //heapta veriyi olan yeri açtik "int" veri büyüklüğünde
sayi = 126;//pointere değer atadık
printf("Başlangıç adresi: %p" ,sayi); //bellekdeki başlangıç adresini ekrana bastırdık.
printf("Değeri: %d" , sayi); //değeri ekrana bastırdık.
return 0;
}
buraya kadar tamam anlaşılmayan bir şey yoktur umarım şimdi gelelim heap overflow neden oluşur.
Heap overflow nasıl oluşur?
Kod:
#include
#include
int main()
{
char sayilar[4];
sayilar = malloc(sizeof(4));
strcpy(a , " turkhackteam");
return 0;
}
bu örnekteki gibi 4 baytlık bir alana daha fazla yer kaplayan bir sözcük dizgisi kopyalarsak heap overflow hatası alırız.
Heap overflow dediğimiz durum bir çok durumda oluşabilir ama genellikle iki durumda oluşmaktadır. bunlar:
1-)Eğer programda sürekli olarak heapta bellek ayırır ve bu bellekleri
boşaltmassak oluşabilir.
Kod:
#include
Kod:
#include
int main()
{
int i;
int *sayi;
for(i = 0; ;i++)
{
sayi = (int*)malloc(sizeof(int));
}
}
Bu örnekte olduğu gibi heap alanları bir sonsuz döngüye soktuk ve bu belli bir süre sonra heap overflowa neden olacaktır.
2-)Dinamik olarak çok sayıda değişken ayırırsak
Kod:
#include
#include
int main()
{
int sayi;
sayi = (int*) malloc(sizeof(int)*100000)
}
buradada bellekte yeterli alan olmadığı durumda heap overflow neden olmaktadır.
ayrıca ayrılan alana daha çok fazla veri kopyalamakta neden olmaktadır.
Kod:
#include
#include
int main()
{
char sayilar[4];
sayilar = malloc(sizeof(4));
strcpy(a , " turkhackteam");
return 0;
}
bu örnekteki gibi 4 baytlık bir alana daha fazla yer kaplayan bir sözcük dizgisi kopyalarsak heap overflow hatası alırız.
Heap overflow dediğimiz durum bir çok durumda oluşabilir ama genellikle iki durumda oluşmaktadır. bunlar:
1-)Eğer programda sürekli olarak heapta bellek ayırır ve bu bellekleri
boşaltmassak oluşabilir.
Kod:
#include
Kod:
#include
int main()
{
int i;
int *sayi;
for(i = 0; ;i++)
{
sayi = (int*)malloc(sizeof(int));
}
}
Bu örnekte olduğu gibi heap alanları bir sonsuz döngüye soktuk ve bu belli bir süre sonra heap overflowa neden olacaktır.
2-)Dinamik olarak çok sayıda değişken ayırırsak
Kod:
#include
#include
int main()
{
int sayi;
sayi = (int*) malloc(sizeof(int)*100000)
}
buradada bellekte yeterli alan olmadığı durumda heap overflow neden olmaktadır.
ayrıca ayrılan alana daha çok fazla veri kopyalamakta neden olmaktadır.

Heap Overflow İçin Nasıl Önlem Alınır.
Heap overflow hatalarını önlemek için C' de gets() , StrCpy() , scanf() gibi sonluk belirtmeyen fonksiyonları heap ile kullanmamaya dikkat etmeliyiz.Eğer kullanıyorsakta buları filtrelemeliyiz. Heapte veri açarken ihtiyaç dışı veri açmamalıyız ve ihtiyacaımız olduğu zaman açmalıyız. açtığımız bölümlerle işimiz bittiğinde free() fonksiyonu ile tekrardan kullanıma sunmalıyız.