Smashing The Stack For Fun And Profit - Çeviri

Part I. [http://phrack.org/issues/49/14.html]
7. seviye, 49. Problem

Aleph One Tarafından…

‘Smash the stack’ (C programlama), birçok C uygulamasında bir dizi data göndererek belirtilen yığını bozmak mümkündür. Genellikle bu kod blokları yığını parçalamak için kullanılır ve bu yığının parçalanması sonucundan geriye rastgele bir adres döndürür. Bahse konu zafiyet insanlık tarihinin görüp görebileceği en sinsi zafiyetlerini ortaya çıkarabilir. Elbette bu zafiyet türü için birden çok varyasyonlar üretilebilir, bunlar; yığını çöpe atma, yığını karalama ve yığını ezme gibi isimlerle karşımıza çıkabilir lakin yığın mung terimi ise burada kullanılmaz. Ayrıca bknz. takma ad hatası, çekirdekte fandango, bellek sızıntısı, öncelik kaybı, taşma vidası.

Geçtiğimiz aylarda buffer overflow atak zafiyetlerinde hem keşifsel hem exploit anlamında bir artış yaşandı. Bu artışlardan etkilenen; syslog, splitvt, sendmail 8.7.5, Linux / FreeBSD , Xt, at başlıcaları olarak göze çarpıyor. Bu makale aslen arabellek taşmalarının ne olduğunu ve bunlardan nasıl faydalanılacağını anlatıyor olacak, iyi seyirler.

Bu makalede başlangıç seviye assembly bilgisi yeterli olacaktır. Sanal bellek kavramlarını anlamak iyi olacağı gibi eğer gdb deneyiminiz varsa bu da size yardımcı olacaktır ama hayati bir gereksinim değildir. Bu makalede Intel x86 CPU(32-Bit) ile çalıştığımızı varsayarak bunun yanında Linux işletim sistemi kullanacağımızı unutmayalım.

Başlamadan önce bazı temel tanımlara değinmekte fayda var: Bir tampon bellek(buffer) aynı veri tipinin bitişik şekilde birden fazla örneğini tutan yapılardır. C programcıları normalde tampon dizileri kelimesi ile bu açık arasında bağlantı kurmaktadır. En yaygın olarak adlandırılan ise karakter dizileridir. Diziler, C programlamadaki değişkenler gibi statik ve dinamik olarakta bildirilebilir.

İşlem Hafıza Organizasyonu

Öncelikle yığın tampon belleğinin ne olduğunu anlamak için; işlem, hafızada düzenli bir hale getirilir. İşlemler 3 alan üstüne ayrılmıştır, bunlar; text, data ve stack alanlarıdır. Biz çoğunlukla stack alanı üzerinde duracağız lakin yeni başlayan arkadaşlar için diğer alanlar hakkında kısaca bilgi vermek faydalı olacaktır.

Text alanı; uygulamalar tarafından kullanılan salt okunur bir alandır. Asıl olarak bu alan uygulamanın metin bölümüne karşılık gelir. Sadece salt okunur olduğundan dolayı herhangi bir yazma girişiminde hafıza hatası alınması kaçınılmazdır.

Data alanı; başlatılmış ve başlatılmamış tüm uygulama bilgileri bu alanda tutulur. Statik değişkenlerde bu alan üstünde saklanır. Ek olarak bu alanın çalıştırılabilir olarak karşılığı ise data-bss bölümüne denk gelmektedir. Bss üstünde bulunan alan genişler ve kendine ait olan alanı tüketirse hafıza istemcisi bunu anlayarak programın engeller ve olası bir hatadan sistemi kurtarır. Sonrasında yeni bir alan tedarik ederek işlemin sağlıklı bir biçimde çalışmasını sağlar. Data ve stack arasına ise yeni segmentler eklenerek çalışmaya devam edilir.

                         /------------------\  lower
                         |                  |  memory
                         |       Text       |  addresses
                         |                  |
                         |------------------|
                         |   (Initialized)  |
                         |        Data      |
                         |  (Uninitialized) |
                         |------------------|
                         |                  |
                         |       Stack      |  higher
                         |                  |  memory
                         \------------------/  addresses

                     Fig. 1 Process Memory Regions
3 Beğeni