Ret2esp / Ret2reg
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Çünkü ESP (Yığın İşaretçisi) her zaman yığının en üstüne işaret eder, bu teknik EIP'yi (Talimat İşaretçisi) jmp esp
veya call esp
talimatının adresi ile değiştirmeyi içerir. Bunu yaparak, shellcode, üzerine yazılmış EIP'nin hemen arkasına yerleştirilir. ret
talimatı çalıştığında, ESP bir sonraki adrese işaret eder, tam olarak shellcode'un saklandığı yere.
Eğer Adres Alanı Düzeni Rastgeleleştirme (ASLR) Windows veya Linux'ta etkin değilse, paylaşılan kütüphanelerde bulunan jmp esp
veya call esp
talimatlarını kullanmak mümkündür. Ancak, ASLR aktif olduğunda, bu talimatları bulmak için savunmasız programın kendisine bakmak gerekebilir (ve PIE ile başa çıkmanız gerekebilir).
Ayrıca, shellcode'u EIP bozulmasından sonra yerleştirebilmek, yığın ortasında değil, işlevin çalışması sırasında gerçekleştirilen herhangi bir push
veya pop
talimatının shellcode ile çakışmamasını sağlar. Bu çakışma, shellcode'un işlevin yığınının ortasına yerleştirilmesi durumunda meydana gelebilir.
Eğer RIP'yi üzerine yazdıktan sonra yazmak için alan eksikse (belki sadece birkaç bayt), başlangıçta bir jmp
shellcode'u yazın:
Ve shellcode'u yığın içinde erken yazın.
Bu tekniğin bir örneğini https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp adresinde, son bir istismar ile bulabilirsiniz:
Bu tekniğin bir başka örneğini https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html adresinde görebilirsiniz. NX etkinleştirilmeden bir buffer overflow var, $esp
adresini küçültmek için bir gadget kullanılıyor ve ardından shellcode'a atlamak için jmp esp;
kullanılıyor:
Benzer şekilde, bir fonksiyonun shellcode'un saklandığı adresi döndürdüğünü biliyorsak, shellcode'umuzu çalıştırmak için call eax
veya jmp eax
talimatlarını (bilinen ret2eax tekniği) kullanabiliriz. Eax gibi, ilginç bir adres içeren herhangi bir başka kayıt da kullanılabilir (ret2reg).
Burada bazı örnekler bulabilirsiniz:
strcpy
, shellcode'un saklandığı tamponun adresini eax
'de saklayacak ve eax
üzerine yazılmadığı için ret2eax
kullanmak mümkün.
ARM64'te SP kaydına atlamaya izin veren talimatlar yoktur. SP'yi bir kayda taşıyan ve sonra o kayda atlayan bir gadget bulmak mümkün olabilir, ancak benim kali'mdeki libc'de böyle bir gadget bulamadım:
Keşfettiğim tek şey, sp'nin kopyalandığı kaydın değerini değiştirecek olanlardı (bu yüzden işe yaramaz hale gelecekti):
Eğer bir kaydın ilginç bir adresi varsa, uygun talimatı bulup ona atlamak mümkündür. Şöyle bir şey kullanabilirsiniz:
ARM64'te, bir fonksiyonun dönüş değerini saklayan x0
'dır, bu nedenle x0'ın, kullanıcı tarafından kontrol edilen ve çalıştırılacak bir shellcode içeren bir tamponun adresini sakladığı durumlar olabilir.
Örnek kod:
Fonksiyonun ayrıştırmasını kontrol ettiğimizde, tamponun adresinin (bof'a karşı savunmasız ve kullanıcı tarafından kontrol edilen) x0
'da saklandığını görebiliriz, tampon taşmasından dönerken:
Ayrıca do_stuff
fonksiyonunda br x0
gadget'ını bulmak da mümkündür:
Bu gadget'ı kullanarak ona atlayacağız çünkü ikili dosya PIE OLMADAN derlenmiştir. Bir desen kullanarak, tampon taşmasının ofsetinin 80 olduğunu görebiliriz, bu nedenle istismar şöyle olacaktır:
Eğer fgets
yerine read
gibi bir şey kullanılsaydı, sadece dönüş adresinin son 2 baytını yazarak br x0;
talimatına geri dönmek mümkün olabilirdi, tam adresi bilmeye gerek kalmadan.
fgets
ile bu işe yaramaz çünkü sonuna bir null (0x00) baytı ekler.
NX: Yığın çalıştırılabilir değilse, bu yardımcı olmaz çünkü shellcode'u yığında yerleştirip çalıştırmak için atlamamız gerekiyor.
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)