hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md

6.8 KiB
Raw Blame History

WWW2Exec - GOT/PLT

AWS hackleme konusunda sıfırdan kahramana kadar öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

GOT: Global Offset Table

Global Offset Table (GOT), dinamik olarak bağlanmış ikili dosyalarda harici fonksiyonların adreslerini yönetmek için kullanılan bir mekanizmadır. Bu adresler çalışma zamanında bilinmediğinden (dinamik bağlantı nedeniyle), GOT, bu harici sembollerin adreslerinin çözüldükten sonra dinamik olarak güncellenmesini sağlar.

GOT'taki her giriş, ikili dosyanın ç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'ta depolanır. Aynı fonksiyona yapılan sonraki çağrılar, GOT'ta depolanan adresi kullanır, böylece adresi tekrar çözme işleminden 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ı işlemek için bir trambolin olarak hizmet eder. Bir ikili harici bir fonksiyonu ilk kez çağırdığında, kontrol o fonksiyonla ilişkilendirilmiş PLT girişine geçer. Bu PLT girişi, fonksiyonun adresini çözmek için dinamik bağlayıcıyı çağırmaktan sorumludur eğer daha önce çözülmediyse. Adres çözüldükten sonra, GOT'ta saklanır.

Bu nedenle, harici bir fonksiyonun veya değişkenin adresi çözüldüğünde GOT girişleri doğrudan kullanılır. PLT girişleri, bu adreslerin başlangıçta çözülmesini sağlamak için dinamik bağlayıcı aracılığıyla kullanılır.

Yürütme Al

GOT'u Kontrol Et

GOT tablosunun adresini almak için: objdump -s -j .got ./exec

GEF içinde yürütülebilir dosyayı yükledikten sonra GOT içindeki fonksiyonları görebileceğinizi görebilirsiniz: gef➤ x/20x 0xDIR_GOT

GEF kullanarak hata ayıklama oturumu başlatabilir ve got komutunu çalıştırarak got tablosunu görebilirsiniz:

GOT2Exec

Bir ikili dosyada GOT, fonksiyonların adreslerine veya fonksiyon adresini yükleyecek PLT bölümüne sahiptir. Bu keyfi yazmanın amacı, daha sonra çalıştırılacak bir fonksiyonun GOT girişini örneğin system fonksiyonunun PLT adresiyle üzerine yazmaktır.

İdeal olarak, kontrolünüzdeki parametrelerle çağrılacak bir fonksiyonun GOT'unu üzerine yazacaksınız (böylece sistem fonksiyonuna gönderilen parametreleri kontrol edebileceksiniz).

Eğer system betiğin içinde kullanılmıyorsa, sistem fonksiyonunun PLT'de bir girişi olmayacak. Bu senaryoda, önce system fonksiyonunun adresini sızdırmanız ve ardından GOT'u bu adrese yönlendirmeniz gerekecektir.

PLT adreslerini objdump -j .plt -d ./vuln_binary ile görebilirsiniz.

libc GOT girişleri

Libc GOT'u, adresini belirlemek mümkünse (ASLR) hedef almak için güzel bir hedef olacak şekilde genellikle kısmi RELRO ile derlenir.

Libc'nin yaygın fonksiyonları, kod yürütmek için libc'nin GOT'unun üzerine yazılabilecek diğer iç fonksiyonları çağıracaktır.

Bu tekniğe ilişkin daha fazla bilgiyi burada bulabilirsiniz.

One Gadget

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

Koruma

Tam RELRO koruması, ikili başlatıldığında tüm fonksiyonların adreslerini çözerek ve ardından GOT tablosunu salt okunur hale getirerek bu tür tekniklere karşı koruma sağlar:

{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}

Referanslar

AWS hackleme konusunda sıfırdan kahramana kadar öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları: