Format Strings
Last updated
Last updated
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Eğer hacking kariyeri ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - işe alıyoruz! (akıcı yazılı ve sözlü Lehçe gereklidir).
C'de printf
bir dizeyi yazdırmak için kullanılabilen bir işlevdir. Bu işlevin beklediği ilk parametre, formatlayıcılarla birlikte ham metin'dir. Beklenen sonraki parametreler, ham metindeki formatlayıcıları değiştirmek için gereken değerler'dir.
Diğer savunmasız işlevler sprintf()
ve fprintf()
'dir.
Zafiyet, bir saldırgan metni bu işlevin 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şturabilecektir. Bu şekilde rastgele kod çalıştırma yeteneğine sahip olacaktır.
Örnekler:
Açık örnek:
Normal Kullanım:
Eksik Argümanlarla:
fprintf vulnerable:
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 printf
parametresini kontrol ettiğini unutmayın, bu temelde onun 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 adres ekleyebilecek ve printf
'in bunlara erişmesini sağlayabilecektir. Bu davranışın nasıl kullanılacağı bir sonraki bölümde açıklanacaktır.
Formatlayıcı %n$s
kullanılarak printf
'in n pozisyonunda bulunan adresi alması ve bunu bir dizeymiş gibi yazdırması mümkündür (0x00 bulunana kadar yazdır). Yani, eğer 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.
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.
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)