Fuzzing yazılım dünyasında rastgele veriler göndererek programımızda bir yerde crash yaşatmayı amaçlayan bir test yöntemidir. İlk bakışta basit gibi görünse de derinlemesine inildikçe birçok farklı konu ve teknik barındırır. Fuzzing öğrenmesi kolay ama uzmanlaşması zaman alabilen bir alan olup farklı hatalar ve güvenlik zafiyetlerini keşfetmek için etkili bir yöntemdir.En popüler fuzzing araçlarından biri AFL++'dir. Bu araç sayesinde yazılımda beklenmedik crashlere, buglara yol açacak girdiler üretir. Bu yazıda AFL++ nin temel kullanımını anlatacağım
Genel fuzzing türleri :
1. Random input üreten Fuzz Testi (Random Fuzz Testing)
Bu türde fuzzer rastgele girdiler üretir ve bunları programa gönderir. Kullanıcı dosya formatları veya ağ protokolleri hakkında hiçbir şey bilmek zorunda değildir. Fuzzer sadece rastgele veriler göndererek programın çökmesini veya hatalarını bulmaya çalışır. Ancak, bu yöntem şansa dayalıdır ve büyük codebase olan karmaşık kod yapısına sahip programlarda işimizi zorlaştırır. Örnek: Radamsa
2. Mutation based fuzzing
Kullanıcı programın girdi dosyasını veya protokolünü anlamalıdır çünkü şablonlar bu bilgilere dayalı olarak oluşturulur. Fuzzer girdi üzerinde değişiklikler yaparak yeni veriler oluşturur. Bu yöntemle hatalar bulunabilir, ancak şablonların doğru şekilde oluşturulması gerekir
3. Coverage guided fuzzing
Bu türde, fuzzer, programın çalışma yolunu (code path) izleyerek yeni girdi dosyaları üretir. Programın hangi yollarının test edildiğini belirler ve bu verilere göre yeni girdiler oluşturur
Şimdi basit bir C kodunu afl++ ile deniyelim
target : https://github.com/hardik05/Damn_Vulnerable_C_Program/blob/master/imgRead.c
statik analiz yapsaniz zaten sorunlari gözlede göre bilirsiniz xD
ilk önce bu c kodunu afl ile compile yapmamız gerekicek

Parametreler:
-fsanitize=address (ASan, AddressSanitizer): Bu seçenek, programda bellek hatalarını (buffer overflow, heap overflow, use-after-free, memory leak gibi) tespit etmek için kullanılır. Fuzzing sırasında bellekteki hatalar kolayca fark edilebilir.
-fsanitize=undefined (UBSan, UndefinedBehaviorSanitizer): Bu seçenek, tanımsız davranışları (integer overflow, sıfıra bölme, geçersiz bellek erişimi gibi) tespit etmeye yarar. Bu tür hatalar, genellikle programın beklenmedik bir şekilde çökmesine neden olur ve güvenlik açığı oluşturabilir.
-ggdb: Derleme sırasında hata ayıklama sembollerini (debug symbols) ekler. Bu semboller, program çökmeleri (crashes) sırasında hata ayıklama işlemini (GDB ile) kolaylaştırır. Hata ayıklama işlemi sırasında hangi fonksiyonda, hangi satırda hata olduğunu görmenizi sağlar.
-O0: Optimizasyonu devre dışı bırakır. Bu seçenek, kodun doğrudan, daha okunabilir bir şekilde derlenmesini sağlar. Optimizasyonlar, kodu hızlandırmak için yapılır ama bazen hata ayıklama sırasında karmaşıklaşabilir. -O0 kullanarak, kodun daha açık ve anlaması kolay olmasını sağlarız.
Bundan sonra in isminde input directorymizi yaratalim ve girdiler ayarliyalim
mesela
echo "randomdata12345" > in/input.jpg
ve fuzzlayalim:

Crashler gelmeye başladı
out dizini altında crashes bölümü var oraya save oluyor herşey

sig 11 buffer overflow ile ilişkilidir
İkinci partımızda gdb ile nasıl analizler yapa biliriz ve farklı teknikleri parserler üzerinden göstericem hoşçakalın
Genel fuzzing türleri :
1. Random input üreten Fuzz Testi (Random Fuzz Testing)
Bu türde fuzzer rastgele girdiler üretir ve bunları programa gönderir. Kullanıcı dosya formatları veya ağ protokolleri hakkında hiçbir şey bilmek zorunda değildir. Fuzzer sadece rastgele veriler göndererek programın çökmesini veya hatalarını bulmaya çalışır. Ancak, bu yöntem şansa dayalıdır ve büyük codebase olan karmaşık kod yapısına sahip programlarda işimizi zorlaştırır. Örnek: Radamsa
2. Mutation based fuzzing
Kullanıcı programın girdi dosyasını veya protokolünü anlamalıdır çünkü şablonlar bu bilgilere dayalı olarak oluşturulur. Fuzzer girdi üzerinde değişiklikler yaparak yeni veriler oluşturur. Bu yöntemle hatalar bulunabilir, ancak şablonların doğru şekilde oluşturulması gerekir
3. Coverage guided fuzzing
Bu türde, fuzzer, programın çalışma yolunu (code path) izleyerek yeni girdi dosyaları üretir. Programın hangi yollarının test edildiğini belirler ve bu verilere göre yeni girdiler oluşturur
Şimdi basit bir C kodunu afl++ ile deniyelim
target : https://github.com/hardik05/Damn_Vulnerable_C_Program/blob/master/imgRead.c
statik analiz yapsaniz zaten sorunlari gözlede göre bilirsiniz xD
ilk önce bu c kodunu afl ile compile yapmamız gerekicek
Kod:
afl-cc -fsanitize=address,undefined -ggdb -O0 imgRead.c -o imgReadafl

Parametreler:
-fsanitize=address (ASan, AddressSanitizer): Bu seçenek, programda bellek hatalarını (buffer overflow, heap overflow, use-after-free, memory leak gibi) tespit etmek için kullanılır. Fuzzing sırasında bellekteki hatalar kolayca fark edilebilir.
-fsanitize=undefined (UBSan, UndefinedBehaviorSanitizer): Bu seçenek, tanımsız davranışları (integer overflow, sıfıra bölme, geçersiz bellek erişimi gibi) tespit etmeye yarar. Bu tür hatalar, genellikle programın beklenmedik bir şekilde çökmesine neden olur ve güvenlik açığı oluşturabilir.
-ggdb: Derleme sırasında hata ayıklama sembollerini (debug symbols) ekler. Bu semboller, program çökmeleri (crashes) sırasında hata ayıklama işlemini (GDB ile) kolaylaştırır. Hata ayıklama işlemi sırasında hangi fonksiyonda, hangi satırda hata olduğunu görmenizi sağlar.
-O0: Optimizasyonu devre dışı bırakır. Bu seçenek, kodun doğrudan, daha okunabilir bir şekilde derlenmesini sağlar. Optimizasyonlar, kodu hızlandırmak için yapılır ama bazen hata ayıklama sırasında karmaşıklaşabilir. -O0 kullanarak, kodun daha açık ve anlaması kolay olmasını sağlarız.
Bundan sonra in isminde input directorymizi yaratalim ve girdiler ayarliyalim
mesela
echo "randomdata12345" > in/input.jpg
ve fuzzlayalim:
Kod:
afl-fuzz -i in -o out -m none -- ./imgReadafl @@

Crashler gelmeye başladı

out dizini altında crashes bölümü var oraya save oluyor herşey

sig 11 buffer overflow ile ilişkilidir
İkinci partımızda gdb ile nasıl analizler yapa biliriz ve farklı teknikleri parserler üzerinden göstericem hoşçakalın
Bu içeriği görmek için giriş yapın.

