Stack Canaries

HackTricks'i Destekleyin

StackGuard ve StackShield

StackGuard, aşırı taşmaları önlemek için EIP (Genişletilmiş Komut İşaretçisi)'den önce özel bir değer olan canary'yi ekler, özellikle 0x000aff0d (null, newline, EOF, carriage return'ü temsil eder). Ancak, recv(), memcpy(), read(), ve bcopy() gibi fonksiyonlar hala savunmasızdır ve EBP (Taban İşaretçisi)'ni korumaz.

StackShield, StackGuard'dan daha sofistike bir yaklaşım benimseyerek Global Return Stack'i korur, tüm dönüş adreslerini (EIP'ler) depolar. Bu yapı, 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 atlatılabilir, bu da StackShield'ın yerel değişkenleri korumadığını gösterir.

Stack Smash Koruyucu (ProPolice) -fstack-protector:

Bu mekanizma, EBP'den önce bir canary yerleştirir ve yerel değişkenleri yeniden düzenleyerek tamponları daha yüksek bellek adreslerine yerleştirir, böylece diğer değişkenleri üzerine yazmalarını önler. 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.

Canary, /dev/urandom'dan türetilen rastgele bir sayı veya varsayılan bir değer olan 0xff0a0000'den gelir. 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ını sağlar. 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 canary oluşturulmadan kullanıldığında, tüm süreçler (ebeveyn ve çocuklar) aynı canary'yi paylaşır, bu da onu savunmasız hale getirir. i386 mimarisinde, canary gs:0x14'te saklanır ve x86_64'te fs:0x28'de saklanır.

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

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

Uzunluklar

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

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

Her iki canary'nin en anlamsız baytı bir null bayttır çünkü daha düşük adreslerden gelen yığındaki ilk bayt olacak ve bu nedenle dizeleri okuyan işlevler onu okumadan duracak.

Atlatmalar

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

  • Çocuk süreçlerde canary çatallanırsa, bir byte'ı bir seferde brute-force etmek mümkün olabilir:

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

Print Stack Canary
  • Yığına depolanan işaretçileri üzerine yazma

Yığına taşma açığı olan yığın, yığın canary'sine ulaşmadan da kullanılabilecek şekilde dizelerin veya işlevlerin adreslerini içerebilir. Yığın canary'sine ulaşmadan zafiyeti sömürmek için bu adreslerin üzerine yazılabilir. Kontrol edin:

Pointer Redirecting
  • Hem ana hem de iş parçacığı canary'sini değiştirme

Canary ile korunan bir iş parçacığı işlevinde bir tampon taşması, iş parçacığının ana canary'sini değiştirmek için kullanılabilir. Sonuç olarak, denetim, aynı olan iki canary ile kullanılan bir denetim olduğundan işe yaramaz hale gelir (ancak değiştirilmiş).

Ayrıca, canary ile korunan bir iş parçacığı işlevinde bir tampon taşması, TLS'de depolanan ana canary'yi değiştirmek için kullanılabilir. Bu, bir iş parçacığının yığınının bir bof aracılığıyla ulaşılabilir olabileceği bellek konumuna ulaşmak mümkün olduğundan mümkündür. Sonuç olarak, denetim, aynı olan iki canary ile kullanılan bir denetim olduğundan işe yaramaz hale gelir. Bu saldırı, http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads yazısında gerçekleştirilir.

Ayrıca, genellikle TLS'nin mmap tarafından saklandığını ve bir iş parçacığının yığını oluşturulduğunda bunun da mmap tarafından oluşturulduğunu belirten https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 sunumunu kontrol edin, bu da önceki yazıda gösterildiği gibi taşmaya izin verebilir.

  • __stack_chk_fail'in GOT girişini değiştirme

Eğer ikili dosyanın Partial RELRO'su varsa, o zaman GOT girişini __stack_chk_fail'in bir programı engellemeyen sahte bir işlev olacak şekilde değiştirmek için keyfi yazma kullanabilirsiniz.

Bu saldırı, https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/ yazısında gerçekleştirilir.

Referanslar

HackTricks'i Destekleyin

Last updated