HEAP OVERFLOW nedir?

Jibo

Üye
30 Haz 2019
114
1
1
Heap Overflow Nedir?


8MA8VP.png


NZr505.png


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.)


NZr505.png

ZKSRsA.png


NZr505.png


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]
buraya kadar tamam anlaşılmayan bir şey yoktur umarım şimdi gelelim heap overflow neden oluşur.


NZr505.png


Heap overflow nasıl oluşur?

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]
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 <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]
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:
[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]
buradada bellekte yeterli alan olmadığı durumda heap overflow neden olmaktadır.

ayrıca ayrılan alana daha çok fazla veri kopyalamakta neden olmaktadır.


NZr505.png


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.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.