4.7 KiB
Yığın Kanaryaları
AWS hackleme becerilerini sıfırdan ileri seviyeye öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live** takip edin.**
- Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
StackGuard ve StackShield
StackGuard, tampon taşmalarına karşı koruma sağlamak için EIP (Genişletilmiş Komut İşaretçisi)'den önce özel bir değer olan kanarya ekler, özellikle 0x000aff0d
(null, yeni satır, EOF, taşıma dönüşü) değerini kullanır. Ancak, recv()
, memcpy()
, read()
ve bcopy()
gibi işlevler hala savunmasızdır ve EBP (Taban İşaretçisi)'yi korumaz.
StackShield, StackGuard'dan daha sofistike bir yaklaşım benimseyerek tüm dönüş adreslerini (EIP'ler) depolayan bir Global Dönüş Yığını sürdürür. Bu yapı, taşma durumlarını tespit etmek için depolanan ve gerçek dönüş adresleri arasında karşılaştırma yapılmasını sağlayarak herhangi bir taşmanın zarar vermemesini 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, StackShield'ın da Return-to-libc, ROP (Return-Oriented Programming) veya ret2ret gibi tekniklerle atlatılabileceği, bu nedenle StackShield'ın yerel değişkenleri korumadığı anlamına gelir.
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ın diğer değişkenleri üzerine yazmasını engellemek için tamponları 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
kaynaklı rastgele bir sayı veya varsayılan 0xff0a0000
değerinden türetilen bir sayıdır. TLS (İş Parçacığı Yerel Depolama)'da saklanır ve iş parçacıkları arasında paylaşılan bellek alanlarına iş parçacığı özgü küresel veya statik değişkenlerin olmasına izin verir. 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
adresinde saklanır ve x86_64 mimarisinde fs:0x28
adresinde 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ı bayt bayt 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, yazmaya çalıştığında bir kopya oluşturulur, böylece farklı bir işlem oluşturma ve bellek işleme yaklaşımı sunar.
Atlamalar
- Kanaryayı sızdırmak ve ardından (örneğin tampon taşması) kendi değeriyle üzerine yazmak.
- Eğer kanarya çocuk süreçlerde çoğaltılırsa, bir bayt biriminde brute-force yapmak mümkün olabilir.
- Eğer ikili dosyada ilginç bir sızıntı açığı varsa, sızdırmak mümkün olabilir.