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

7.1 KiB
Raw Blame History

WWW2Exec - GOT/PLT

{% hint style="success" %} AWS Hacking'ı öğrenin ve uygulayın: HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'ı öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}

Temel Bilgiler

GOT: Global Offset Table

Global Offset Table (GOT), dinamik olarak bağlanmış ikili dosyalarda harici işlevlerin 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 adreslerinin çözüldükten sonra bu adresleri 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 işlev ilk kez çağrıldığında, dinamik bağlayıcı tarafından gerçek adresi çözülür ve GOT'ta depolanır. Aynı işlevin sonraki çağrıları, GOT'ta depolanan adresi kullanır, böylece adresi tekrar çözme gereksiniminden kaçınılır.

PLT: Procedure Linkage Table

Procedure Linkage Table (PLT), GOT ile yakından çalışır ve harici işlevlere yapılan çağrıları işlemek için bir trambolin görevi görür. Bir ikili bir harici işlevi ilk kez çağırdığında, kontrol, o işlevle ilişkili PLT girişine geçer. Bu PLT girişi, işlevin adresini çözmek için dinamik bağlayıcıyı çağırmaktan sorumludur eğer daha önce çözülmemişse. Adres çözüldükten sonra, GOT'ta depolanır.

Bu nedenle, harici bir işlevin 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 dinamik bağlayıcı aracılığıyla kolaylaştırmak için kullanılır.

Yürütme Al

GOT'u Kontrol Et

objdump -s -j .got ./exec komutu ile GOT tablosunun adresini alın.

GEF ile yürütülebilir dosyayı yükledikten sonra GOT'ta bulunan işlevleri görebilirsiniz: gef➤ x/20x 0xADDR_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, işlevlerin adreslerine veya işlev adresini yükleyecek olan PLT bölümüne sahiptir. Bu keyfi yazma işleminin amacı, daha sonra system işlevinin PLT'sinin adresiyle değiştirilecek bir işlevin GOT girişini geçersiz kılmaktır.

İdeal olarak, kontrolünü sağladığınız parametrelerle çağrılacak bir işlevin GOT'unu geçersiz kılacaksınız (bu sayede sistem işlevine gönderilen parametreleri kontrol edebileceksiniz).

Eğer ikili tarafından system kullanılmıyorsa, sistem işlevinin PLT'de bir girişi olmayacak. Bu senaryoda, önce system işlevinin adresini sızdırmanız ve ardından GOT'u bu adrese işaretleyecek şekilde üzerine yazmanız gerekecektir.

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

libc GOT girişleri

Libc GOT'un partial RELRO ile derlenmesi genellikle mümkünse adresini bulmak için güzel bir hedef oluşturur (ASLR).

Libc'nin yaygın işlevleri, başka dahili işlevleri çağıracaklar ve bu işlevlerin GOT'u geçersiz kılınarak kod yürütme elde edilebilir.

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

Free2system

Heap istismarı CTF'lerinde genellikle parçaların içeriğini kontrol edebilmek ve GOT tablosunu hatta bazen üzerine yazabilmek mümkündür. Eğer bir gadget mevcut değilse RCE elde etmek için basit bir hile, free GOT adresini system'e işaret etmek ve bir parçaya "/bin/sh" yazmaktır. Bu şekilde bu parça serbest bırakıldığında system("/bin/sh") çalıştırılacaktır.

Strlen2system

Başka yaygın bir teknik, strlen GOT adresini system'e işaret etmektir, böylece bu işlev kullanıcı girdisiyle çağrıldığında "/bin/sh" dizesini geçmek ve bir kabuk almak mümkün olacaktır.

Ayrıca, eğer puts kullanıcı girdisiyle kullanılıyorsa, strlen GOT adresini system'e işaret etmek ve dize "/bin/sh"'yi geçmek mümkün olacaktır çünkü puts, kullanıcı girdisiyle strlen'i çağıracaktır.

One Gadget

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

Heap'ten GOT'un Kötüye Kullanımı

Bir heap zafiyetinden RCE elde etmenin yaygın bir yolu, bir fastbin'i kötüye kullanmak ve GOT tablosunun bir kısmını hızlı bin içine eklemek, böylece o parça tahsis edildiğinde genellikle free işlevinin işaretçisini üzerine yazmak mümkün olacaktır.
Ardından, free'yi system'e işaret etmek ve /bin/sh\x00 yazılmış bir parçayı serbest bırakmak, bir kabuk yürütmek mümkün olacaktır.

Bir örneği burada bulabilirsiniz.

Koruma

Tam RELRO koruması, ikili başlatıldığında tüm işlevlerin adreslerini çözerek ve ardından 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