Buffer Overflow ile HACK

Başlatan kadir603, 06 Haziran 2012 - 01:57:40

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

kadir603

merhaba c dili ile system belleğini taşırıp systemde root yetkisi aliniyor. c ile Remote exploit yazılabilirmi ? Burdaki bellek taşırmak tam olark ne anlama geliyor exploitler bu mantıklar ile mi yaziliyor. bu tür ataklarların başarili olması systemden kaynaklanan acıktan dolayımı yoksa c dilinin verdiği yetkilerden dolayımı. bu konu ile ilgili doğru düzgün bir türkce kaynak elde edemedim bu konu ile ilgili detaylı bir döküman vere bilecek arkadaşlar varmı kitapta olabilir.

cagriemer

http://www.enderunix.org/docs/bof.txt adresini gormus muydunuz? Ornekli bir anlatimi mevcut.

kadir603

bu döküman elimde mevcut. konu hakkında bilgi olarak yetersiz yinede teşekürler. elinde daha kapsamli bilgi içiren dökümanvarmı

sem

Benim bildiğim şu anki sistemlerde belleği taşırınca overflow hatası ile uygulama çakılıyor. =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ekremsenturk

#4
Belirli veri türleri var. Bu veri türlerinin belirli sınırları var. Bazı veri türlerinin 32 bit ve 64 bit'te farklı sınırları var. Kendi ilk tasarladığım program'ım, dc ile yazılmış, bir tek satırlık hesaplayıcı idi. Her girilen rakam beş ile çarpılırdı. Hesabın sonucu İki Milyon küsür'ü aştığında, çarpım için kullanılan rakam, ne kadar yüksek olursa olsun, sonuç hep en yüksek ulaşılabilecek olan İki Milyon küsürde kalıyordu. Ve sadece tam sayılar hesaplanabiliyordu. Yani virgüllü rakamlar ile hesaplanamıyordu, çünkü virgüllü rakamlar farklı bir veri türü oluyorlar.

C ve C++ da bu sınır aşıldığında, sınır korunamıyor ve hesapların sonuçları denetimden çıkıyorlar ( benim anladığım kadar ). Bu da programlama dilinin bir güvenlik zaaf'ıdır. Bu tür kusurları ise, programcıların kendileri dikkate alarak önlemeleri gerekiyor.

Dikkatsizlikten doğan hatalar ise, Hacker'lerin yararlandıkları açıklar.

sem

Evet dediğiniz gibi bir durum söz konusu. Sınır korunamama durumu yani. Buna bit taşması deniliyor.

01111111

Örneğin 8 bit ile yazılabilecek en büyük sayı bu. En soldaki bit ise işaret biti 0 ya da 1 olmasına göre sayı pozitif ya da negatif olarak değerlendiriliyor.  Bu sayıya örneğin;

00000011

eklediğimiz zaman toplam sonucunda işaret bitinin etkilendiğini görüyoruz. Bu gibi durumlar overflow'a neden olmazlar. Çünkü sayı için ayrılmış olan yer yani bellek bellidir.

OverFlow daha çok bellekte ayrılan yer ile alakalı.

Örneğin

void stack_patlat(){
int a = 5;
printf("%d\n", a);
stack_patlat();
}

fonksiyonu ekrana hiç durmadan 5 yazdıran masum bir fonksiyon gibi duruyor. Fakat fonksiyon değişkeni faaliyet alanı fonksiyonun işlevi bitirene kadardır. Bu durumda int a değişkeni daima stack bölümünde yaratılacaktır.

Stack yapısı da son gelen ilk gider (LIFO, last in first out)  sistemi ile çalıştığı için son çağrılan fonksiyonun işlevini tamamlayarak değişkenlerinin bellekten atılması gerekir. Fakat özyinemeli (recursive) olan bu fonksiyon hiç bir zaman durmayacağı için stack giderek şişecek ve bir yerde stack overflow ya da benzeri bir hata ile uygulamayı çatlatacaktır.

Benim bildiğim overflow hataları bu gibi bellek sorunlarından kaynaklanıyor. Fakat sistem bu gibi durumlarda uygulamanın tepesine karabasan gibi çöküyor =)

Test için;


#include <stdio.h>

void stack_patlat(){
int a = 5;
printf("%d\n", a);
stack_patlat();
}


int main()
{
stack_patlat();
}


Yanlış bildiğim/düşündüğüm konu var mı bu durumda?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Unicode

sem ustanın yaptığı stack_patlat(); uygulamasını denedim ve terminalde aldığım çıktı.

Segmentation fault (core dumped)  8)