Skip to content

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:

  1. RELRO durumunu doğrula (checksec): teknik no/partial RELRO gerektirir; hedef GOT entry'sini bul (objdump -R).
  2. Bir arbitrary write elde et — writable bir global'e stack overflow, format-string %n (format-string-bug.md) veya bir heap primitive.
  3. Seçilen GOT entry'sini system/one_gadget ile overwrite et (ASLR'yi boşa çıkarmak için bir leak kullanarak).
  4. Hijack edilen call'un argümanının kontrol edildiğinden emin ol (örneğin "/bin/sh" tutan bir buffer), sonra call'u tetikle.
*got['free'] = &system     # then free(ptr-to-"/bin/sh") executes a shell

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.plt iç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 veya ret2dlresolve'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).

References