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:
[SIZE=4][COLOR=dimgray][B]#include <stdio.h>[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] #include <stdlib.h> //malloc() alloc() free() fonksiyonlarını kullanmamız için bu kütüphaneyi çağırıyoruz.[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] int main()[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] {[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] int *sayi; //"sayi" adında bir pointer belirledik[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] sayi = (int*) malloc(sizeof(int)); //heapta veriyi olan yeri açtik "int" veri büyüklüğünde[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] sayi = 126;//pointere değer atadık[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] printf("Başlangıç adresi: %p" ,sayi); //bellekdeki başlangıç adresini ekrana bastırdık.[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] printf("Değeri: %d" , sayi); //değeri ekrana bastırdık.[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] return 0;[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=dimgray][B] }[/B][/COLOR][/SIZE]
Heap overflow nasıl oluşur?
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.
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
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:
[SIZE=4][COLOR=DimGray][B]#include <stdio.h>[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] #include <stdlib.h>[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] [COLOR=DarkOrchid][COLOR=dimgray]int[/COLOR][/COLOR] main()[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] {[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] char sayilar[4];[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] sayilar = malloc(sizeof(4));[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] strcpy(a , " turkhackteam");[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] return 0;[/B][/COLOR][/SIZE]
[SIZE=4][COLOR=DimGray][B] }[/B][/COLOR][/SIZE]
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 <stdio.h>
Kod:
[B][SIZE=4][COLOR=dimgray] #include <stdlib.h>[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] int main()[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] {[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] int i;[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] int *sayi;[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] for(i = 0; ;i++)[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] {[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] sayi = (int*)malloc(sizeof(int));[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] }[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] }[/COLOR][/SIZE][/B]
2-)Dinamik olarak çok sayıda değişken ayırırsak
Kod:
[B][SIZE=4][COLOR=dimgray] #include <stdio.h>[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] #include <stdlib.h>[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] int main()[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] {[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] int sayi;[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] sayi = (int*) malloc(sizeof(int)*100000)[/COLOR][/SIZE][/B]
[B][SIZE=4][COLOR=dimgray] }[/COLOR][/SIZE][/B]
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.