SROP - Sigreturn-Oriented Programming
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)
Sigreturn
, bir sinyal işleyicisinin yürütmesini tamamladıktan sonra temizlemek için kullanılan özel bir syscall'dır. Sinyaller, bir programın işletim sistemi tarafından gönderilen kesintilerdir ve genellikle olağanüstü bir durumun meydana geldiğini belirtmek için kullanılır. Bir program bir sinyal aldığında, sinyali işlemek için geçici olarak mevcut işini durdurur ve bu işlem için tasarlanmış özel bir fonksiyon olan sinyal işleyici ile sinyali ele alır.
Sinyal işleyici tamamlandıktan sonra, programın önceki durumuna devam etmesi gerekir, sanki hiçbir şey olmamış gibi. İşte bu noktada sigreturn
devreye girer. Programın sinyal işleyicisinden dönmesine yardımcı olur ve sinyal işleyici tarafından kullanılan yığın çerçevesini (fonksiyon çağrılarını ve yerel değişkenleri depolayan bellek bölümü) temizleyerek programın durumunu geri yükler.
İlginç olan, sigreturn
'ın programın durumunu nasıl geri yüklediğidir: bunu CPU'nun tüm kayıt değerlerini yığında saklayarak yapar. Sinyal artık engellenmediğinde, sigreturn
bu değerleri yığından çıkarır, böylece CPU'nun kayıtlarını sinyal işlenmeden önceki durumuna sıfırlar. Bu, yığının mevcut üst kısmını gösteren yığın işaretçi kaydı (RSP) dahil olmak üzere tüm kayıtları içerir.
Bir ROP zincirinden sigreturn
syscall'ını çağırarak ve yüklemek istediğimiz kayıt değerlerini yığına ekleyerek, tüm kayıt değerlerini kontrol etmek ve dolayısıyla örneğin execve
syscall'ını /bin/sh
ile çağırmak mümkündür.
Bu durumun, diğer Ret2syscall'ları çağırmak için parametreleri kontrol etmeyi çok daha kolay hale getiren bir Ret2syscall türü olduğunu unutmayın:
Eğer merak ediyorsanız, bu daha sonra değerleri geri almak için yığında saklanan sigcontext yapısıdır (şeması buradan):
Daha iyi bir açıklama için ayrıca kontrol edin:
Burada bir örnek bulabilirsiniz burada signeturn çağrısı ROP aracılığıyla oluşturulmuştur (rxa'ya 0xf
değeri konulmuştur), ancak buradan sonrasının nihai istismarıdır:
Ayrıca buradan istismarı kontrol edin burada ikili dosya zaten sigreturn
çağrısı yapıyordu ve bu nedenle bunu bir ROP ile inşa etmek gerekmez:
Yığıta yazma ve ardından sigreturn
syscall'ini çağırma imkanı veren bir Assembly ikili dosyası. Yığıta bir ret2syscall yazmak ve ikilinin belleğindeki bayrağı okumak mümkündür.
Yığıta yazma ve ardından sigreturn
syscall'ini çağırma imkanı veren bir Assembly ikili dosyası. Yığıta bir ret2syscall yazmak mümkündür (ikili dosya /bin/sh
dizesine sahiptir).
64 bit, relro yok, canary yok, nx, pie yok. gets
fonksiyonunu kötüye kullanarak basit bir buffer overflow. ret2syscall gerçekleştiren gadget eksikliği. ROP zinciri, .bss
'ye /bin/sh
yazarak tekrar gets'i çağırır, eax
'ı 0xf
olarak ayarlamak için alarm
fonksiyonunu kötüye kullanır ve bir SROP çağırarak bir shell çalıştırır.
64 bit assembly programı, relro yok, canary yok, nx, pie yok. Akış, yığıta yazma, birkaç kaydı kontrol etme ve bir syscall çağırma imkanı verir ve ardından exit
çağrılır. Seçilen syscall, kayıtları ayarlayacak ve eip
'yi önceki syscall talimatını çağırmak için hareket ettirecek bir sigreturn
'dır ve ikili alanı rwx
olarak ayarlamak için memprotect
çağrılır ve ESP ikili alanda ayarlanır. Akışı takip ederek, program ESP'ye tekrar okuma yapacak, ancak bu durumda ESP bir sonraki talimata işaret edecektir, böylece bir shellcode geçerek onu bir sonraki talimat olarak yazacak ve çalıştıracaktır.
SROP, bir shellcode'un yerleştirildiği yere yürütme ayrıcalıkları (memprotect) vermek için kullanılır.
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)