GOT Overwrite¶
Writable bir Global Offset Table entry'sini (no/partial RELRO) overwrite et ki bir sonraki library call
system/one_gadget'a yönlendirilsin.
Mechanism¶
Note
Global Offset Table (.got.plt), external library fonksiyonlarının resolve edilmiş
adreslerini tutar; dynamic linker tarafından ilk call'da lazy olarak doldurulur.
Default lazy binding altında PLT stub'ı GOT entry'si üzerinden atlar; entry
başlangıçta _dl_runtime_resolve'u invoke etmek için tekrar PLT'ye işaret eder ve
resolver gerçek libc adresini GOT slot'una yazar. Bu runtime write zorunluluğu
.got.plt'yi writable bırakır. Security boundary, o tablonun writable olup olmadığıdır. no RELRO veya partial
RELRO altında GOT writable kalır, dolayısıyla bir arbitrary write bir entry'yi
(örneğin printf, free, strlen slot'unu) bir saldırgan adresiyle değiştirebilir.
O imported fonksiyona yapılan bir sonraki call kontrolü seçilen hedefe aktarır —
herhangi bir write-what-where'i control-flow hijack'ine çevirir. Full RELRO tüm
sembolleri load anında eager resolve eder ve GOT'u read-only remap'leyerek hedefi
tamamen ortadan kaldırır.
Walkthrough¶
Kavramsal tarif:
- RELRO durumunu doğrula (
checksec): teknik no/partial RELRO gerektirir; hedef GOT entry'sini bul (objdump -R). - Bir arbitrary write elde et — writable bir global'e stack overflow, format-string
%n(format-string-bug.md) veya bir heap primitive. - Seçilen GOT entry'sini
system/one_gadget ile overwrite et (ASLR'yi boşa çıkarmak için bir leak kullanarak). - Hijack edilen call'un argümanının kontrol edildiğinden emin ol (örneğin
"/bin/sh"tutan bir buffer), sonra call'u tetikle.
Warning
Partial RELRO .got.plt'yi yine writable bırakır; yalnızca full RELRO hedefi
ortadan kaldırır. one_gadget kısıtları, call site'ta register/stack state'in doğru
olmasını gerektirebilir.
Detection¶
- GOT içeriğini beklenen resolve edilmiş adreslere karşı periyodik olarak hash'le/doğrula.
.got/.got.pltiçine yapılan write'larda uyarı veren page-protection veya hardware watchpoint'ler.- İlgili library'nin
.text'inin dışına resolve olan imported-call hedefleri.
Mitigation¶
- Full RELRO ile derle:
-Wl,-z,relro,-z,now→ load sonrası GOT read-only; saldırganların hook'lara, exit handler'lara, vtable'lara veyaret2dlresolve'a pivot etmesi gerekir. - ASLR/PIE artı info-leak önleme; indirect call'larda CFI.
- En azından partial RELRO GOT'u program globaller'inin üstünde tutar (zayıf — writable kalır).