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 sinyalleri ele almak için tasarlanmış özel bir işlev olan sinyal işleyici ile sinyali işler.
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 (işlev ç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 depolayarak 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 depolanan 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 itibaren bu son istismar:
Ayrıca buradan istismarı kontrol edin burada ikili dosya zaten sigreturn
çağrıyordu ve bu nedenle bununla bir ROP inşa etmek gerekmez:
Yığıta yazma ve ardından sigreturn
syscall'ini çağıran 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ğıran 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, tekrar gets
çağrısı yaparak /bin/sh
'yi .bss
'ye yazar, 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ı sağlar 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ısı yapar ve ESP'yi ikili alanda ayarlar. Akışı takip ederek, program tekrar ESP'ye 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)