BF Addresses in the Stack
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 tarafından korunduğunu bulamayabileceğini unutmayın, bu 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.
Adresleri Kaba Kuvvetle Bulma
PIE'yi atlatmak için bazı adresleri sızdırmanız gerekmektedir. Ve eğer ikili herhangi bir adres sızdırmıyorsa, en iyisi savunmasız işlevde yığındaki RBP ve RIP'yi kaba kuvvetle bulmaktır. Örneğin, bir ikili hem bir canary hem de PIE kullanarak korunuyorsa, önce canary'yi kaba kuvvetle bulabilir, ardından sonraki 8 Bayt (x64) kaydedilmiş RBP ve sonraki 8 Bayt kaydedilmiş RIP olacaktır.
Yığın içindeki dönüş adresinin genellikle ana ikili koduna ait olduğu varsayılır, bu da zafiyetin ikili kodda bulunduğu durumda genellikle geçerli olacaktır.
İkiliden RBP ve RIP'yi kaba kuvvetle bulmak için, bir geçerli tahmin edilen baytın doğru olduğunu programın bir çıktı verdiğini veya sadece çökmeyi önlemediğini fark edebilirsiniz. Canary'yi kaba kuvvetle bulmak için sağlanan aynı işlev, RBP ve RIP'yi kaba kuvvetle bulmak için de kullanılabilir:
Son ihtiyacınız olan şey, PIE'ı yenmek için sızdırılan adreslerden yararlı adresleri hesaplamaktır: RBP ve RIP.
RBP'den, kabuğunuzu 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 kabuğunuz arasındaki mesafeyi hesaplamak için sadece RBP sızdırdıktan sonra bir kesme noktası koyabilir ve kabuğunuzun nerede bulunduğunu kontrol edebilirsiniz, ardından kabuk 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.
Baz adresini 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 baz adresi sızdırılan RIP ancak "000" ile biten olacaktır. Örneğin, 0x562002970ecf
sızdırdıysanız, baz adres 0x562002970000
olacaktır.
İyileştirmeler
Bu gönderiden bazı gözlemlere göre, RBP ve RIP değerlerini sızdırdığınızda, 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 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.
Last updated