Format Strings
Temel Bilgiler
C'de printf
bazı metinleri yazdırmak için kullanılabilen bir fonksiyondur. Bu fonksiyonun beklediği ilk parametre, formatlayıcılarla birlikte ham metin'dir. Beklenen sonraki parametreler, ham metindeki formatlayıcıları değiştirmek için değerlerdir.
Diğer savunmasız fonksiyonlar sprintf()
ve fprintf()
'dir.
Zafiyet, bir saldırgan metni bu fonksiyona ilk argüman olarak kullanıldığında ortaya çıkar. Saldırgan, printf format dizesinin yeteneklerini kötüye kullanarak herhangi bir adreste (okunabilir/yazılabilir) herhangi bir veriyi okumak ve yazmak için özel bir girdi oluşturma yeteneğine sahip olacaktır. Bu şekilde rastgele kod çalıştırma imkanı bulur.
Formatlayıcılar:
Örnekler:
Açık örnek:
Normal Kullanım:
Eksik Argümanlarla:
fprintf vulnerable:
Pointer'lara Erişim
Format %<n>$x
, burada n
bir sayı, printf'e yığın (stack) içinden n parametresini seçmesini belirtir. Yani printf kullanarak yığından 4. parametreyi okumak istiyorsanız şunu yapabilirsiniz:
ve birinci parametreden dördüncü parametreye kadar okuyabilirsiniz.
Ya da şunu yapabilirsiniz:
ve doğrudan dördüncüyü okuyun.
Saldırganın pr
intf
parametresini kontrol ettiğini unutmayın, bu temelde girdiğinin printf
çağrıldığında yığında olacağı anlamına gelir, bu da belirli bellek adreslerini yığında yazabileceği anlamına gelir.
Bu girişi kontrol eden bir saldırgan, yığında rastgele adresler ekleyebilir ve printf
'in bunlara erişmesini sağlayabilir. Bir sonraki bölümde bu davranışın nasıl kullanılacağı açıklanacaktır.
Rastgele Okuma
Biçimlendiriciyi %n$s
kullanarak printf
'in n pozisyonunda bulunan adresi almasını ve bunu bir dizeymiş gibi yazdırmasını sağlamak mümkündür (0x00 bulunana kadar yazdır). Yani, ikili dosyanın temel adresi 0x8048000
ise ve kullanıcı girdisinin yığında 4. pozisyonda başladığını biliyorsak, ikilinin başlangıcını yazdırmak mümkündür:
Girişin başına 0x8048000 adresini koyamayacağınızı unutmayın çünkü dize, o adresin sonunda 0x00 ile kesilecektir.
Ofseti Bul
Girişinizin ofsetini bulmak için 4 veya 8 bayt (0x41414141
) gönderebilir ve ardından %1$x
ile değeri artırarak A'ları
alana kadar devam edebilirsiniz.
Last updated