Ret2win
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ret2win zorlukları, özellikle binary exploitation ile ilgili görevlerde Capture The Flag (CTF) yarışmalarında popüler bir kategoridir. Amaç, belirli bir ikili dosyadaki bir açığı kullanarak, genellikle win
, flag
gibi bir isimle anılan, ikili dosya içinde çağrılmamış bir fonksiyonu çalıştırmaktır. Bu fonksiyon çalıştırıldığında genellikle bir bayrak veya başarı mesajı yazdırır. Zorluk genellikle, istenen fonksiyona yürütme akışını yönlendirmek için yığın üzerindeki return address'i geçersiz kılmayı içerir. İşte daha ayrıntılı bir açıklama ve örnekler:
Bir açığı olan basit bir C programını ve çağırmayı amaçladığımız bir win
fonksiyonunu düşünün:
Bu programı yığın korumaları olmadan ve ASLR devre dışı bırakılmış olarak derlemek için aşağıdaki komutu kullanabilirsiniz:
-m32
: Programı 32-bit ikili olarak derle (bu isteğe bağlıdır ama CTF yarışmalarında yaygındır).
-fno-stack-protector
: Yığın taşmalarına karşı korumaları devre dışı bırak.
-z execstack
: Yığında kodun çalıştırılmasına izin ver.
-no-pie
: win
fonksiyonunun adresinin değişmemesini sağlamak için Konum Bağımsız İkiliyi devre dışı bırak.
-o vulnerable
: Çıktı dosyasını vulnerable
olarak adlandır.
Exploit için pwntools kullanacağız, bu güçlü bir CTF çerçevesidir. Exploit betiği, tamponu taşırmak ve dönüş adresini win
fonksiyonunun adresi ile yazmak için bir yük oluşturacaktır.
win
fonksiyonunun adresini bulmak için gdb, objdump veya ikili dosyaları incelemenizi sağlayan herhangi bir aracı kullanabilirsiniz. Örneğin, objdump
ile şunu kullanabilirsiniz:
Bu komut, win
fonksiyonunun başlangıç adresi de dahil olmak üzere, montajını gösterecektir.
Python betiği, vulnerable_function
tarafından işlendiğinde, tamponu taşıran ve yığın üzerindeki dönüş adresini win
adresi ile değiştiren dikkatlice hazırlanmış bir mesaj gönderir. vulnerable_function
döndüğünde, main
'e veya çıkışa dönmek yerine win
'e atlar ve mesaj yazdırılır.
PIE devre dışı bırakılmalıdır ki adres, yürütmeler arasında güvenilir olsun; aksi takdirde fonksiyonun saklanacağı adres her zaman aynı olmayacak ve win
fonksiyonunun nerede yüklü olduğunu anlamak için bir leak'e ihtiyacınız olacak. Bazı durumlarda, taşmaya neden olan fonksiyon read
veya benzeri olduğunda, dönüş adresini win
fonksiyonu olacak şekilde değiştirmek için 1 veya 2 baytlık bir Kısmi Üst Yazma yapabilirsiniz. ASLR'nin çalışma şekli nedeniyle, son üç hex nibble rastgeleleştirilmez, bu nedenle doğru dönüş adresini elde etme şansı 1/16 (1 nibble) vardır.
Yığın Kanalları da devre dışı bırakılmalıdır; aksi takdirde, tehlikeye atılmış EIP dönüş adresi asla takip edilmeyecektir.
32bit, ASLR yok
64 bit ASLR ile, bin adresinin leak'i ile
64 bit, ASLR yok
32 bit, ASLR yok, çift küçük taşma, ilk taşma yığını taşır ve ikinci taşmanın boyutunu büyütür
32 bit, relro, kanarya yok, nx, pie yok, fflush
adresini win
fonksiyonu ile üst yazmak için format dizesi (ret2win)
32 bit, nx, başka bir şey yok, win
fonksiyonunu çağırmak için EIP'nin kısmi üst yazması (1Bayt)
32 bit, nx, başka bir şey yok, win
fonksiyonunu çağırmak için EIP'nin kısmi üst yazması (1Bayt)
Program, bir sayının boyutunu kontrol etmek için yalnızca son baytı doğruluyor, bu nedenle son bayt izin verilen aralıkta olduğu sürece herhangi bir boyut eklemek mümkündür. Ardından, girdi, bir ret2win ile istismar edilen bir tampon taşması oluşturur.
64 bit, relro, kanarya yok, nx, pie. win
fonksiyonunu çağırmak için kısmi üst yazma (ret2win)
arm64, PIE, win
fonksiyonu aslında 2 fonksiyon olduğundan bir PIE leak verir, bu nedenle 2 fonksiyonu çağıran ROP gadget
ARM64, bir win
fonksiyonunu çağırmak için off-by-one
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)