Heap Overflow

Reading time: 4 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Heap overflow, stack overflow gibi ama heap'te gerçekleşir. Temelde, bazı verileri depolamak için heap'te yer ayrıldığını ve depolanan verinin ayrılan alandan daha büyük olduğunu ifade eder.

Stack overflow'larda, bazı kayıtların, örneğin talimat işaretçisi veya stack çerçevesinin, stack'ten geri yükleneceğini biliyoruz ve bunu kötüye kullanmak mümkün olabilir. Heap overflow'larda ise, varsayılan olarak heap parçasında depolanan herhangi bir hassas bilgi yoktur. Ancak, hassas bilgiler veya işaretçiler olabilir, bu nedenle bu açığın kritikliği, hangi verilerin üzerine yazılabileceğine ve bir saldırganın bunu nasıl kötüye kullanabileceğine bağlıdır.

tip

Overflow offset'lerini bulmak için stack overflow'larda kullanılan aynı desenleri kullanabilirsiniz.

Stack Overflow'lar vs Heap Overflow'lar

Stack overflow'larda, açığın tetiklenebileceği anda stack'te bulunacak düzen ve veriler oldukça güvenilirdir. Bunun nedeni, stack'in lineer olması, her zaman çarpışan bellek içinde artması, programın çalışması sırasında stack belleğinin genellikle benzer türde verileri depolamasıdır ve her fonksiyon tarafından kullanılan stack parçasının sonunda bazı işaretçilerin bulunmasıdır.

Ancak, heap overflow durumunda, kullanılan bellek lineer değildir, ayrılan parçalar genellikle bellek içinde ayrı konumlarda (birbirinin yanında değil) bulunur çünkü boyutlarına göre ayrılan alanları ayıran bins ve zonlar vardır ve önceki serbest bellek kullanılır yeni parçalar ayırmadan önce. Bir heap overflow ile çarpışacak nesneyi bilmek karmaşıktır. Bu nedenle, bir heap overflow bulunduğunda, istenen nesnenin, overflow olabilecek nesnenin yanında bellek içinde olmasını sağlamak için güvenilir bir yol bulmak gerekir.

Bunun için kullanılan tekniklerden biri Heap Grooming'dir, örneğin bu yazıda kullanılır. Yazıda, iOS çekirdeğinde bir alanın bellek parçalarını depolamak için bellek kalmadığında, bir çekirdek sayfası ile genişletildiği ve bu sayfanın beklenen boyutlardaki parçalara bölündüğü açıklanmaktadır (iOS sürüm 9.2'ye kadar, ardından bu parçalar bu saldırıların istismarını zorlaştırmak için rastgele bir şekilde kullanılır).

Bu nedenle, önceki yazıda bir heap overflow gerçekleştiğinde, overflow olan nesneyi bir kurban nesnesi ile çarpışmaya zorlamak için, birkaç kalloc'un birkaç iş parçacığı tarafından zorlanması gerekir, böylece tüm serbest parçaların doldurulması ve yeni bir sayfanın oluşturulması sağlanır.

Belirli bir boyuttaki nesnelerle bu doldurmayı zorlamak için, iOS mach portu ile ilişkili dışarıdan ayrılan bellek ideal bir adaydır. Mesajın boyutunu ayarlayarak, kalloc ayrımının boyutunu tam olarak belirlemek mümkündür ve ilgili mach portu yok edildiğinde, ilgili ayrım hemen kfree'ye geri verilecektir.

Sonra, bu yer tutuculardan bazıları serbest bırakılabilir. kalloc.4096 serbest listesi, son giren ilk çıkar sırasına göre elemanları serbest bırakır, bu da temelde bazı yer tutucular serbest bırakıldığında ve istismar, overflow'a karşı savunmasız nesneyi ayarlamaya çalışırken birkaç kurban nesnesi ayarlamaya çalıştığında, bu nesnenin bir kurban nesnesi tarafından takip edilme olasılığının yüksek olduğu anlamına gelir.

Örnek libc

Bu sayfada bir heap overflow emülasyonu bulmak mümkündür; bu emülasyon, bir sonraki parçanın prev in use bitini ve prev boyutunun konumunu üzerine yazarak kullanılan bir parçayı konsolide etmenin (kullanılmamış gibi düşünmesini sağlayarak) ve sonra tekrar ayırmanın mümkün olduğunu gösterir; böylece farklı bir işaretçide kullanılan verileri de üzerine yazma imkanı sağlar.

Protostar heap 0 örneği, bir heap overflow'un istismar edilebileceği çok temel bir CTF örneğini göstermektedir; burada bayrağı almak için kazanan fonksiyonu çağırmak mümkündür.

Protostar heap 1 örneğinde, bir buffer overflow istismar edilerek yakın bir parçaya bir adresin üzerine yazılabileceği gösterilmektedir; burada kullanıcıdan rastgele verilerin yazılacağı bir adres bulunmaktadır.

Örnek ARM64

Sayfada https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/ bir heap overflow örneği bulabilirsiniz; burada yürütülecek bir komut, overflow olan parçanın sonraki parçasında depolanmaktadır. Bu nedenle, yürütülen komutu, kolay bir istismar ile üzerine yazarak değiştirmek mümkündür:

bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt

Diğer örnekler

  • Auth-or-out. Hack The Box
  • Bir Heap Overflow elde etmek için bir Integer Overflow zafiyetini kullanıyoruz.
  • Kod yürütmesi elde etmek için taşan parçanın içindeki bir struct içindeki bir işlevin işaretçilerini bozarız ve system gibi bir işlev ayarlarız.

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin