PERSEVERACE
- 7 Eyl 2023
- 114 Mesaj
Aktiflik
Seviye
Deneyim
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:
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
Bir de dizilerde falan dizi
#Talep ve ilgi olursa live ortamda test videosu hazırlayabilirim.
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.




