PicoCTF OTP Implementation Tersine Mühendislik Sorusu Çözümü

PwnLab.Me

Admin
Katılım
21 Ocak 2024
Mesajlar
202
Tepkime puanı
9
Puanları
18
Tuna Şen tarafından yazılmıştır.

Merhabalar bu yazıda PicoCtf.com da yayımlanan OTP Implementation adlı Tersine Mühendislik sorusunun çözümünü paylaşacağım.

Screenshot-from-2022-10-26-22-53-23.png


Soru bize “otp” adında bir tane çalışabilir dosya bir tane de “flag.txt” dosyası vermektedir. “opt” dosyasını çalıştırdığımızda bizden “key” değeri istediğini görürüz. Acaba key “flag.txt”nin içerisindeki değer mi diye denedim ama doğru çıkmadı . Zaten bu kadar da basit olmasını beklemiyordum
🙂
Ghidra’nın içerisine dosyayı attım ve “main” fonksiyonunu incelemeye başladım.

Screenshot-from-2022-10-26-22-55-54.png


Yukarıda görüldüğü üzere bizim girdiğimiz key değeri üzerinde bir sürü şifreleme işlemi yapıyor. Biraz daha aşağıya indiğimizde , şifrelemenin sonucundaki değerin uzunluğunu 100 olup olmadığının kontrolünü ardından da şifrelenmiş değerin “strncmp” fonksiyonu ile başka bir değere eşit olup olmadığının kontrolünü yapıldığını görürüz.

Screenshot-from-2022-10-26-22-55-29.png


Demek ki öyle bir key değeri vereceğiz ki bir sürü işlemden geçtikten sonra “occdpnkibjefihcgjanhofnhkdfnabmofnopaghhgnjhbkalgpnpdjonblalfciifiimkaoenpealibelmkdpbdlcldicplephbo” değeri ile karşılaştırılacak . Eşit ise doğru key değerini bulmuş olacağız ve en sonunda bu key ile flag.txt içerisindeki değer ile xor yapacağız .

4-1.png


Artık gdb ile debug etmeye geçebilirim.

Main fonksiyonun içerisindeki karşılaştırma işleminin olduğu yere breakpoint koyup key olarak 100 tane “A” harfini girdim ve kodu çalıştırdım .

5-1024x134.png


Beklemediğim bir şekilde kod hiç karşılaştırma işlemine girmeden bitti. Ghidra’ya biraz daha baktığımda atladığım bir kontrol işlemi oldıuğunu fark ettim .

6.png


Uygulama aldığı key değerini 0-9 ve a-z değerleri arasında istiyor. Ben de bu sefer parametre olarak “a” harfinden 100 tane girdim .

7.png


Bu sefer tam da istediğimiz yerde durdu . Yazdığımız Key değerinin şifrelenip rdi register’ında durduğunu görüyoruz. Rsi’de ise karşıaştırma yapılacak olan değer bulunmakta.

8.png


Bir python scripti yazarak teker teker tüm karakterleri deneriz ve sonucunda doğru key değerini bulabiliriz.

9.png


Kodu biraz açıklamak gerekirse ilk başta gdb işlemini otp ile başlatıyorum ve karşılaştırma fonksiyonunun olduğu yere breakpoint koyuyorum. Sonra iç içe 2 tane for döngüsü ile teker teker rsi ve rdi içerisindeki değerleri alıp karakter karakter karşılaştırıyorum . Değerler eğer eşitse “bulunanlar” stringine karakteri ekliyorum eşit değilse işlem tekrar başlatılıyor ve “karakterler” stringi içerisindeki bir sonraki karakter ile aynı işlemler gerçekleştiriliyor. Tüm olasılıklar denendiğinden biraz uzun sürebilir .

10.png


En sonunda key değerini buluyoruz .

11.png


Flag.txt içerisindeki değer ile xor edildiğinde flag değerine ulaşıyoruz .

12.png
 
Moderatör tarafında düzenlendi:
Geri
Üst