Hoşgeldin Misafir

C++'ta Belleği Elimize Almamak İçin Küçük Bir Tavsiye [Buffer Overflow]

PERSEVERACE

7 Eyl 2023
114 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Selamlar herkese. Baş belası C++ bellek taşması yani buffer overflow konusuna biraz değinelim diyorum. Özellikle C'den C++'a geçenlerin ya da işin mantığını yeni kavrayanların çok canını yakan bir mevzu bu.
Olay aslında çok düz mantık. Programda bir diziye 10 birimlik yer ayırıyorsunuz ama kod gidip oraya 15 birim veri basmaya çalışıyor. C++ da dur napıyorsun demiyor, o fazlalık 5 birimi gidip yandaki diğer verilerin tam üstüne yazıveriyor. Neden sıkıntı derseniz, bir kere program durduk yere patlayabiliyor ki bu en temiz ihtimal. En azından bir terslik olduğunu anlıyorsunuz. Diğer yandan bazen öyle saçma buglar çıkarıyor ki bir bakıyorsunuz alakasız bir değişkenin değeri kendi kendine değişmiş. Debug yaparken insanı gerçekten hayattan soğutuyor.


NEDEN KRİTİK ? Bu mevzu sadece programın çökmesi falan değil, bellek dediğimiz yer sadece rastgele sayılardan ibaret değil,sizin kodun içindeki en hayati stringler, özel anahtarlar veya gizli metinler orada ASCII formatında kabak gibi duruyor. Birisi bir taşma yakalayıp belleğin o yasaklı bölgelerine sızdığı an, sizin "gizli" dediğiniz o stringleri şak diye karşısında bulabiliyor. Yani adam sadece programı bozmakla kalmıyor, resmen belleğin röntgenini çekip ne var ne yoksa ASCII olarak ayıklayıp alıyor.

Mesela şu kod tam bir saatli bomba:

Kod:
C++


#include <iostream>
#include <cstring>

int main() {
char isim[5]; // Sadece 5 karakterlik yer var
std::cout << "Adınızı yazın: ";
std::cin >> isim; // Kullanıcı "mustafa" yazarsa bittiği andır, bellek taşar.

std::cout << "Girdiğiniz isim: " << isim << std::endl;
return 0;
}



bu senaryoda beklenen veriye sınırın üstünde veri girişi yapıyoruz. peki bu dertten nasıl kaçarız derseniz aslında modern C++ işimizi baya kolaylaştırıyor. Gözünüzü seveyim artık char dizileriyle uğraşıp ömür tüketmeyin, std::string kullanın gitsin. Kendi boyutunu kendi hallediyor işte.

Kod:
C++


#include <iostream>
#include <string>

int main() {
std::string isim; // Dinamik ne kadar yazarsan o kadar büyür
std::cout << "adınızı yazın: ";
std::cin >> isim; // Taşma riski yok

std::cout << "selam " << isim << std::endl;
return 0;
}



Bir de dizilerde falan dizi[i] yerine at() fonksiyonunu kullanmayı alışkanlık edinin. sınır dışına çıktığınızda program sessizce saçmalamak yerine direkt hata fırlatır, nerede patladığınızı bilirsiniz. Sabit diziler yerine de std::vector kullanın kafanız rahat olsun. Yani özetle belleği elle yönetmeye çalışırken ipin ucu çok kolay kaçıyor, o yüzden modern yöntemlerden şaşmamak lazım.

#Talep ve ilgi olursa live ortamda test videosu hazırlayabilirim.
 

THS-AI

THS-AI

THS YAPAY ZEKA
Turkhacks Kurumsal
20 Haz 2025
11,254 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Buffer overflow riskini azaltmak için, std::string gibi güvenli sınıflar kullanın ve bellek yönetimini otomatik hale getiren yapılar tercih edin. Ayrıca, sınır kontrollerini düzenli yapıp, strcpy yerine strncpy gibi fonksiyonlar kullanın.