Format Strings
Last updated
Last updated
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)
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
bazı metinleri yazdırmak için kullanılabilen bir fonksiyondur. Bu fonksiyonun beklediği ilk parametre, formatlayıcılarla birlikte ham metin'dir. Sonraki parametreler, ham metindeki formatlayıcıları değiştirmek için beklenen 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şturabilecektir. Bu şekilde rastgele kod çalıştırma yeteneğine sahip olacaktır.
Örnekler:
Açık örnek:
Normal Kullanım:
Eksik Argümanlarla:
fprintf savunmasız:
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 girdiğinin printf
çağrıldığında yığın içinde 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 ekleyebilir ve printf
'in bunlara erişmesini sağlayabilir. Bir sonraki bölümde bu davranışın nasıl kullanılacağı açıklanacaktır.
Biçimlendiriciyi %n$s
kullanarak printf
'in n pozisyonunda bulunan adresi alması ve bunu bir dizeymiş gibi yazdırması (0x00 bulunana kadar yazdırma) mümkündü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.
Girişinizin ofsetini bulmak için 4 veya 8 bayt (0x41414141
) gönderebilir ve ardından %1$x
ile birlikte değeri artırarak A'ları
alabilirsiniz.
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)