.. | ||
bf-forked-stack-canaries.md | ||
print-stack-canary.md | ||
README.md |
Yığın Kanaryaları
htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerimizden oluşan The PEASS Family'yi keşfedin
- 💬 Discord grubuna katılın veya telegram grubuna veya Twitter 🐦 @hacktricks_live'ı takip edin.
- Hacking püf noktalarınızı HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.
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ı:
- Şirketinizi HackTricks'te reklamını görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerimizden oluşan The PEASS Family'yi keşfedin
- 💬 Discord grubuna katılın veya telegram grubuna veya Twitter 🐦 @hacktricks_live'ı takip edin.
- Hacking püf noktalarınızı HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.