hacktricks/binary-exploitation/libc-heap/large-bin-attack.md

5.5 KiB
Raw Blame History

Büyük Bin Saldırısı

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

HackTricks'i Destekleyin
{% endhint %}

Temel Bilgiler

Bir büyük binin ne olduğu hakkında daha fazla bilgi için bu sayfaya bakın:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

how2heap - büyük bin saldırısı sayfasında harika bir örnek bulunabilir.

Temelde burada, en son "güncel" glibc sürümünde (2.35), P->bk_nextsize kontrol edilmediği için belirli koşullar sağlandığında büyük bir bin parçasının değeri ile bir adresin değiştirilebileceğini görebilirsiniz.

Bu örnekte aşağıdaki koşulları bulabilirsiniz:

  • Bir büyük parça tahsis edilir
  • İlk parçadan daha küçük ancak aynı dizindeki bir büyük parça tahsis edilir
  • Binde ilk sıraya gitmesi gerektiği için daha küçük olmalıdır
  • (Üst parçayla birleşmeyi önlemek için bir parça oluşturulur)
  • Ardından, ilk büyük parça serbest bırakılır ve ondan daha büyük yeni bir parça tahsis edilir -> Parça1 büyük bine gider
  • Ardından, ikinci büyük parça serbest bırakılır
  • Şimdi, zafiyet: Saldırgan chunk1->bk_nextsize'ı [hedef-0x20] olarak değiştirebilir
  • Ardından, chunk 2'den daha büyük bir parça tahsis edilir, bu nedenle chunk2, adresi chunk1->bk_nextsize->fd_nextsize'ı chunk2'nin adresi ile üzerine yazarak büyük bine eklenir

{% hint style="success" %} Diğer potansiyel senaryolar bulunmaktadır, önemli olan, büyük bine, bir mevcut X parçadan daha küçük bir parça eklemektir, bu nedenle binde X'ten hemen önce eklenmesi gerekmekte ve X'in bk_nextsize'ını değiştirebilmemiz gerekmektedir çünkü daha küçük parçanın adresinin yazılacağı yer burasıdır. {% endhint %}

Bu, malloc'tan ilgili kod parçalarıdır. Adresin nasıl üzerine yazıldığını daha iyi anlamak için yorumlar eklenmiştir:

{% code overflow="wrap" %}

/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck; // fwd = p1
bck = bck->bk; // bck = p1->bk

victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}

{% endcode %}

Bu, daha büyük parçalarla hızlı bin saldırısını sömürmek için libc'in global_max_fast global değişkenini üzerine yazmak için kullanılabilir.

Bu saldırının başka harika bir açıklamasını guyinatuxedo adresinde bulabilirsiniz.

Diğer örnekler

  • La casa de papel. HackOn CTF 2024
  • Aynı durumda büyük bin saldırısı how2heap adresinde göründüğü gibi.
  • Yazma ilkesi daha karmaşıktır, çünkü burada global_max_fast işe yaramaz.
  • Sömürüyü bitirmek için FSOP gereklidir.

{% hint style="success" %} AWS Hacking öğrenin ve pratik yapın:HackTricks Eğitimi AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Eğitimi GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin
{% endhint %}