Bellek Taşma Açıklıkları ve Exploit Geliştirme

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:

python

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:

bash
Bu komutlar, programın çalışmasını başlatır ve 100 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:

bash

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:

bash

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

python

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

  1. Metasploit Başlatma:

    bash

  2. 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:

assembly

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.

Sosyal medyada paylaş
Facebook
Twitter
LinkedIn
Telegram