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, 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.
Sıradaki dizilim, kurduğumuz değerleri kullanarak birkaç şey yapar:
Belirli değerleri diğer kayıtlara taşır, bunları işlevlerde parametre olarak kullanmamız için 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 yazmak için herhangi bir adres bilmiyorsunuz ve bir
ret
talimatına ihtiyacınız var. İkinci cihazın da birret
ile sona ereceğini unutmayın, ancak ona ulaşmak için bazı koşulları karşılamanız gerekecek:
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:
BROP - 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 değerleri yığından 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 bu kullanılan son saldırı şudur:
Önceki saldırının bir RCE
yapmak 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 bunu r15'e saklayarak üçüncü bir argümanla değeri 0xdeadbeefcafed00d
olarak).
Çağrıyı atlayarak ve ret'e ulaşarak geçme
Aşağıdaki saldırı bu sayfadan çıkarıldı, burada ret2csu kullanılıyor ancak çağrı yerine karşılaştırmaları atlayarak ve çağrıdan sonra ret
'e ulaşılıyor:
Neden Sadece Libc'yi Kullanmıyoruz?
Genellikle bu durumlar ret2plt + ret2lib ile 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 ayarlayacak gadget'ları bulmak mümkün olmayabilir.
Last updated