Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfTemel Bilgiler
ret2csu, bir programın kontrolünü almaya çalışırken, genellikle programın davranışını manipüle etmek için kullandığınız gadgets'ları bulamadığınızda kullanılan bir hacking tekniğidir.
Bir program belirli kütüphaneleri (libc gibi) kullandığında, programın farklı parçalarının birbirleriyle nasıl iletişim kuracağını yönetmek için bazı yerleşik işlevlere sahiptir. Bu işlevler arasında, özellikle __libc_csu_init
adı verilen kaybolan gadgets'larımız olarak işlev görebilecek bazı gizli mücevherler bulunmaktadır.
__libc_csu_init İçindeki Sihirli Gadgets
__libc_csu_init
içinde vurgulanması gereken iki talimat dizisi (gadget) bulunmaktadır:
İlk dizi, birkaç kaydın (rbx, rbp, r12, r13, r14, r15) değerlerini ayarlamamıza olanak tanır. Bunlar, daha sonra kullanmak istediğimiz sayıları veya adresleri depolayabileceğimiz slotlar gibidir.
Bu gadget, yığın üzerindeki değerleri bu register'lara alarak onları kontrol etmemizi sağlar.
İkinci dizilim, ayarladığımız değerleri kullanarak birkaç şey yapar:
Belirli değerleri diğer register'lara taşıyarak, bunları fonksiyonlarda parametre olarak kullanmaya hazır hale getirir.
r15 ve rbx'deki değerleri toplayarak ve ardından rbx'i 8 ile çarparak belirlenen bir konuma çağrı yapar.
Belki oraya yazacak herhangi bir adres bilmiyorsunuz ve bir
ret
talimatına ihtiyacınız var. İkinci gadget'ın da birret
ile biteceğini unutmayın, ancak ona ulaşmak için bazı koşulları yerine getirmeniz gerekecek:
Koşullar şunlardır:
[r12 + rbx*8]
çağrılabilir bir fonksiyonu depolayan bir adrese işaret etmelidir (eğer bir fikriniz yoksa ve pie yoksa, sadece_init
fonksiyonunu kullanabilirsiniz):Eğer _init
0x400560
adresindeyse, GEF kullanarak bellekte ona işaret eden bir işaretçi arayın ve[r12 + rbx*8]
'in _init'e işaret eden adres olmasını sağlayın:
rbp
verbx
aynı değere sahip olmalıdır, atlamayı önlemek içinDikkate almanız gereken bazı atlanan pops var
RDI ve RSI
rdi
ve rsi
'yi ret2csu gadget'ından kontrol etmenin bir başka yolu, belirli ofsetlere erişmektir:
Daha fazla bilgi için bu sayfayı kontrol edin:
BROP - Blind Return Oriented ProgrammingÖrnek
Çağrıyı Kullanma
Bir syscall yapmak veya write()
gibi bir fonksiyonu çağırmak istediğinizi hayal edin, ancak rdx
ve rsi
kayıtlarında parametreler için belirli değerlere ihtiyacınız var. Normalde, bu kayıtları doğrudan ayarlayan gadget'lar ararsınız, ancak bulamazsınız.
İşte burada ret2csu devreye giriyor:
Kayıtları Ayarlayın: İlk sihirli gadget'ı kullanarak yığın üzerindeki değerleri rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) ve r15'e pop edin.
İkinci Gadget'ı Kullanın: Bu kayıtlar ayarlandığında, ikinci gadget'ı kullanırsınız. Bu, seçtiğiniz değerleri
rdx
versi
'ye (sırasıyla r14 ve r13'ten) taşımanıza olanak tanır ve bir fonksiyon çağrısı için parametreleri hazırlar. Ayrıca,r15
verbx
'i kontrol ederek, programın hesapladığınız adreste bulunan bir fonksiyonu çağırmasını sağlayabilirsiniz ve bu adresi[r15 + rbx*8]
içine yerleştirebilirsiniz.
Bu tekniği kullanan ve burada açıklayan bir örneğiniz var ve bu, kullanılan son istismar:
Not edin ki önceki exploit bir RCE
gerçekleştirmek için değil, sadece win
adlı bir fonksiyonu çağırmak içindir (ROP zincirinde win
adresini stdin'den alarak ve bunu r15'te saklayarak) ve üçüncü bir argüman olarak 0xdeadbeefcafed00d
değerini alır.
Çağrıyı atlayarak ret'e ulaşma
Aşağıdaki exploit bu sayfadan çıkarılmıştır; burada ret2csu kullanılıyor ancak çağrıyı kullanmak yerine, karşılaştırmaları atlayarak ve çağrıdan sonra ret
'e ulaşarak işlem yapmaktadır:
Neden Sadece libc Kullanmayalım?
Genellikle bu durumlar da ret2plt + ret2lib ile savunmasızdır, ancak bazen libc'de doğrudan bulduğunuz gadget'larla kolayca kontrol edilebilecek parametrelerden daha fazlasını kontrol etmeniz gerekir. Örneğin, write()
fonksiyonu üç parametre gerektirir ve bunların hepsini doğrudan ayarlamak için gadget bulmak mümkün olmayabilir.
Last updated