mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
92 lines
6.1 KiB
Markdown
92 lines
6.1 KiB
Markdown
# 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`**
|
||
|
||
.png>)
|
||
|
||
GEF'de **yürütülebilir dosyayı yükledikten sonra** **GOT**'ta bulunan **fonksiyonları** **görebilirsiniz**: `gef➤ x/20x 0xADDR_GOT`
|
||
|
||
 (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:
|
||
|
||
.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}}
|