92 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# WWW2Exec - GOT/PLT
{{#include ../../banners/hacktricks-training.md}}
## **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 adreslerini çözüldükten sonra **dinamik olarak güncellemenin** bir yolunu 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 ek 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**'ta saklanır.
**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.**
## Get Execution
### GOT'u Kontrol Et
GOT tablosunun adresini almak için: **`objdump -s -j .got ./exec`**
![](<../../images/image (121).png>)
GEF'de **yürütülebilir dosyayı yükledikten sonra** **GOT**'ta bulunan **fonksiyonları** **görebilirsiniz**: `gef➤ x/20x 0xADDR_GOT`
![](<../../images/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
GEF kullanarak bir **hata ayıklama** oturumu **başlatabilir** ve GOT tablosunu görmek için **`got`** komutunu çalıştırabilirsiniz:
![](<../../images/image (496).png>)
### 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ğu varsayımıyla güzel bir hedef haline getirir ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)).
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**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries) 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**
{{#ref}}
../rop-return-oriented-programing/ret2lib/one-gadget.md
{{#endref}}
## **Heap'ten GOT'u Kötüye Kullanma**
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 ayarlamak ve `/bin/sh\x00` yazılmış bir parçayı serbest bırakmak bir shell çalıştıracaktır.
Bir [**örneği burada bulabilirsiniz**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.**
## **Koruma**
**Full RELRO** koruması, ikili dosya başlatıldığında fonksiyonların tüm adreslerini çözerek ve **GOT tablosunu yalnızca okunur** hale getirerek bu tür tekniklere karşı koruma sağlamayı amaçlar:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
## Referanslar
- [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](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](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
{{#include ../../banners/hacktricks-training.md}}