Bellek Taşma Açıklıkları ve Exploit Geliştirme
Bellek taşma (buffer overflow) zafiyetleri, yazılım dünyasında en tehlikeli açıklıklar arasında yer alır. Bu zafiyetler, bir programın bellek sınırlarının aşılması sonucu, saldırganın kötü niyetli kod çalıştırabilmesine imkan tanır. Bu yazıda, stack tabanlı bellek taşmaları üzerinde duracak ve adım adım exploit geliştirme sürecini inceleyeceğiz. Yazıda, kod parçacıkları ile birlikte örnekler sunulacak ve Metasploit kullanılarak exploit ekleme adımlarına değinilecektir.
Stack Tabanlı Bellek Taşması
Stack tabanlı bellek taşması, programın çağrı yığınına (stack) yazılan verilerin sınırlarını aşması sonucu ortaya çıkar. Stack üzerinde yer alan veriler genellikle yerel değişkenler ve fonksiyon geri dönüş adreslerini içerir. Bellek taşması sonucu, bu adresler ve değişkenler üzerinde kontrol sağlanabilir ve zararlı kodlar çalıştırılabilir.
Örnek Kod
Aşağıda, stack tabanlı bir bellek taşmasına yol açabilecek basit bir C programı bulunmaktadır:

Bu program, kullanıcıdan aldığı girdiyi buffer
değişkenine kopyalar. Ancak, strcpy
fonksiyonu girdinin boyutunu kontrol etmez, bu da buffer overflow’a yol açabilir.
Örnek Uygulamamız ve Uygulamanın Fuzz Edilmesi
Fuzzing, bir programın zayıf noktalarını keşfetmek için kullanılan bir test yöntemidir. Fuzzer araçları rastgele veya belirli kalıplarda girişler üretir ve programı bu girdilerle çalıştırır. Bu yöntemle, bellek taşması gibi hatalar tespit edilebilir.
Fuzzing Araçları
Aşağıda basit bir Python fuzzer örneği bulunmaktadır:

Bu fuzzer, programı artan uzunluklarda A
karakterleri ile çalıştırır ve programın çöküp çökmediğini kontrol eder.
Uygulamanın İkilik Ayıklama (Binary Debugging) ile İncelenmesi
İkilik ayıklama, bir programın ikilik (binary) dosyasını analiz etmek ve çalıştırma sürecini incelemek için kullanılan bir yöntemdir. Bu süreçte genellikle gdb
gibi araçlar kullanılır.
gdb
Kullanımı
Aşağıdaki komutlar, gdb
ile programın çalışmasını ve bellek taşmasını incelemek için kullanılabilir:

A
karakteri ile çalıştırıldığında bellek durumunu inceler.EIP Register Kontrolü
EIP (Instruction Pointer), işlemcinin bir sonraki çalıştıracağı talimatın adresini tutar. Bellek taşması sonucu, EIP register’ı kontrol edilebilir ve saldırganın istediği adrese yönlendirilebilir.
Örnek
Bellek taşması sonrası EIP’nin kontrol edildiğini doğrulamak için gdb
kullanılabilir:

Eğer EIP değeri 0x42424242
(ASCII ‘B’) ise, bellek taşması sonucu kontrol sağlanmış demektir.
İstismar Kodu İçin Ön Testlerin Yapılması
İstismar kodu geliştirilmeden önce bazı ön testler yapılmalıdır. Bu testler, bellek taşmasının nasıl gerçekleştiğini ve hangi adreslerin kontrol edilebileceğini belirlemek için yapılır.
Pattern Generation
Metasploit pattern_create.rb
ve pattern_offset.rb
araçları bu süreçte kullanılabilir:

Bu araçlar, bellek taşması sırasında hangi kısmın EIP’yi etkilediğini belirlemeye yardımcı olur.
İstismar Kodunun Hazırlanması ve Kullanılması
İstismar kodu, bellek taşması sonucu kontrol edilen adreslere zararlı kodları yerleştirir. Aşağıda basit bir istismar kodu örneği bulunmaktadır:
Örnek İstismar Kodu

Bu kod, buffer overflow sonucu EIP’yi kontrol eder ve zararlı kodu çalıştırır.
Metasploit Exploit Ekleme Adımları
Metasploit Framework, istismar kodlarının yönetimi ve kullanımı için güçlü bir platformdur. Metasploit’e exploit eklemek için aşağıdaki adımlar izlenebilir:
Adımlar
Metasploit Başlatma:
bash
Exploit Eklemek:
bash
–
Bu adımlar, exploit’in Metasploit’e eklenmesi ve çalıştırılması için gereklidir.
Kabuk Kodu (Shellcode) Teorisi
Shellcode, exploit’in hedef sistemde çalıştıracağı küçük bir kod parçasıdır. Shellcode genellikle, sistemde bir komut kabuğu açma veya zararlı bir işlem gerçekleştirme amacıyla kullanılır.
Örnek Shellcode
Aşağıda basit bir Linux shellcode örneği bulunmaktadır:

Bu shellcode, programı sona erdirir (exit sistem çağrısı).
Bellek taşma açıklıkları, yazılım güvenliği açısından büyük önem taşır. Bu yazıda, stack tabanlı bellek taşmalarının nasıl gerçekleştiğini ve exploit geliştirme sürecinin adımlarını inceledik. İkilik ayıklama, EIP kontrolü, istismar kodu hazırlama ve Metasploit kullanımı gibi konulara değindik. Güvenli yazılım geliştirme süreçlerinde bu tür zafiyetlere karşı dikkatli olmak, daha güvenli sistemler oluşturmak için kritik öneme sahiptir.