Ret2win
Temel Bilgiler
Ret2win zorlukları, özellikle binary exploitation içeren görevlerde, Capture The Flag (CTF) yarışmalarında popüler bir kategoridir. Amaç, verilen bir binary'deki bir zafiyeti sömürerek, genellikle win
, flag
vb. adlarla adlandırılan belirli bir çağrılmamış işlevi yürütmektir. Bu işlev, çalıştırıldığında genellikle bir bayrak veya başarı mesajı yazdırır. Genellikle, istenen işleve yürütme akışını yönlendirmek için stack üzerindeki dönüş adresini değiştirerek bir zafiyeti sömürmeyi içerir. İşte örneklerle daha detaylı bir açıklama:
C Örneği
Zafiyeti olan basit bir C programı ve çağırmayı amaçladığımız bir win
işlevi düşünün:
Bu programı yığın korumaları olmadan ve ASLR devre dışı bırakılarak derlemek için aşağıdaki komutu kullanabilirsiniz:
-m32
: Programı 32 bitlik bir ikili olarak derler (bu isteğe bağlıdır ancak CTF zorluklarında yaygındır).-fno-stack-protector
: Stack overflow'lara karşı korumaları devre dışı bırakır.-z execstack
: Stack üzerinde kodun çalışmasına izin verir.-no-pie
: Adresinwin
fonksiyonunun değişmediğinden emin olmak için Konum Bağımsız Yürütülebilir'i devre dışı bırakır.-o vulnerable
: Çıkış dosyasınıvulnerable
olarak adlandırır.
Pwntools Kullanarak Python Sızma
Sızma için güçlü bir CTF çerçevesi olan pwntools kullanacağız. Sızma betiği, tamponu taşırarak ve dönüş adresini win
fonksiyonunun adresiyle değiştirerek bir saldırı yükü oluşturacaktır.
win
fonksiyonunun adresini bulmak için gdb, objdump veya binary dosyaları incelemenize izin veren diğer araçları kullanabilirsiniz. Örneğin, objdump
ile şunu kullanabilirsiniz:
Bu komut, win
fonksiyonunun montajını ve başlangıç adresini gösterecektir.
Python betiği, vulnerable_function
tarafından işlendiğinde, tamamen oluşturulmuş bir ileti gönderir ve tamponu taşırarak yığın üzerindeki dönüş adresini win
adresiyle üzer yazar. vulnerable_function
geri döndüğünde, main
e dönmemek veya çıkmamak yerine win
e atlar ve ileti yazdırılır.
Korumalar
Adresin güvenilir olması için PIE devre dışı bırakılmalıdır veya işlevin depolanacağı adres her zaman aynı olmayacak ve
win
fonksiyonunun nerede yüklendiğini belirlemek için sızıntıya ihtiyacınız olacaktır. Bazı durumlarda, taşmayı tetikleyen işlevread
veya benzeri olduğunda, dönüş adresiniwin
fonksiyonu olacak şekilde değiştirmek için 1 veya 2 baytlık bir Kısmi Üzerine Yazma yapabilirsiniz. ASLR'nin çalışma şeklinden dolayı, son üç onaltılık hane rastgele değil, bu yüzden doğru dönüş adresini almak için 1/16 şans (1 onaltılık) vardır.Yığın Kanaryaları da devre dışı bırakılmalıdır veya tehlikeye atılan EIP dönüş adresi asla takip edilmeyecektir.
Diğer örnekler ve Referanslar
32 bit, ASLR yok
64 bit, ASLR ile, bin adresinin sızıntısı ile
64 bit, ASLR yok
32 bit, ASLR yok, çift küçük taşma, önce yığını taşmak ve ikinci taşmanın boyutunu genişletmek için
32 bit, relro, kanarya yok, nx, pie yok,
fflush
adresiniwin
fonksiyonuyla (ret2win) üzerine yazmak için format dizesi32 bit, nx, başka bir şey yok, EIP'nin (1 Bayt) kısmi üzerine yazılmasıyla win fonksiyonunu çağırmak
32 bit, nx, başka bir şey yok, EIP'nin (1 Bayt) kısmi üzerine yazılmasıyla win fonksiyonunu çağırmak
Program, girişin boyutunu kontrol etmek için bir numaranın son baytını doğruluyor, bu nedenle son baytın izin verilen aralık içinde olması koşuluyla herhangi bir boyut eklemek mümkündür. Ardından, giriş, bir ret2win ile istismar edilen bir tampon taşması oluşturur.
64 bit, relro, kanarya yok, nx, pie. Win fonksiyonunu (ret2win) çağırmak için kısmi üzerine yazma
arm64, PIE, win fonksiyonunun aslında 2 işlev olduğu için ROP cihazı, 2 işlevi çağıran ROP cihazı sağlar
ARM64, bir win fonksiyonunu çağırmak için bir eksik bir taşma kullanımı
ARM64 Örneği
pageRet2win - arm64Last updated