Yanıtlar:
Yığın koruması derleyici tarafından yapılır (yığına ekstra veri ekleyin ve çağrı sırasında biraz saklayın, dönüşte akıl sağlığını kontrol edin). Yeniden derlemeden devre dışı bırakılamaz. Mesele bu, gerçekten ...
Vonbrand'ın söylediklerini genişletmek için (doğru, +1), Linux'un yığın korumasının iki kısmı var.
Yığın kanaryalar vonbrand'ın derleyici tarafından zorlanan özelliğidir. Bunlar yeniden derleme olmadan devre dışı bırakılamaz.
Bunu kendinize kanıtlamak ve nasıl çalıştıklarını görmek için aşağıdaki kodu alın:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
int mybadfunction(char* a_bad_idea)
{
char what[100];
strcpy(what, a_bad_idea);
printf("You passed %s\n", what);
}
int main(int argc, char** argv)
{
printf("Tralalalaala\n");
mybadfunction(argv[1]);
}
Şimdi bu ( gcc -fstack-protector -masm=intel -S test.c
) çıktıyı bir araya getirmek ve okumaktan mutluluk duyacağınız bir şey haline getirin. Önemli olan, mybadfunction
fonksiyondan çıkışta bu küçük kod parçasının olmasıdır:
mov edx, DWORD PTR [ebp-12]
xor edx, DWORD PTR gs:20
je .L2
call __stack_chk_fail
Tahmin edebileceğiniz gibi, bu bir yığın çerezi alıp [ebp-12]
adresindeki değerle karşılaştırıyor gs:20
. Eşleşmiyor mu? Daha sonra __stack_chk_fail
glibc'de programınızı orada öldüren bir işlev çağırır .
Bu açıkları istismar yazma açısından çözmenin yolları vardır, ancak bir shellcode test örneği oluşturmanın kolay yolu programınızı derlemektir -fno-stack-protector
.
Modern Linux sistemleri hakkında başka düşünceler de var. Her zamanki shellcode test saplamasını alırsanız:
char buffer[] = {...};
typedef void (* func)(void);
int main(int argc, char** argv)
{
func f = (func) buffer;
f();
return 0;
}
modern GCC / Linux .rodata
, PE dosyasının sadece yürütme izni olmadan okunan bölümünü eşler. Bu blog gönderisindeki kod örneği kullanılarak yapılabilecek olanı kapatmanız gerekir . Temel fikir: mprotect
kabuk kodu verilerinin bulunduğu sayfalara istediğiniz izinleri eklemek için kullanılır .
Geleneksel bir istismar senaryosunu, örneğin yukarıdaki kötü kodumu, kabuk kodunuzla test edecekseniz, yığının basit durumlar için çalıştırılabilir olduğundan emin olmanız gerekir. PE dosya biçimi yığının yürütülebilir olup olmadığını belirlemek için bir alan içerir - bunu execstack ile sorgulayabilir ve kontrol edebilirsiniz . Yürütülebilir bir yığını etkinleştirmek için,
execstack -s /path/to/myprog
Bu , yeniden derlemeye gerek kalmadan rastgele programlarda yapılabilir, ancak bunlar derleme üzerinde pişirildiklerinden yığın kanaryalarını otomatik olarak devre dışı bırakmaz.
Bunu kapatmak için echo 0 > /proc/sys/kernel/randomize_va_space
.
Hayır. Herhangi bir sömürü yığın kanaryalar (çok önemsiz değil) etrafında çalışmalı ve execstack
set ile bir program bulmalı veya ayarlamalıdır (zaten zaten rastgele komutları yürütebilir) veya libc / return'e dönüş gibi daha zor teknikler kullanmalıdır. yönlendirilmiş programlama.
Bu seçeneklerle bazı korumaları (yığın parçalama algılaması ve yığını yürütülebilir hale getirme) devre dışı bırakabilirsiniz.
--z execstack
-f no-stack-protector
Ayrıca, Bash ile ASLR'yi (adres alanı düzeni rasgelelemesi) şu komutla kapatabilirsiniz:
echo 0 > /proc/sys/kernel/randomize_va_space