Natural

natural

Breaking News

VBA Crackme Tersine Mühendislik

Bu kez, IDA Pro ve WinDbg kullanarak bu Crackme'yi çözmek için kullandığım süreci ele alacağız .

Crackme nedir?

Bir Crackme, yazılım ürün anahtarlarını kırma işlemini taklit eden tersine mühendislik için bir egzersizdir. Saldırganın, geçerli bir seri anahtar olan bir girdi oluşturabilmesi için bir seri numarasını doğrulamak amacıyla yazılım tarafından kullanılan algoritmayı öğrenmesi gerekir. Bir Keygenme, bir saldırganın meydan okuma için seri anahtarı üreten bir program (keygen adı verilir) oluşturacağı özel bir Crackme türüdür.

Meydan okuma

Meydan okuma zip üç dosya içerir: meydan okuma ikili, ikili için bir keygen ve meydan okuma için bazı kurallar. Meydan okuma kuralları aşağıdaki gibidir:
keygenme.exe bir "gerçek" keygenme, tabii ki seri gerçek algoritma tarafından oluşturulan olup olmadığını kontrol eder. Çok kolay, bundan sonra daha zor bir şey yapıyorum. Umarım beğenirsin.
  1. Yama yok
  2. Bruting yok
  3. Sadece kendi keygenimi yaptığım bir keygen yap, şifre ile korunuyor, ama algoritmayı elde ettiğinde, geçişi tahmin etmelisin.
Bu kurallar oldukça standart, sadece bu program için bir keygen yazmamız gerekiyor.

Program

Bu uygulama oldukça basit. Kullanıcı, kullanıcıdan anahtar isteyen bir iletişim kutusu alır. Geçersiz bir anahtar girilirse, serinin hatalı olduğunu belirten yeni bir iletişim kutusu açılır.
keygenme.exe ana penceresi
yanlış girişle ortaya çıkan pencere

analiz

Analizimize IDA Pro'da ikili dosyayı açarak başlıyoruz. Doğrudan koda dalmak yerine, neler olup bittiğine dair bir fikir edinmek için ikili dosyadaki dizelere bakabiliriz.
IDA Pro'daki dizeler penceresi
Bu dizeler listesi bize birkaç önemli şeyle birlikte, sökme analizimize başlamamız için bir yer veriyor. İlk olarak, vba ile başlayan işlev isimlerine benzeyen bir dizi dizeyi görebiliriz. Bu muhtemelen ikili ikili Visual Basic ile yazılmış demektir. Visual Basic biliyorsanız, daha sonra kodu okurken daha fazla sezgi olabilir. Visual Basic bilmiyorum ama en azından şimdi Google aramalarıma eklemek için ekstra bir anahtar kelime var. Ayrıca biri sesli harflerle, diğeri ünsüzlerle birlikte iki dize vardır. Belki bu iki şeyin seri anahtarın yapısı ile ilgisi vardır. Bu iletişim kutusunda “Sağ Seri” dizesini de görüyoruz. Artık IDA'yı bu dizeye başvuran kodu bulmak için kullanabilir ve bizi bu diziye götüren mantığı bulmak için geriye doğru çalışabiliriz.

sökme

Xref'i “Right Serial!” Dizesine takip ettikten sonra kullanıcı girişini doğrulamaktan sorumlu tüm işlevi görebiliyoruz. Ekran görüntüsü eklemek için çok fazla kod var. Bu biraz ezici olabilir, ancak aklımızı korumak için bu işleve küçük parçalar halinde bakabiliriz. Düğümleri, göründüğü gibi görünen şeylere göre gruplandırarak başlıyoruz. En yüksek düzeyde, başlangıçta kurulum için bazı kodlar, bazı işleme kodları, daha sonra kullanıcı girişi geçerli veya geçersiz olduğunda işleyen mantık olduğu görülmektedir. Bunları, erişilen dizelere, çağrılan fonksiyonlara ve kodun genel yapısına göre nasıl gruplandıracağımızı oldukça iyi tahmin edebiliriz. İlk kez doğru olmak çok önemli değil, çünkü IDA sadece mevcut uygulama anlayışınızı yapılandırmanıza yardımcı olacak bir araçtır.
üst düzey düğüm gruplaması
İkili programın nasıl yüksek düzeyde çalıştığına dair bir fikrimiz olduğuna göre, dizenin gerçekte nasıl işlendiğine daha derinlemesine dalmaya başlayabiliriz. Şimdi seri işleme mantığındaki ilk temel bloğa bakabiliriz.

Giriş Uzunluğu

kullanıcı girişinin uzunluk kontrolü
Bu temel bloğun sonunda, işleve çağrı , sonuca göre __vbaLenBstrbir karşılaştırma $eaxve bir sıçrama olduğunu görüyoruz Fonksiyonun adı göz önüne alındığında, bunun muhtemelen kullanıcı girişinin uzunluğuna göre dallandığını varsayabiliriz. 31 karakter uzunluğundaysa ( 0x1f), işlemin geri kalanına gider. Aksi takdirde, yanlış seri mantığa gider. Teorimizi test etmek için, uygulamayı WinDbg'de açıyoruz, işlev çağrısından sonra bir kırılma noktası ayarlıyoruz ve farklı uzunluklarda birden çok girişle çalıştırıyoruz. Birkaç çalışmadan sonra hipotezimizin doğru olduğu açıktır.
Bu noktada, geçerli bir seri olabilmek için kullanıcı girişinin 31 karakter uzunluğunda olması gerektiğini biliyoruz.

RtcMidCharVar'ı anlama

Uzunluk kontrolünden sonraki ilk temel blokta iyi bir kod parçası vardır. Bu kodu anlamaya çalışmak için, çağrılan işlevlere bakabilir ve bir hata ayıklayıcıda test edebileceğimiz hakkında bir fikir edinebiliriz. Bu işlevdeki ilk çağrı call rtcMidCharVarVBA'yı bilmediğim için, bu işlevin ne yaptığına dair herhangi bir sezgim yok. Bunu anlamak için, biraz googling yapabiliriz, ancak yararlı bir şey bulmada başarısız oldum
Bunu kendimiz bulmak için, işleve neyin geri döndüğüne bakabiliriz. Biraz hata ayıklama sonra, bu uygulama tarafından kullanılan arama kuralları anlayamadım. Bunun yerine, hangi verilere eriştiklerine bağlı olarak bazı talimatları not ettim ve etiketledim. Yığının nasıl düzenlendiğine ilişkin iyi bir görünümle, gelecekteki bellek erişimlerini kolayca anlayabiliriz.
Bu gizemli şeyin ne yaptığını anlamak için call rtcMidCharVar, onaltılık bir editörde yığının büyük bir penceresini açtım, fonksiyon çağrısının üzerine çıktım ve neyin değiştiğini gördüm.
onaltılık düzenleyicide yığın
Yukarıdaki görüntüde, çağrısında kırmızı bayt değiştirildi rtcMidCharVarDeğiştirilen değerlerden sadece biri yararlı görünüyordu. Kutulu değer 0x026a6764(küçük endian), kullanıcı girişindeki ilk karakteri içeren bir dize işaretçisi. Bu noktada, bu işlevin belirli bir dizeden bir karakter çıkardığını varsayabiliriz.

__VbaInStrVar'ı anlama

Bu işlevi anlamak çok daha kolaydır. Hızlı bir Google aramasıyla, bu işlevin InStr'un VBA işlevinin derlediği şey olduğunu belirleyebiliriz Nasıl rtcMidCharVarçalıştığına dair anlayışımızla birlikte, tüm ünsüzleri içeren bir dizeye temel bloğun üst kısmında referans verildiğini fark ederek __vbaVarTstNe, ilk karakterin ünsüz olup olmadığını kontrol etmek için bu çağrıya benziyor Hata ayıklayarak bu anlayışın doğru olduğunu doğrularız.
Burada, şimdi bu kod bloğunun, kullanıcı girişinin ilk karakterinin bir ünsüz olduğunu kontrol ettiğini söyleyebiliriz.

Okuma ve Montaj

IDA grafik görünümünde biraz aşağı doğru ilerlerken, değerini değiştiren birkaç küçük blok görüyoruz ve $eaxbunu önceki bölümlerde tersine mühendislik uyguladığımız gibi görünen büyük bir blok izliyoruz.
eax kaydını değiştiren kod
Bu kod oldukça basit olduğu için, neler olduğunu sadece okuyarak anlayabiliriz. Kullanıcının tüm girdilerini inceledikten sonra üst blok doğru seri mantığa dallanır. Sonraki iki blok $eax, baktığımız karakterin dizinine bağlı olarak sesli harf veya ünsüz dizgiye ayarlanır Bu iki blok aşağıdaki sahte kodla tanımlanabilir:
if (index % 2 == 0)
  eax = &vowels
else
  eax = &consonants
Alttaki blok sadece bir değeri arttırır (muhtemelen kullanıcı girişinin dizini) ve en üste geri döner.
Şimdiye kadar yapılan tüm analizlerden sonra, geçerli bir seri anahtarın alternatif ünsüzler ve ünlülerden oluştuğunu söyleyebiliriz. Şimdi algoritmayı anladığımıza göre, bir keygen yazmaya hazırız.

Keygen'i Yazmak

Bu keygen oldukça basittir. Bir anahtar, rastgele bir ünsüz veya sesli harfin mevcut anahtara birleştirilmesiyle oluşturulur. Daha sonra konsola yazdırılır:
keygen.py
#!/usr/bin/env python

import random

vowels = "AEIOUY"
consonants = "BCDFGHJKLMNPQRSTVWXZ"

def generate_key():
  answer = ""

  for k in range(31):
    if k % 2 == 0:
      answer += random.choice(consonants)
    else:
      answer += random.choice(vowels)

  return answer

while True:
  raw_input("Press enter to generate key...")
  print(generate_key())



keygen.py
keygen başarısı

Tersine Mühendislik İçin İpuçları

  • İkilideki dizelere bak
    • Bir ikili dosyadaki dizeler size nereden bakmaya başlayacağınız konusunda gerçekten iyi bir fikir verebilir
  • Her şeyi etiketleyin ve notları saklayın
    • Zaten iyi notlara ve etiketlere sahip olduğunuz mühendislik kodunu tersine çevirmek için harcayacağınız zamandan çok tasarruf edeceksiniz
  • Mümkün olduğunca küçük bir montaj okumaya çalışın.
    • Okuma ve anlama derleme, dizelere ve işlev adlarına bakmaktan ve bir hata ayıklayıcıda doğrulamaktan çok daha fazla zaman alır

Hiç yorum yok