Ret2csu
https://www.scs.stanford.edu/brop/bittau-brop.pdfTemel Bilgiler
ret2csu, bir programın kontrolünü ele geçirmeye çalışırken genellikle programın davranışını manipüle etmek için kullandığınız gadget'ları bulamadığınızda kullanılan bir hackleme tekniğidir.
Bir program belirli kütüphaneleri (örneğin libc) kullandığında, programın farklı parçalarının birbirleriyle nasıl iletişim kuracaklarını yönetmek için bazı yerleşik işlevlere sahiptir. Bu işlevler arasında, özellikle __libc_csu_init
adı verilen bir tanesi gibi, eksik gadget'larımız gibi davranabilen bazı gizli mücevherler bulunmaktadır.
__libc_csu_init'teki Sihirli Gadget'lar
__libc_csu_init
içinde vurgulanması gereken iki talimat dizisi (gadget) bulunmaktadır:
İlk dizi bize birkaç kayıtta (rbx, rbp, r12, r13, r14, r15) değerler ayarlamamıza olanak tanır. Bunlar, daha sonra kullanmak istediğimiz sayıları veya adresleri saklayabileceğimiz yuvalar gibidir.
Bu cihaz, bu kayıtları yığınından çıkararak onları kontrol etmemizi sağlar.
İkinci sıra, kurduğumuz değerleri kullanarak birkaç şey yapmak için kullanılır:
Belirli değerleri diğer kayıtlara taşır, böylece bunları işlevlerde parametre olarak kullanmaya hazır hale getirir.
r15 ve rbx'deki değerleri toplayarak belirlenen bir konuma çağrı yapar, ardından rbx'i 8 ile çarpar.
Belki de oraya yazacak herhangi bir adres bilmiyorsunuz ve bir
ret
talimatına ihtiyacınız var. İkinci cihaz da birret
ile sona erecek, ancak ona ulaşmak için bazı koşulları karşılamanız gerekecek:
Koşullar şunlar olacak:
[r12 + rbx*8]
, çağrılabilir bir işlevi saklayan bir adrese işaret etmelidir (fikir yoksa ve pie yoksa, sadece_init
işlevini kullanabilirsiniz):Eğer _init
0x400560
adresinde ise, GEF'i kullanarak bellekte ona işaret eden bir işaretçi arayın ve[r12 + rbx*8]
adresi, _init'e işaret eden işaretçi olan adres olsun:
rbp
verbx
nin aynı değere sahip olması zıplamayı önlemek için gereklidirDikkate almanız gereken bazı atlanmış pop'lar bulunmaktadır
RDI ve RSI
Ret2csu cihazından rdi
ve rsi
'yi kontrol etmenin başka bir yolu, belirli ofsetlere erişerek yapılır:
Daha fazla bilgi için bu sayfaya bakın:
pageBROP - Blind Return Oriented ProgrammingÖrnek
Çağrıyı Kullanma
Bir sistem çağrısı yapmak veya write()
gibi bir işlevi çağırmak istediğinizi hayal edin, ancak rdx
ve rsi
kayıtlarında belirli değerlere ihtiyacınız var. Normalde, bu kayıtları doğrudan ayarlayan cihazları arardınız, ancak hiçbirini bulamazsınız.
İşte burada ret2csu devreye giriyor:
Kayıtları Ayarlayın: İlk sihirli cihazı kullanarak yığınından değerleri rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) ve r15'e alın.
İkinci Cihazı Kullanın: Bu kayıtlar ayarlandıktan sonra ikinci cihazı 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, işlev çağrısı için parametreleri hazırlar. Dahası,r15
verbx
'i kontrol ederek, hesapladığınız ve[r15 + rbx*8]
'e yerleştirdiğiniz adreste bulunan bir işlevi programı çağırabilirsiniz.
Bu tekniği kullanan ve açıklayan bir örneğe buradan ulaşabilirsiniz, ve kullanılan son saldırı şudur:
Önceki saldırının bir RCE
gerçekleştirmek için değil, sadece win
adlı bir işlevi çağırmak için tasarlandığını unutmayın (win
adresini stdin'den alarak ROP zincirinde gets'i çağırıp ve r15'te saklayarak üçüncü argümanı 0xdeadbeefcafed00d
değeri ile çağırır).
Çağrıyı atlayarak ve ret'e ulaşarak geçme
Aşağıdaki saldırı bu sayfadan çıkarılmıştır, burada ret2csu kullanılmış ancak çağrı yerine karşılaştırmaları atlayarak ve çağrıdan sonra ret
'e ulaşılmıştır:
Neden Sadece libc'yi Kullanmıyoruz?
Genellikle bu durumlar ret2plt + ret2lib için de savunmasız olabilir, ancak bazen doğrudan libc içinde bulduğunuz gadget'larla kolayca kontrol edilemeyen daha fazla parametreyi kontrol etmeniz gerekebilir. Örneğin, write()
fonksiyonu üç parametre gerektirir ve bu parametreleri doğrudan ayarlamak için gerekli olan gadget'ları bulmak mümkün olmayabilir.
Last updated