December 8, 2024
Matematron gezegeninde yanınızda 200 MTL ile kaldınız.
Tek yapmanız gereken 8000 MTL toplayıp dünyaya geri dönmek.
Ancak gezegende tek para kazanacağınız yer rulet masası.
Ve kuralları biraz değişik…
İpucu: Tersine mühendislik her zaman en kolay yol değildir.
Puan:
İlk 10: 360
İlk 10-20: 330
Geri kalan: 300
Çözüm:
Yöntem 1: Programın çalışmasını sezgisel olarak anlayıp one göre oynamak.
Ben bu soruyu öncelikle deneme yanılma yöntemiyle çözdüm. Çok fazla zaman almıyor.
Rulet’te birkaç el oynadıktan sonra şu hususları tespit ettim:
1. Başta parayı yatırdığınız rakam çıkıyor. Yani ilk elde hep kazanıyorum. Bu 2 veya 3 defa oluyor arka arkaya. (Demek ki Randomize ile ilgili bir problem var. Muhtemelen “Initial Vector” bizim seçimimiz ile ilgilidir. Normalde sistem saatinden alınırsa, kişi saniye salisesini her defasında ayarlayamayacağından dolayı her defasında farklı bir sonuç ortaya çıkacak.)
2. 00’ın özel bir durumu var.
3. Birkaç kere kaybettikten sonra 00’a parayı yatırdığınızda arka arkaya 2-3, bazen 4 defa kazandırıyor.
4. Bazen rakamı bilmiş olmana rağmen kaybettiniz diyor. Bunun ardında 00’a parayı yatırınca 3 defa arka arkaya kazandırıyor.
Haliyle, kazandırma ihtimali yüksek olan ellerde yüksek miktar, boş geçecek ellerde de düşük miktar ile manuel olarak kazanabiliyorsunuz.
Yöntem 2: Programı Decompile ederek.
Dosyanın içine strings ile baktığımda “SOFTWARE\Borland\Delphi\RTL” görüyorum. Bu program da “Borland Delphi” ile yazılmış.
DeDe programı ile rulet.exe dosyasını açıyorum. Project bölümüne gelip kaydediyorum. Sonra da Unit1.pas dosyasını Notepad ile açıyorum.
Öncelikle Delphi programında kullanılan nesnelerden biri dikkatimi çekiyor:
TIdDecoderMIME nesnesi, Delphi’de Base64 Encode/Decode yapmak için kullanılıyor. Eğer cevap doğrudan string olarak kod içinde yoksa, muhtemelen bir şifreleme veya one benzer bir takla attırıyordur text bölüme. Bunu aklımızın bir köşesine yazdık.
Devam ediyorum… Bundan sonraki bölümde string’lere dikkatimi veriyorum.
Bu değil.
Bu da değil.
Hmmm… Bu olabilir: “TTR0M200dH”
Neden olabilir? Çünkü Base64 output karakter setine uyuyor.
Base64 ile ilgili kısa bir bilgi verelim. Bilenler bu paragrafı geçebilirler. 3 adet byte’ı alıp, bunları 6’şar bitlik dört gruba ayırır. Bitlerin başına da 2 adet 0 biti koyunca byte’ları tamamlamış oluyor. Böylece printable olmayan karakterleri printable hale getirmiş oluyor. Buna benzer başka algoritmalar da var. Base64 output’unda sadece şu karakterler olabilir: “A-Z, a-z, 0-9, +, /”. Toplam 64 adet farklı karakter. Daha ayrıntılı bilgi için: WikiPedia‘dan istifade edebilirler.
Hemen web üzerinden bir base64 Encoder/Decoder site buluyorum. Mesela: http://www.base64decode.org/
“TTR0M200dH” kısmını yazıp <DECODE> butonuna basıyorum. “M4t3m4t” çıkıyor karşıma. Yarışma formatına uygun bir string.
Devam ediyorum.
Bu da değil.
Bu da olabilir. Base64 formatına uyuyor.
Yukarıda yazmış olduğum base64 sitesine tekrar geçip, “IwbjRrYjFM” stringini <DECODE> edince karşıma “#F#” böyle tuhaf bir şey çıkıyor. Halbuki baya ümitlenmiştim.
Devam ediyorum.
Bu da değil.
Neyi atlamış olabilirim?
Olabilir dediğim iki string’i (“TTR0M200dH” ve “IwbjRrYjFM”) birleştiriyorum. “TTR0M200dHIwbjRrYjFM” şeklinde tek bir stringi deniyorum. Bu sefer oldu sanırım: “M4t3m4tr0n4kb1L”.
Yöntem 3: Programın binary’sini açıp başlangıç parasını 8.000 üzerinde bir rakam yapıp, ilk elde kazandığımızda cevabı alabiliriz.
Bu yöntemi uygulamak için “Resource Hacker” programından istifade edebiliriz. Programı çalıştırıp, “rulet.exe” isimli dosyayı açıyoruz.
Burada sol tarafta bulunan TFORM1 bölümüne giriyoruz. Ve başlangıç olan “200” değerinin nerede olduğuna bakıyoruz.
Rakamı bulduk. Bu rakamı değiştirerek “10.000” yapabiliriz mesela. Veya aynı nesne için ReadOnly seçeneği görünmektedir. Değeri “True”. Eğer bu seçeneği de “False” olarak değiştirirsek oyuna başladıktan sonra elimizdeki para miktarını değiştirebiliriz.
Editör bölümünde gerekli düzeltmeleri yaptıktan sonra “Compile Script” butonuna basıp menüden “Save As” seçeneği ile yeni dosya adı olarak kaydediyoruz.
Program, yaptığımız değişikliklere göre çalışacaktır:
Yöntem 4:Program çalıştırıp, memory’deki paranın değerinin bulunduğu adresinde bulunan değerin değiştirilip (10.000 mesela), ilk elde kazandığımızda da cevabı alabiliriz. Bu yöntemin de daha iyi bilen biri tarafından yazılmalıdır.
Cevap: M4t3m4tr0n4kb1L
Komutan
Leave a Reply