2010-03-03 18 views
6

-fstack-check ve -fstack-koruyucusu seçeneğini eklediğimde programım çöktü. __stack_chk_fail arka izde çağrılır.gcc seçeneği -fstack-check tam olarak nasıl çalışır?

Problemin nerede olduğunu nasıl bilebilirim? -fstack-check gerçekte ne kontrol ediyor? Gcc hakkında bilgi, cevabı bulmak için çok büyük görünüyor.

cevap

5

. Sanırım -fstack-check, kod yazıcısı 0 yığın işaretçisinin bir ofsetine ekleyecektir, böylece programın bir ihlal adresini ziyaret edip etmediğini test etmek için program çökerse çarptı. , ör. mov $ 0x0, -0x928 (% ESP)

+0

bazı kod örnekleri ve çıktıları ile detaylandırır mısınız? –

+0

Bunun sizin hatanınızla ilgisi yoktur. Cevabımı aşağıya bakın – rurban

2

"` -fstack-koruyucusu' savunmasız nesnelerle işlevlerine bir bekçi değişkeni ekleyerek. Bu yapılır böyle yığın çökertilmesi saldırılar olarak, tampon taşmaları denetlemek için ek kod yayar. Bu da çağrı alloca işlevleri içerir, ve 8 bayt daha büyük tamponlar ile çalışır. bir fonksiyon girdi ve işlev çıkar bir bekçi denetimi başarısız olursa., bir hata mesajı basılır ve program çıkar"

GCC Options That Control Optimization zaman sonra işaretlendiğinde nöbetçiler başlatılır

Bu bir ipucu verecektir Umut

Smashing The Stack For Fun And Profit

GCC extension for protecting applications from stack-smashing attacks

.. montaj programı kontrol sonra

+0

Bu çok yardımcı oldu, teşekkürler. – stcatz

+4

'-fstack-protector' ve' -fstack-check 'farklı seçenekler olduğunu lütfen unutmayın. (diğer Google çalışanlar için) – Offirmo

1

-fstack-check: İki özellik makro STACK_CHECK_BUILTIN ve STACK_CHECK_STATIC_BUILTIN varsayılan 0 bırakılırsa, bu sadece bir NULL karakter yerleştirilmeli her 4kb'lik (sayfa) yığın büyüdükçe. Varsayılan olarak yalnızca bir tane, ancak yığın birden fazla sayfa olduğunda büyüyebilir, bu en tehlikeli durum olan her 4 KB'dir. linux> 2.6 sadece yığın ve yığın arasında yalnızca bir küçük sayfa boşluğuna sahiptir. Bu durum, 2005'ten beri bilinen yığın-boşluk saldırılarına yol açabilir. Montaj için bkz. What exception is raised in C by GCC -fstack-check option. Gcc'de en az 2,95,3'ten beri, 3,6'dan beri argoda aktiftir.

__stack_chk_fail, basit bir yığın taşmasıyla üzerine yazılabilen takılı bir yığın kanarya değerini doğrulayan takılı -fstack-protector kodudur, örn. özyineleme ile.

İlgili konular