BF Addresses in the Stack
Last updated
Last updated
AWS Hacking'i öğrenin ve uygulayın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Bir canary ve PIE (Pozisyon Bağımsız Yürütülebilir) ile korunan bir ikiliyle karşı karşıyaysanız, muhtemelen bunları atlatmanın bir yolunu bulmanız gerekecektir.
checksec
'in, bir ikilinin bir canary ile korunduğunu bulamayabileceğini unutmayın, bu durum statik olarak derlenmişse ve işlevi tanımlayamıyorsa.
Ancak, bir değerin bir işlev çağrısının başında yığında kaydedildiğini ve bu değerin çıkış yapmadan önce kontrol edildiğini fark ederseniz, bunu manuel olarak fark edebilirsiniz.
PIE'yi atlatmak için bir adres sızdırmanız gerekmektedir. Ve eğer ikili herhangi bir adres sızdırmıyorsa, en iyi yapılacak şey, zayıf olan işlevde yığındaki RBP ve RIP'yi kaba kuvvet uygulamaktır. Örneğin, bir ikili hem bir canary hem de PIE kullanarak korunuyorsa, canary'yi kaba kuvvet uygulamaya başlayabilir, ardından sonraki 8 Bayt (x64) kaydedilmiş RBP ve sonraki 8 Bayt kaydedilmiş RIP olacaktır.
Yığında bulunan dönüş adresinin genellikle ana ikili koduna ait olduğu varsayılır, bu da zayıflık ikili kodda bulunuyorsa genellikle geçerli olacaktır.
İkiliden RBP ve RIP'yi kaba kuvvet uygulamak için, bir geçerli tahmin edilen baytın doğru olduğunu programın bir çıktı verdiğini veya çökmediğini fark edebilirsiniz. Canary'yi kaba kuvvet uygulamak için sağlanan işlevle aynı işlev RBP ve RIP'yi kaba kuvvet uygulamak için kullanılabilir:
Son şey, PIE'ı yenmek için gereken sızdırılan adreslerden yararlı adresleri hesaplamaktır: RBP ve RIP.
RBP adresinden, shell kodunuzu yığında nereye yazdığınızı hesaplayabilirsiniz. Bu, "/bin/sh\x00" dizesini yığının içine nereye yazacağınızı bilmek için çok faydalı olabilir. Sızdırılan RBP ve shell kodunuz arasındaki mesafeyi hesaplamak için sadece RBP sızdırdıktan sonra bir kesme noktası koyabilir ve shell kodunuzun nerede bulunduğunu kontrol edebilirsiniz, ardından, shell kodu ile RBP arasındaki mesafeyi hesaplayabilirsiniz:
RIP'ten, PIE ikili dosyasının başlangıç adresini hesaplayabilirsiniz, bu da geçerli bir ROP zinciri oluşturmak için ihtiyacınız olan şeydir.
Taban adresi hesaplamak için sadece objdump -d vunbinary
komutunu çalıştırın ve en son adresleri kontrol edin:
Bu örnekte, tüm kodları bulmak için yalnızca 1 Byte ve yarım gerektiğini görebilirsiniz, sonra, bu durumda taban adresi sızdırılan RIP ancak "000" ile biten olacaktır. Örneğin, 0x562002970ecf
sızdırdıysanız, taban adres 0x562002970000
olacaktır.
Bu gönderiden bazı gözlemlere göre, RBP ve RIP değerlerinin sızdırıldığında, sunucunun bazı doğru olmayan değerlerle çökmediği ve BF betiğinin doğru değerleri aldığını düşüneceği mümkündür. Bu, bazı adreslerin tam olarak doğru olanlar olmasa bile bunu bozmayabileceği mümkündür.
Bu blog gönderisine göre sunucuya yapılan istekler arasına kısa bir gecikme eklemek önerilir.
AWS Hacking öğrenin ve uygulayın:HackTricks Eğitimi AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking öğrenin ve uygulayın: HackTricks Eğitimi GCP Kırmızı Takım Uzmanı (GRTE)