Captcha nasıl kırılır?- image captcha örneği 1

Merhaba arkadaşlar "bilişim mahkemelerinde yargılanmamız" sebebiyle ara verdiğimiz içerik üretme işine yaklaşık 1.5(bir buçuk) yıl aradan sonra devam ediyoruz. Daha önce sizlere "Captcha nasıl kırılır?" başlığıyla bir yazı yayınlamıştım yazıyı inşallah hatırlıyosunuzdur çünkü yedeği yok:D ama özetle yazıda Captcha'nın ne olduğunu,ne amaçla kullanıldığını,çeşitlerini ve captcha sistemlerinin nasıl kırılabileceği gibi şeyler vardı. Önceki yazıda teorik olarak OCR den de bahsedilmişti fakat captcha kodlarının çözülmesi için kullanılan kesin ve stabil bir method yok captchanın mimarisinin iyi analiz edilip nabza göre şerbet vermek gerekiyor. Bu yazıda işte o yazının devamı niteliğinde farklı birşekilde dizayn edilmiş resimli captcha yani "image captcha" örneği üzerinde denemeler yapacağız örnek dediğime bakmayın aslında çalışan bir sistem üzerinde captchayı kıracağız. Resim1: Örnek Captcha Örneği seçmeme neden olan ilginç özelliği captchanın 6 karakterli bir resim değilde her birinde tek karakter olan 6 adet resimden oluşuyor olması yani 1.rakam ayrı bir resim,2.karakter ayrı bir resim vs.vs. 6 adet resim yan yana getirilip bütün bir captcha resmi oluşturulmuş. Normalde çözüm yolu olarak resmin histogramını çıkarmamız gerek ve sonrasında resmin içinde geçen tüm karakterleri tek tek kaydedip bunlarında histogramını almam gerek ve bu iki histogramı karşılaştırıp benzerlik oranını ölçmemiz gerekiyor. Histogram ın ne olduğunu hatırlayalım hemen şimdi eski yazıyı bul oku uzun iş uğraşmazsınız;) Histogram resimlerde ton dağılımını gösteren grafiktir yani bu resimde şurası siyahmış burda hafif griye dönüp sağa soğru hepten beyazlaşmış gibi verileri alabildiğimiz birşey ne işimize yarıyor diye sorarsanız OCR sistemleri belini histograma dayamış durumda resimleri karşılaştırma işlemi aslında 1.resmin histogramıyla 2.resmin histogramını karşılaştırarak gerçekleştiriliyor sonra uyuşma oranı hesaplanarak yüzdelik değeri bulunuyor. Ama örneğimizde tüm bunları yapmamıza gerek yok çünkü son derece basit tasarlanmış; 1.Arka planda pürüz yok dolayısıyla resim üzerinde temizleme yapmamıza gerek yok 2.Resim üstündeki karakterler sabit renkte yazılmış dolayısıyla karakterler üzerinde renk çevirisi yapmamıza gerek yok 3.Karakterler nizami şekilde yazılmış yani eğik,bükük,üstü çizili,büyük yada küçük değil buda bizi birsürü resim oluşturma yükünden kurtarıyor. Bu captcha ya göre çözüm mantığımız şu; Tüm resimleri bilgisayara kaydet. Resimlerin md5 ini al. Resmi karşılaştır. Doğrulama karakterlerini tek tek bilgisayara kaydediyoruz. Resimleri kaydettikten sonra resimlerin histogramı yerine md5 ini alıyoruz çünkü(burası önemli); Resimdeki karakter tek varyasyon olarak kullanılıyor "düz rakam"dan başka bir kullanım şekli yok misal eğer bir rakamın hem sağa hem sola eğik şeklide resimler içinde bulunuyor olsaydı histogramını almamız gerekecekti. Kaydettiğimiz dizinlerdeki tüm resimlerin md5 ini veren php kodu her programlama diliyle aynı işlemi yaptırabileceğinizi unutmayınız;) "; print_r($baba); } ?> Aldığımız md5 lerle kendimize bir karşılaştırma listesi oluşturuyoruz websitesinden alacağımız resimleri bu listeden karşılaştıracağz. $resimler=array(0=>"98a09bdfcb28e540480d45107c3018e1", 1=>"7c972743df8515fc979bb35753522e0e", 2=>"b0308594508690103a87dbef576612a0", 3=>"3eda24a49c1a2e8f89aa3523ad4333b2", 4=>"37342b062031916d65e584d714fb039f", 5=>"b9fd4671010602acb710be83d1d5aa49", 6=>"72f204980bf2254f5a83f94db60d9710", 7=>"db29c10d29574ebcd7aa247af6ea7cff", 8=>"6164253c680140fbb98fa5323975f36d", 9=>"0da9f887f5bfc1170e032617175b0ad5"); Şimdi geriye bir tek websitesine bağlanıp kaynaktan aldığımız resimlerin md5 leri ile oluşturduğumuz listedeki md5 leri karşılaştırmak kalıyor. Websitesine bağlanmak için kullandığınız programlama diline göre değişiklik gösteren birsürü standart ve ek kütüphane mevcut ki bu yazıyı okuyorsanız zaten yalayıp yutmuşsunuzdur keyif sigarası niyetine iki satır okuyayım diye siteye geliyosunuzdur. Ben dil olarak php kullandım çünkü keyif benim site benim istediğim dili kullanırım. Curl kütüphanesi ile captchanın bulunduğu sayfayı açtırıp session başlatıyoruz.Daha sonra aynı session ile kaynaktaki resimlerini okuyup md5lerini alıyoruz ve daha önce oluşturduğumuz listede bu md5 in hangi karaktere denk geldiğini yazdırıyoruz. Kodda bahsi geçen site yayın politikamız sebebiyle gizlenmiştir "OlmayanAdam" ın kimseyi hedef göstermek gibi bir amacı yoktur ama eşşek değilseniz siteyi anlamışsınızdır zaten! "; print_r($baba); } */ /*Resim md5 lerini arraya atıyoruz(Resimler sabit olduğu için)*/ $resimler=array(0=>"98a09bdfcb28e540480d45107c3018e1", 1=>"7c972743df8515fc979bb35753522e0e", 2=>"b0308594508690103a87dbef576612a0", 3=>"3eda24a49c1a2e8f89aa3523ad4333b2", 4=>"37342b062031916d65e584d714fb039f", 5=>"b9fd4671010602acb710be83d1d5aa49", 6=>"72f204980bf2254f5a83f94db60d9710", 7=>"db29c10d29574ebcd7aa247af6ea7cff", 8=>"6164253c680140fbb98fa5323975f36d", 9=>"0da9f887f5bfc1170e032617175b0ad5"); /*baglan*/ $key=''; $ch = curl_init("http://www.***************/Forum/login_user.asp"); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5'); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); $output = curl_exec($ch); for ($i=1; $i<=6; $i++){ $resim = curl_init("http://www.****************/Forum/security_image.asp?I=$i"); curl_setopt($resim, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5'); curl_setopt($resim, CURLOPT_HEADER, 0); curl_setopt($resim, CURLOPT_RETURNTRANSFER, 1); curl_setopt($resim, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($resim, CURLOPT_COOKIEFILE, 'cookie.txt'); $cikti = curl_exec($resim); $son=md5($cikti); $key .= array_search($son, $resimler); } echo "Şuanki Captcha= ".$key."\n"; echo "Don't be evil\n"; curl_close($ch); ?> Kodu ilk çalıştırdığınızda boş döndürüyor bunun sebebi koddaki mantık hataları olabilir ilk seferde session alamıyor sanırım ama sonraki her seferde captchayı veriyor. Gerisini siz halledersiniz artık Sonraki konu: Puzzle captcha çözümü!

0 comments: