Keygen for [C] keygen me #1 by x0rz

12.07.2018
2380 Okunma

Merhabalar;
Yine bir “kırarken yaz” tutorial ile karşınızdayım. Bir önceki tutoriala gösterdiğiniz ilgi için teşekkürler. Başlayalım:

Programı açtık. Deneme kullanıcı adı şifremizi yazıyoruz.
Name:errorinside
Key:12345678-abcdef09

“Kötü çocuk” mesajını gördük. Ollyde ilgili yere bakıp geliyoruz aşağıdaki koda

40156D adresine bir BP koydum. Tekrar aynı şekilde kullanıcı adı ve şifremizi girelim. Stack’e bakıyorum

ECX 0040EA40 ASCII “PKKGIXGIXVV-JZZXFNXFNKK”
EDX 0040EA7E ASCII “2345678-abcdef09”

ecx ‘te bir şeyler görüyoruz. şimdi tekrar deniyoruz. bu sefer:
name:errorinside
key:PKKGIXGIXVV-JZZXFNXFNKK

Hmm.. Gerekli keyi bulduk. Ama amacımız keygen yazmak. Şimdi algoritmayı bulalım ve çözelim. Girilen kullanıcı adını scanf ile okuyor, strlen ile uzunluğunu alıyor ve biraz daha aşağıda ilk call adresinini 401614 olduğunu görüyoruz. Şimdi burayı inceleyelim.

Yukarıdaki döngüyü açıklayalım. Öncelikle 3 tane LOCAL değişken var bunlar
LOCAL.1: Kullanıcı adı karakter sayısı kadar olan iterasyon sayısı döngünün “i” si diyelim
LOCAL.2: Kullanıcı adının “i”nci karakteri(ve onun işlem görmüş hali)
LOCAL.3: Kullanıcı adının 3üncü karakteri(ve 3üncü karakterden sonrasında işlem görmüş hali)

1) Kullanıcı adının “i”nci karakterini al
2) SAR 1 uygula
3) Kullanıcı adının 3üncü karakterini al
4) SHL 1 uygula ve sonucu 0xA ile topla
5) İşlem görmüş “i”nci karakter ile işlem görmüş 3üncü karakteri XOR la
6) Sonuç 2F mi?
6. a) Küçük eşitse +10 yap, ta ki 0x2F ten büyük olana kadar
6. b) Büyükse 401662ye zıpla
7) Yeni sonuç 0x5A mı?
7. a) Büyükse -14 yap, ta ki 0x5A’dan küçük olana kadar
7. b) Küçükse devam
8) Yeni sonuç 39 mu?
8. a) Küçük eşitse i+1 yap döngüyü başa sar
8. b) Büyükse devam
9) Yeni Sonuç 40 mı?
9. a) Büyükse i+1 yap döngüyü başa sar
9. b) 40’sa +0xC yap; i+1 yap döngüyü başa sar

evet bu kadar basit :P
(itiraf ediyorum bu döngüyü çözdükten sonra yazdım çünkü sonlara doğru sürekli bir “cmp” ve koşullu jump söz konusuydu. komut komut anlatmak daha fazla kafa karıştıracağı için en sonda algoritma şeması kullanmayı tercih ettim. Umarım anlaşılacaktır)

Kullanıcı adı kadar döngü tekrarladıktan sonra oluşan yeni anahtarı göreceksiniz.

Bu döngü bittikten sonra ana fonksiyona dönüp araya “-” ekleniyor ve 00401696 adresindeki ikinci kısmı yaratan algoritma başlıyor. İnceleyelim:

Yukarıdaki döngüyü açıklayalım. Öncelikle 3 tane LOCAL değişken var bunlar
LOCAL.1: İlk algoritmada üretilen anahtarın karakter sayısı kadar olan iterasyon sayısı döngünün “i” si diyelim
LOCAL.2: İlk algoritmada üretilen anahtarın “i”nci karakteri(ve onun işlem görmüş hali)
LOCAL.3: İlk algoritmada üretilen anahtarın 3üncü karakteri(ve 3ncü karakterden sonrasında işlem görmüş hali)

1) İlk algoritmada üretilen anahtarın “i”nci karakterini al
2) SAR 1 uygula
3) İlk algoritmada üretilen anahtarın 3üncü karakterini al
4) SHL 1 uygula ve sonucu B ile topla
5) İşlem görmüş “i”nci karakter ile işlem görmüş 3üncü karakteri XOR la
6) Sonuç 0x2F mi?
6. a)Küçük eşitse +0xD yap, ta ki 2F ten büyük olana kadar
6. b) Büyükse 4016E4e zıpa
7) Yeni sonuç 0x5A mı?
7. a) Büyükse -15 yap, ta ki 5A’dan küçük olana kadar
7. b) Küçükse devam
8) Yeni sonuç 39 mu?
8. a) Küçük eşitse i+1 yap döngüyü başa sar
8. b) Büyükse devam
9) Yeni Sonuç 40 mı?
9. a) Büyükse i+1 yap döngüyü başa sar
9. b) 40’sa +B yap; i+1 yap döngüyü başa sar

Gördüğünüz gibi ilk algoritmanın neredeyse aynı sadece ufak sayı değişiklikleri var. bu yüzden kod yanına açıklama eklemedim bu sefer.

Bu tutorialda algoritmayı çok açık yazdığım için şimdi direkt keygen yazma bölümüne geçiyorum. Keygene ait kaynak kodları yazının ekinde bulacaksanız.
Keygen 3 karakterden kısa kullanıcı adı girdiğinizde “patlıyor”. Bunu düzeltmek de “ödeviniz” olsun :)
Kolay gelsin.

[dm]161[/dm]

Comments of this post

d36f

d36f
16 July 2018

Ellerinize sağlık.