SROP - Sigreturn-Oriented Programming
Temel Bilgiler
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:
Ret2syscallEğ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:
Örnek
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:
Diğer Örnekler ve Referanslar
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, tekrargets
çağrısı yaparak/bin/sh
'yi.bss
'ye yazar,eax
'ı0xf
olarak ayarlamak içinalarm
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 veeip
'yi önceki syscall talimatını çağırmak için hareket ettirecek birsigreturn
'dır ve ikili alanırwx
olarak ayarlamak içinmemprotect
ç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.
Last updated