Ret2esp / Ret2reg
Last updated
Last updated
AWS Hacking'ı öğrenin ve uygulayın: HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'ı öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
ESP (Yığın İşaretçisi) her zaman yığının en üstüne işaret ettiği için, bu teknik, EIP'yi (Komut İşaretçisi) bir jmp esp
veya call esp
komutunun adresiyle değiştirerek çalışır. Bunu yaparak, shellcode, üzerine yazılan EIP'nin hemen ardına yerleştirilir. ret
komutu çalıştığında, ESP bir sonraki adrese işaret eder, tam olarak shellcode'un depolandığı yer.
Eğer Windows veya Linux'ta Adres Alanı Düzeni Rastgeleleştirme (ASLR) etkin değilse, paylaşılan kütüphanelerde bulunan jmp esp
veya call esp
komutlarını kullanmak mümkündür. Ancak, ASLR etkinse, bu komutları bulmak için savunmasız programın kendisine bakmak gerekebilir (ve PIE engelini aşmanız gerekebilir).
Ayrıca, shellcode'u EIP bozulmasından sonra yerleştirebilmek, yığının ortasına değil, EIP'nin üzerine yerleştirmek, işlevin çalışması sırasında gerçekleşen herhangi bir push
veya pop
komutunun shellcode ile etkileşime girmesini önler. Bu etkileşim, shellcode yığının ortasına yerleştirilmiş olsaydı meydana gelebilirdi.
Eğer RIP üzerine yazdıktan sonra yazacak alanınız yoksa (belki sadece birkaç bayt), başlangıçta bir jmp
shellcode'u yazın:
Bu teknikle ilgili bir örnek https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp adresinde bulunabilir ve son saldırı şu şekildedir:
Başka bir örneğini bu teknikte görebilirsiniz https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. NX etkin olmayan bir taşma durumu var, $esp
adresini azaltmak için bir araç kullanıldı ve ardından bir jmp esp;
ile kabuk koduna atlandı:
Benzer şekilde, bir fonksiyonun kabuk kodunun depolandığı adresi döndürdüğünü bildiğimizde, call eax
veya jmp eax
komutlarını kullanabiliriz (ret2eax tekniği olarak bilinir), kabuk kodumuzu yürütmek için başka bir yöntem sunar. Eax gibi, ilginç bir adres içeren herhangi bir kayıt kullanılabilir (ret2reg).
Bazı örnekleri burada bulabilirsiniz:
strcpy
kabuk kodunun depolandığı tamponun adresini eax
'e saklayacak ve eax
üzerine yazılmıyorsa, bir ret2eax
kullanmak mümkündür.
ARM64'te SP kaydına atlamaya izin veren komutlar yoktur. Sp'yi bir kayda taşıyıp ardından o kayda atlamayı sağlayan bir aygıt bulunabilir, ancak benim kali libc'mde böyle bir aygıt bulamadım:
Sadece keşfettiğim tek şey, sp'nin kopyalandığı kaydın değerini değiştirecek ve ardından ona atlamak (bu nedenle işe yaramaz hale gelecektir):
Eğer bir kayıt ilginç bir adres içeriyorsa, uygun talimatı bulmak yeterli olacaktır. Şöyle bir şey kullanabilirsiniz:
ARM64'de, bir fonksiyonun dönüş değerini saklayan x0
olabilir, bu nedenle x0'ın, kullanıcı tarafından kontrol edilen bir tamponun adresini sakladığı ve yürütülecek bir kabuk kodunu içerdiği olabilir.
Örnek kod:
Fonksiyonun ayrıştırmasını kontrol etmek, tamponun adresinin (bof'a duyarlı ve kullanıcı tarafından kontrol edilen) tampon taşmasından dönmek önce x0
'da saklandığını görmek mümkündür:
Ayrıca do_stuff
fonksiyonunda br x0
cihazını bulmak mümkündür:
PIE OLMADAN derlendiği için, bu cihazı kullanacağız. Desen kullanarak tampon taşmasının ofsetinin 80 olduğu görülebilir, bu yüzden saldırı şöyle olacaktır:
Eğer fgets
yerine read
gibi bir şey kullanılsaydı, br x0;
komutuna geri dönmek için dönüş adresinin sadece son 2 byte'ını üzerine yazarak PIE'yi atlayabilir ve tam adresi bilmeye gerek kalmazdı.
fgets
ile çalışmaz çünkü sona bir null (0x00) byte ekler.
NX: Yığın yürütülemezse, kabuk kodunu yığına yerleştirmemiz ve yürütmek için atlamamız gerektiği için bu işe yaramaz.
AWS Hacking öğrenin ve pratik yapın:HackTricks Eğitim AWS Red Team Expert (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Eğitim GCP Red Team Expert (GRTE)