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.
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.
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.
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 .
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 .
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 .
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 .
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.
Bir python scripti yazarak teker teker tüm karakterleri deneriz ve sonucunda doğru key değerini bulabiliriz.
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 .
En sonunda key değerini buluyoruz .
Flag.txt içerisindeki değer ile xor edildiğinde flag değerine ulaşıyoruz .
Merhabalar bu yazıda PicoCtf.com da yayımlanan OTP Implementation adlı Tersine Mühendislik sorusunun çözümünü paylaşacağım.
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
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.
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 .
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 .
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 .
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 .
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.
Bir python scripti yazarak teker teker tüm karakterleri deneriz ve sonucunda doğru key değerini bulabiliriz.
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 .
En sonunda key değerini buluyoruz .
Flag.txt içerisindeki değer ile xor edildiğinde flag değerine ulaşıyoruz .
Moderatör tarafında düzenlendi: