Crackme Açık

Jan 07 2023
Parola Korumalı Dosyaları Kırmak İçin Başlangıç ​​Kılavuzu
Biraz bilgisayar korsanlığı eğlencesine hazır olun! Bu blog gönderisinde, Ubuntu 20.04 LTS kullanarak şifreyle korunan basit bir C yürütülebilir dosyasına nasıl gireceğinizi göstereceğiz.
Bilgisayar: IEEE Spektrumu

Biraz bilgisayar korsanlığı eğlencesine hazır olun! Bu blog gönderisinde, Ubuntu 20.04 LTS kullanarak şifreyle korunan basit bir C yürütülebilir dosyasına nasıl gireceğinizi göstereceğiz. İster yeni başlıyor ister deneyimli bir profesyonel olun, bu eğitimde herkes için bir şeyler var. Bu siber becerileri esnetme zamanı!

Bu eğitimde kullanılan tüm dosyalar GitHub'da burada bulunabilir . Şifrelenmiş dosyalara erişmek için depoyu yerel ortamınıza kopyalayabilirsiniz.

Başlamak crackmeiçin, crackme dizinine gidip aşağıdaki komutu girerek davranışını gözlemlemek üzere dosyayı çalıştırabiliriz:

$ ./crackme

Access Denied

fileKomut, bir dosyanın türünü belirlemek için kullanılır . Bunu belirli bir sırayla bir dizi test gerçekleştirerek yapar: dosya sistemi testleri , sihirli sayı testleri ve dil testleri .

bilgisayar: burada

Bu testler, içeriğine ve onunla ilişkili tüm meta verilere göre dosyanın türünü belirlemek için tasarlanmıştır. fileBelirli bir dosyanın türünü belirlemek için komutu kullanmak istiyorsanız, bunu file [filename]terminalinizde çalıştırarak yapabilirsiniz. Örneğin:

$ file crackme

crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped

  1. 64 bit Linux işletim sisteminde çalıştırılmak üzere tasarlanmış yürütülebilir bir dosya
  2. x86–64 mimarisi için derlendi ve dinamik olarak bağlandı, yani çalışması için paylaşılan kitaplıklara güvenir
  3. /lib64/ld-linux-x86–64.so.2 yorumlayıcısı tarafından yorumlanmıştır
  4. GNU/Linux 2.6.24 için oluşturulmuştur ve "BuildID" adı verilen benzersiz bir tanımlayıcıya sahiptir.
  5. Çıkarılmadı, bu nedenle hala hata ayıklama bilgileri ve analiz için kullanılabilecek semboller içeriyor.

Programın davranışını daha fazla analiz etmek ve potansiyel olarak tersine mühendislik yapmak için ( GNU Hata Ayıklayıcıltrace ) gibi diğer araçlarla birlikte kullanılabileceğini de belirtmekte fayda var , bu eğitim için kullanmayacağız.gdb

ltraceAşağıdaki komutu girerek crack me dosyası üzerinde çalışabiliriz :

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9)                                                                                     = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9)                                                                                                      = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9)                                                                                     = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9)                                                                                                       = 15
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: ALX

  1. __libc_start_mainbir programın ortamını kuran ve ana işlevini çağıran bir işlevdir. Çeşitli bağımsız değişkenleri alır ve C standart kitaplığı ( libc ) tarafından sağlanır. Programın ana giriş noktası işlevi tarafından çağrılır.
  2. İle başlayan satırlar strncmp, programın, strncmpiki dizginin belirli sayıda karakterini (bu durumda 9 karakter) karşılaştıran bir işlev olan işlevi çağırdığını gösterir. Karşılaştırılan diziler, çeşitli ortam değişkenleri (ör. "SHELL", "PWD", "LOGNAME" vb.) ve dize gibi görünmektedir "Passw0rd=". Görünüşe göre program ortam değişkenlerinden herhangi birinin string ile başlayıp başlamadığını kontrol ediyor "Passw0rd=".
  3. İşlev puts, sonunda " Erişim Engellendi " dizesiyle çağrılır; bu, ortam değişkenlerinden hiçbiri ile başlamazsa programın bu mesajı yazdırdığını gösterebilir "Passw0rd=".

Linux'ta bir ortam değişkeni ayarlamak exportiçin terminaldeki komutu kullanabiliriz. Örneğin, adlı bir ortam değişkenini Passw0rddeğerine ayarlamak için testşunu çalıştırabiliriz:

export Passw0rd=test

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("Passw0rd=test", "Passw0rd=", 9)                                                                                                           = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6)                                                                                                           = 1
strlen("test")                                                                                                                                     = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68)                                                                                      = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0)                                                                                       = 1
sprintf("09", "%02x", 0x9)                                                                                                                         = 2
sprintf("8f", "%02x", 0x8f)                                                                                                                        = 2
sprintf("6b", "%02x", 0x6b)                                                                                                                        = 2
sprintf("cd", "%02x", 0xcd)                                                                                                                        = 2
sprintf("46", "%02x", 0x46)                                                                                                                        = 2
sprintf("21", "%02x", 0x21)                                                                                                                        = 2
sprintf("d3", "%02x", 0xd3)                                                                                                                        = 2
sprintf("73", "%02x", 0x73)                                                                                                                        = 2
sprintf("ca", "%02x", 0xca)                                                                                                                        = 2
sprintf("de", "%02x", 0xde)                                                                                                                        = 2
sprintf("4e", "%02x", 0x4e)                                                                                                                        = 2
sprintf("83", "%02x", 0x83)                                                                                                                        = 2
sprintf("26", "%02x", 0x26)                                                                                                                        = 2
sprintf("27", "%02x", 0x27)                                                                                                                        = 2
sprintf("b4", "%02x", 0xb4)                                                                                                                        = 2
sprintf("f6", "%02x", 0xf6)                                                                                                                        = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...)                                                               = 51
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: Here

  1. İlk satırın işlevin dört argümanla çağrıldığını gösterdiğini zaten biliyoruz __libc_start_main: ana fonksiyonun adresi, program argümanlarının sayısı, program argümanlarının bir dizisine işaretçi ve ana fonksiyon çağrıldığında çağrılacak bir fonksiyona işaretçi. İadeler.
  2. Aşağıdaki satırlar strncmp, iki dizgiyi karşılaştıran ve bunların sözlük sıralamasını gösteren bir tamsayı döndüren işleve yapılan bir dizi çağrıyı göstermektedir. Görünüşe göre program sistemdeki ortam değişkenlerinin her birini dizeyle karşılaştırmaya çalışıyor "Passw0rd=".
  3. Bundan sonra , MD5 kriptografik hash fonksiyonunun parçası olan , ve fonksiyonlarına MD5_Inityapılan MD5_Updateçağrılar vardır. Program, Passw0rd ortam değişkeninin değerinin MD5 karmasını hesaplıyor gibi görünüyor.MD5_Final
  4. sprintfArdından, bir diziyi biçimlendiren ve onu bir arabellekte saklayan işleve yapılan çağrılar vardır . Görünüşe göre program MD5 karmasının baytlarını onaltılık değerler olarak biçimlendiriyor ve bunları dizelerde saklıyor.
  5. strcmpÇıktı, "c4032d9e95a93d91b9b595dcfcca640b" ve "098f6bcd4621d373cade4e832627b4f6" argümanları olarak iki dizeye sahip bir işlev çağrısını içerir . Bu, programın parolanın MD5 sağlamasını dışa aktarılan Passw0rd ortam değişkeninin sağlamasıyla karşılaştırdığını gösterir.
  6. İşlev puts, sonunda Parolanın yanlış olduğunu belirten "Erişim Engellendi" dizesiyle çağrılır. Ancak, bu muhtemelen yakında çözülecektir.

Karma dizeleri değerlerine döndürmek için bu web sitesini kullanabiliriz .

Kaynak: MD5 Merkezi

Artık karma parolanın LionelMessiPassw0rd olduğunu belirlediğimize göre ortam değişkenini bu değere ayarlayabilir ve farklı bir sonuç üretip üretmediğini görmek için komutu yeniden çalıştırabiliriz ltrace. Hadi bir deneyelim!

$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted

Bilgisayar: burada

Güçlü, benzersiz parolalar kullanmayı ve parolaları farklı hesaplarda asla yeniden kullanmamayı unutmamak her zaman önemlidir.

MD5 hash'lerini bir sözlükle karşılaştıran ve onları orijinal dize biçimlerine geri çeviren bir C programının GitHub'daki yayınımıza göz atın. Bizi izlemeye devam edin!

Umarız basit bir dosyayı kırmayla ilgili bu öğreticiyi beğenmişsinizdir. Herhangi bir yorumunuz veya sorunuz varsa, lütfen bunları aşağıdaki yorumlar bölümünde bırakmaktan çekinmeyin. Mutlu hack!