hacktricks/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries
2024-04-07 03:13:19 +00:00
..
bf-forked-stack-canaries.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:13:19 +00:00
print-stack-canary.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:13:19 +00:00
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 03:13:19 +00:00

Yığın Kanaryaları

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

HackTricks'ı desteklemenin diğer yolları:

StackGuard ve StackShield

StackGuard, aşırı taşmaları önlemek için EIP (Extended Instruction Pointer)'den önce özel bir değer olan kanarya ekler, özellikle 0x000aff0d (null, newline, EOF, carriage return'ü temsil eder). Ancak, recv(), memcpy(), read() ve bcopy() gibi işlevler savunmasız kalır ve EBP (Base Pointer)'ı korumaz.

StackShield, tüm dönüş adreslerini (EIP'ler) depolayan bir Global Return Stack'e sahip olan StackGuard'dan daha sofistike bir yaklaşım benimser. Bu kurulum, taşmanın zarar vermemesini sağlar, çünkü depolanan ve gerçek dönüş adresleri arasında karşılaştırma yaparak taşma olaylarını tespit etmeyi sağlar. Ayrıca, StackShield, EIP'nin beklenen veri alanının dışına işaret ettiğini tespit etmek için dönüş adresini bir sınır değeriyle karşılaştırabilir. Bununla birlikte, Return-to-libc, ROP (Return-Oriented Programming) veya ret2ret gibi tekniklerle bu koruma atlanabilir, bu da StackShield'ın yerel değişkenleri korumadığını gösterir.

Yığın Saldırı Koruyucusu (ProPolice) -fstack-protector:

Bu mekanizma, EBP'den önce bir kanarya yerleştirir ve yerel değişkenleri yeniden düzenleyerek tamponları diğer değişkenleri üzerine yazmaktan koruyacak şekilde daha yüksek bellek adreslerine yerleştirir. Ayrıca, yığına geçirilen argümanları güvenli bir şekilde kopyalar ve bu kopyaları argüman olarak kullanır. Bununla birlikte, 8'den az öğeye sahip dizileri veya kullanıcının yapısındaki tamponları korumaz.

Kanarya, /dev/urandom'dan türetilen rastgele bir sayı veya varsayılan bir değer olan 0xff0a0000'den gelir. TLS (Thread Local Storage)'de depolanır ve bu, iplikler arasında paylaşılan bellek alanlarının iplik özel genel veya statik değişkenlere sahip olmasına olanak tanır. Bu değişkenler başlangıçta ebeveyn süreçten kopyalanır ve çocuk süreçler verilerini değiştirebilir ancak ebeveyni veya kardeşleri etkilemez. Bununla birlikte, fork() kullanılarak yeni bir kanarya oluşturulmadan kullanıldığında, tüm süreçler (ebeveyn ve çocuklar) aynı kanaryayı paylaşır, bu da onu savunmasız hale getirir. i386 mimarisinde kanarya gs:0x14'te, x86_64'te ise fs:0x28'de saklanır.

Bu yerel koruma, saldırılara açık tamponlara sahip işlevleri tanımlar ve bu işlevlerin başına kanaryayı yerleştirmek ve bütünlüğünü doğrulamak için bu işlevlerin başına kod enjekte eder.

Bir web sunucusu fork() kullandığında, kanaryayı byte byte tahmin etmek için bir brute-force saldırısını etkinleştirir. Ancak, fork()'ten sonra execve() kullanmak bellek alanını üzerine yazar ve saldırıyı geçersiz kılar. vfork(), çocuk sürecin yazmaya çalışana kadar çoğaltılmadan çalışmasına izin verir, bu noktada bir kopya oluşturulur ve farklı bir işlem oluşturma ve bellek işleme yaklaşımı sunar.

Uzunluklar

x64 ikili dosyalarında, kanarya çerezi bir 0x8 bayt qword'dür. İlk yedi bayt rastgele ve son bayt bir null bayttır.

x86 ikili dosyalarında, kanarya çerezi bir 0x4 bayt dword'dür. İlk üç bayt rastgele ve son bayt bir null bayttır.

{% hint style="danger" %} Her iki kanaryanın en anlamlı baytı bir null bayttır çünkü daha düşük adreslerden gelen yığından ilk olacak ve bu nedenle dizeleri okuyan işlevler onu okumadan duracak. {% endhint %}

Atlamalar

Kanaryayı sızdırmak ve ardından (örneğin tampon taşmasıyla) kendi değeriyle üzerine yazmak.

  • Çocuk süreçlerde kanarya çatallandığında bir byte'ı bir seferde brute-force etmek mümkün olabilir:

{% content-ref url="bf-forked-stack-canaries.md" %} bf-forked-stack-canaries.md {% endcontent-ref %}

  • İkili dosyada ilginç bir sızıntı veya keyfi okuma açığı varsa, sızdırmak mümkün olabilir:

{% content-ref url="print-stack-canary.md" %} print-stack-canary.md {% endcontent-ref %}

  • Yığında depolanan işaretçileri üzerine yazma

Yığın, yığın taşması için savunmasız olabilir ve bu, yığın kanaryasına ulaşmadan zafiyeti sömürmek için üzerine yazılabilecek dize veya işlev adreslerini içerebilir. Kontrol edin:

{% content-ref url="../../stack-overflow/pointer-redirecting.md" %} pointer-redirecting.md {% endcontent-ref %}

Referanslar

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

HackTricks'ı desteklemenin diğer yolları: