C derleyici bayrakları olmadan arabellek taşması için Ubuntu'da yığın korumasını devre dışı bırak


10

Bazı kabuk kodlarını denemek istiyorum ve linux korumalarını devre dışı bırakmak istiyorum.

Bayrakları kullanarak derleyebileceğimi biliyorum ama genel olarak bu korumaları devre dışı bırakmanın başka bir yolu olduğunu biliyorum. Bana yardımcı olabilir misiniz?

Yanıtlar:


6

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 ...


6
ASLR işletim sisteminin çalışma zamanında yapmasını gerektirir. NX bitleri ayrıca sistem desteği gerektirir. Hangi bölüm çalışma zamanında devre dışı bırakılamaz?
Jeff Ferland

25

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

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, mybadfunctionfonksiyondan çı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_failglibc'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.

Yürütülemeyen sayfalar

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: mprotectkabuk kodu verilerinin bulunduğu sayfalara istediğiniz izinleri eklemek için kullanılır .

Yürütülemez yığınlar

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.

Ek bonus: aslr:

Bunu kapatmak için echo 0 > /proc/sys/kernel/randomize_va_space.

Birisine değerli penguenimi nasıl kullanacağını anlattın mı?

Hayır. Herhangi bir sömürü yığın kanaryalar (çok önemsiz değil) etrafında çalışmalı ve execstackset 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.


0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.