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

6.7 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ği için (dinamik bağlantı nedeniyle), GOT, bu harici sembollerin adreslerini çözüldükten sonra dinamik olarak güncellemek için bir yol 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, dinamik bağlayıcı tarafından gerçek adresi çö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şkili 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 depolanı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 kolaylaştırmak 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'ta bulunan fonksiyonları görebilirsiniz: gef➤ x/20x 0xDIR_GOT

GEF kullanarak 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 adreslerine veya fonksiyon adresini yükleyecek PLT bölümüne sahiptir. Bu keyfi yazmanın amacı, daha sonra yürütülecek bir fonksiyonun GOT girişini değiştirmektir örneğin system fonksiyonunun PLT adresiyle.

İdeal olarak, kontrolünü sağladığınız 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 işaret etmek için üzerine yazmanız 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'in yaygın fonksiyonları, kod yürütme elde etmek için üzerine yazılabilecek diğer dahili fonksiyonları çağıracaktır.

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

Tek Gadget

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

Korunmalar

Tam RELRO koruması, ikili başlatıldığında tüm fonksiyonların adreslerini çözerek ve GOT tablosunu salt okunur hale getirerek bu tür tekniklere karşı koruma sağlamayı amaç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ı: