Pythagras'ın cevabına yaptığı bir yorumda "arabellek taşması" ndan bahsettim, muhtemelen biraz ne demek istediğimi açıklığa kavuşturmalıyım. C'de, doğrudan bellekle çalışmanın tehlikeli olduğunu bilmek yeterli değildir - aynı zamanda tehlikeli olmasının kesin yollarını da anlamalısınız. Gerçekten bu durumlarda tümü için "ayak kendinizi çekim" metafor gibi değil - çok zaman, o değil sen tetiği çeken, ancak çoğu zaman sizinkine ve / veya kullanıcıları aykırı çıkarları bir aktör .
Örneğin, azalan yığına sahip bir mimaride (en popüler mimariler bu faturaya uyar - x86 ve ARM genellikle dahil), bir işlevi çağırdığınızda, işlevin dönüş adresi, öğede tanımlanan yerel değişkenlerden sonra yığına yerleştirilir. işlev gövdesi. Dolayısıyla, bir arabelleği yerel değişken olarak bildirir ve bu değişkeni, arabellek taşmasını denetlemeden dış dünyaya maruz bırakırsanız, şöyle:
void myFn(void) {
char buf[256];
gets(buf);
}
harici bir kullanıcı size yığından dönüş adresinin üzerine yazan bir dize gönderebilir - temel olarak, programınızın geçerli işleve yönlendiren çağrı grafiği çalışma zamanı fikrini değiştirebilir. Böylece kullanıcı size mimariniz için bazı yürütülebilir kodların ikili temsili, yığının taşması için yeterli dolgu myFn
ve myFn
size verdiği kodu göstermek için dönüş adresinin üzerine yazmak için bazı ek veriler sağlar . Böyle bir durumda, myFn
normalde arayanın denetimini döndürdüğü zaman , bunun yerine kötü niyetli kullanıcının sağladığı kodu kodlar. Güvenilmeyen kullanıcılara maruz kalma potansiyeli olan C (veya C ++) kodu yazarsanız , bu saldırı vektörünü anlamanız gerekir. Yığına karşı bir arabellek taşmasının neden yığına karşı genellikle daha kolay (ama her zaman değil) neden olduğunu ve yığındaki belleğin nasıl düzenlendiğini (çok fazla ayrıntıda değil, mutlaka, ama malloc()
'bir bölgenin onu çevreleyen kontrol yapılarına sahip olduğu fikri, programınızın neden bir başkasına malloc()
veya içine çöktüğünün anlaşılmasına yardımcı olabilir free()
).
C sizi makinenizin nasıl çalıştığı hakkında düşük seviyeli ayrıntılara maruz bırakır ve makineniz üzerinde günümüzde yaygın olarak kullanılan diğer kullanıcı tarafından düzenlenmiş diğer dillerden daha fazla doğrudan kontrol sağlar. Büyük güçle büyük sorumluluk gelir - C ile güvenli ve etkili bir şekilde çalışmak için aslında bu düşük seviyeli ayrıntıları anlamanız gerekir.