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

5.1 KiB
Raw Blame History

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

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!

HackTricks'i desteklemenin diğer yolları:

Temel Bilgiler

Büyük bir 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 %}

Bir örnek bulmak mümkündür how2heap - büyük bin saldırısı.

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

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

  • Büyük bir parça tahsis edilir
  • İlk parçadan daha küçük ancak aynı dizindeki başka 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
  • Daha sonra, 2. parçadan daha büyük bir parça tahsis edilir, bu nedenle parça2, adresi chunk1->bk_nextsize->fd_nextsize'ı parça2'nin adresiyle üzerine yazarak büyük bine eklenir

{% hint style="success" %} Diğer potansiyel senaryolar da vardır, önemli olan, büyük bir bine, bir mevcut X parçadan daha küçük bir parça eklemektir, bu nedenle bine sadece ondan önce eklenmesi gerekmektedir 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çacığı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ı bir kova 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.

Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları: