WWW2Exec - GOT/PLT
Reading time: 5 minutes
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Temel Bilgiler
GOT: Global Offset Table
Global Offset Table (GOT), dinamik olarak bağlantılı ikili dosyalarda harici fonksiyonların adreslerini yönetmek için kullanılan bir mekanizmadır. Bu adresler çalışma zamanında (dinamik bağlantı nedeniyle) bilinmediğinden, GOT, bu harici sembollerin adresleri çözüldüğünde dinamik olarak güncellenmesini sağlar.
GOT'taki her giriş, ikilinin çağırabileceği harici kütüphanelerdeki bir sembole karşılık gelir. Bir fonksiyon ilk kez çağrıldığında, gerçek adresi dinamik bağlayıcı tarafından çözülür ve GOT'a kaydedilir. Aynı fonksiyona yapılan sonraki çağrılar, GOT'ta saklanan adresi kullanır ve böylece adresin tekrar çözülmesi için gereken yükten kaçınılır.
PLT: Procedure Linkage Table
Procedure Linkage Table (PLT), GOT ile yakından çalışır ve harici fonksiyonlara yapılan çağrıları yönetmek için bir trampolin görevi görür. Bir ikili dosya ilk kez bir harici fonksiyonu çağırdığında, kontrol o fonksiyonla ilişkili PLT'deki bir girişe geçer. Bu PLT girişi, fonksiyonun adresini çözmek için dinamik bağlayıcıyı çağırmaktan sorumludur, eğer bu adres daha önce çözülmemişse. Adres çözüldükten sonra, GOT'a kaydedilir.
Bu nedenle, GOT girişleri, bir harici fonksiyon veya değişkenin adresi çözüldüğünde doğrudan kullanılır. PLT girişleri, bu adreslerin dinamik bağlayıcı aracılığıyla ilk çözümlemesini kolaylaştırmak için kullanılır.
İcra Alma
GOT'u Kontrol Et
GOT tablosunun adresini almak için: objdump -s -j .got ./exec
GEF'de yürütülebilir dosyayı yükledikten sonra GOT'taki fonksiyonları görebileceğinizi gözlemleyin: gef➤ x/20x 0xADDR_GOT
GEF kullanarak bir hata ayıklama oturumu başlatabilir ve GOT tablosunu görmek için got
komutunu çalıştırabilirsiniz:
GOT2Exec
Bir ikili dosyada GOT, fonksiyonların adreslerini veya PLT bölümüne işaret eden adresleri içerir. Bu keyfi yazma işleminin amacı, daha sonra çalıştırılacak bir fonksiyonun GOT girişini, örneğin system
fonksiyonunun PLT adresi ile geçersiz kılmaktır.
İdeal olarak, parametrelerini kontrol ettiğiniz bir fonksiyonun GOT'unu geçersiz kılacaksınız (böylece sistem fonksiyonuna gönderilen parametreleri kontrol edebileceksiniz).
Eğer system
ikili dosya tarafından kullanılmıyorsa, sistem fonksiyonu PLT'de bir girişe sahip olmayacaktır. Bu senaryoda, önce system
fonksiyonunun adresini sızdırmanız ve ardından GOT'u bu adrese işaret edecek şekilde geçersiz kılmanız gerekecektir.
PLT adreslerini objdump -j .plt -d ./vuln_binary
ile görebilirsiniz.
libc GOT girişleri
libc'nin GOT'u genellikle kısmi RELRO ile derlenir, bu da onun adresini bulmanın mümkün olduğunu varsayarak iyi bir hedef haline getirir (ASLR).
libc'nin yaygın fonksiyonları, kod yürütmek için GOT'unun geçersiz kılınabileceği diğer iç fonksiyonları çağıracaktır.
Bu teknik hakkında daha fazla bilgi burada bulabilirsiniz.
Free2system
Heap istismarında CTF'lerde, parçaların içeriğini kontrol edebilmek ve bir noktada GOT tablosunu bile geçersiz kılabilmek yaygındır. Eğer bir gadget mevcut değilse, RCE elde etmek için basit bir hile, free
GOT adresini system
'a işaret edecek şekilde geçersiz kılmak ve bir parçanın içine "/bin/sh"
yazmaktır. Bu şekilde, bu parça serbest bırakıldığında, system("/bin/sh")
komutunu çalıştıracaktır.
Strlen2system
Bir diğer yaygın teknik, strlen
GOT adresini system
'a işaret edecek şekilde geçersiz kılmaktır, böylece bu fonksiyon kullanıcı girdisi ile çağrıldığında "/bin/sh"
dizesini geçmek ve bir shell almak mümkündür.
Ayrıca, puts
kullanıcı girdisi ile kullanıldığında, strlen
GOT adresini system
'a işaret edecek şekilde geçersiz kılmak ve "/bin/sh"
dizesini geçmek mümkündür çünkü puts
, kullanıcı girdisi ile strlen
'ı çağıracaktır.
One Gadget
Heap'ten GOT'a Saldırı
Heap zafiyetinden RCE elde etmenin yaygın bir yolu, hızlı bir binayı kötüye kullanmaktır, böylece GOT tablosunun bir kısmını hızlı binaya eklemek mümkün olur, böylece o parça tahsis edildiğinde genellikle free
olan bir fonksiyonun işaretçisini geçersiz kılmak mümkün olacaktır.
Sonra, free
'yi system
'a işaret edecek şekilde ayarlayıp /bin/sh\x00
yazılmış bir parçayı serbest bıraktığınızda bir shell çalıştıracaktır.
Burada bir örnek bulabilirsiniz.
Koruma
Full RELRO koruması, ikili dosya başlatıldığında fonksiyonların tüm adreslerini çözerek ve sonrasında GOT tablosunu yalnızca okunur hale getirerek bu tür tekniklere karşı koruma sağlamayı amaçlar:
Referanslar
- https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.