Format Strings
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)
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ğerler'dir.
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 n parametresini (stack'ten) seçmesini belirtir. Yani, printf kullanarak stack'ten 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ığı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 keyfi adres ekleyebilecek ve printf
'in bunlara erişmesini sağlayabilecektir. Bir sonraki bölümde bu davranışın nasıl kullanılacağı açıklanacaktır.
Keyfi Okuma
Biçimlendiriciyi %n$s
kullanarak printf
'in n pozisyonunda bulunan adresi alması ve bunu bir dizeymiş gibi yazdırması (0x00 bulunana kadar yazdır) 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.
Ofseti Bul
Girişinizin ofsetini bulmak için 4 veya 8 bayt (0x41414141
) gönderebilir ve ardından %1$x
ile arttırarak A'ları
alana kadar değeri artırabilirsiniz.
Last updated