Format Strings
Temel Bilgiler
C'de printf
, bazı dizeleri yazdırmak için kullanılabilen bir işlevdir. Bu işlevin beklediği ilk parametre, biçimleyicilerle birlikte ham metindir. Beklenen diğer parametreler, ham metinden biçimleyicileri yerine koymak için değerlerdir.
Diğer zayıf işlevler sprintf()
ve fprintf()
'dir.
Zafiyet, bu işlevin ilk argümanı olarak bir saldırgan metnin kullanıldığı zaman ortaya çıkar. Saldırgan, printf biçim dizisi yeteneklerini kötüye kullanarak özel bir giriş oluşturabilir ve herhangi bir adresindeki herhangi bir veriyi okuyup yazabilir. Bu şekilde keyfi kod yürütebilir hale gelir.
Biçimleyiciler:
Örnekler:
Zafiyetli örnek:
Normal Kullanım:
Eksik Argümanlarla:
fprintf savunmasız:
İşaretçilere Erişim
%<n>$x
biçemi, n
sayısını belirterek printf'e yığın üzerindeki n'inci parametreyi seçmesini sağlar. Dolayısıyla printf kullanarak yığından 4. parametreyi okumak istiyorsanız şunu yapabilirsiniz:
ve birinci ile dördüncü parametre arasından okuyabilirsiniz.
Ya da şunu yapabilirsiniz:
Ve dördüncüyü doğrudan okuyun.
Saldırganın pr
**intf
parametresini kontrol ettiğine dikkat edin, bu temelde girişi printf
çağrıldığında yığında olacak 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 adres ekleyebilecek ve printf
'in bunlara erişmesini sağlayabilecek. Bu davranışın nasıl kullanılacağı bir sonraki bölümde açıklanacaktır.
Rastgele Okuma
Biçimleyici %n$s
'yi kullanarak printf
'in n pozisyonundaki adresi almasını sağlamak ve ardından onu bir dizeymiş gibi yazdırmak mümkündür (0x00 bulunana kadar yazdır). Dolayısıyla, eğer ikili dosyanın temel adresi 0x8048000
ise ve kullanıcı girişinin yığında 4. pozisyonda başladığını biliyorsak, ikilinin başlangıcını şu şekilde yazdırmak mümkündür:
Başlangıçta 0x8048000 adresini girişin başına koyamazsınız çünkü dize, o adresin sonunda 0x00 ile birleştirilecektir.
Ofseti Bulma
Girişinize ofseti bulmak için 4 veya 8 bayt (0x41414141
) gönderebilir ve ardından %1$x
ve artırarak değeri A'ları
alana kadar artırabilirsiniz.
Last updated