RTLxHA CTF 21 - Reversing-Dinined - Write-Up

InersIn
5 min readAug 2, 2021
Reversing-Dinined-75pt

Pada challenge ini tidak lah susah dan juga tidak mudah, karena challenge ini cukup tricky dalam mencari alur yang tepat dari peng-eksekusian program yang diberikan.

Seperti yang direkomendasikan dalam deskripsi challenge, disini saya membuat virtual machine menggunakan Ubuntu OS pada vmware, berikut settinganya.

Kemudian saya men-download file yang sudah saya download di physical machine.

Pada saat mencoba menjalankan program yang diberikan, muncul beberapa error.

Program menjalankan bash command curl, karena di ubuntu belum terinstall curl maka muncul error tersebut dan kemudian mencoba membuka file loader yang tidak tersedia pada working directory, jadi saya menyimpulkan program mencoba melakukan koneksi pada internet, jadi saya memutuskan untuk melakukan intercept terhadapt koneksi tersebut kemudian, saya buka menggunakan wireshark, tetapi tidak menemukan hal yang menarik, tetapi terdapat sebuah koneksi terhadap link berikut “https://th1s-is-4-f4ke-fl4g.herokuapp.com/load”.

Kemudian menjalankan program tersebut.

Program melakukan koneksi terhadap link tersebut dan men-download file main_malware.

Setelah menjalan kan program tersebut, semua file pada directory tersebut ter-encrypt dan ada file baru bernama warning.txt yang berisikan banyak angka, saya beranggapan angka-angka tersebut adalah flagnya, tapi file main_malware yang didownload sebelumnya hilang.

Saya membuka file Dinined menggunakan radare2 untuk melihat bagaimana alur dari program ini, saya mencoba menggunakan gdb, strace dan ltrace tidak berhasil karna ada semacam protector dari debugger.

lakukan seek pada function main, lalu print hasil disassambly dari function tersebut.

Jika diperhatikan terdapat string yang berisikan perintah untuk melakukan curl pada link sebelumnya pada saat melakukan intercept koneksi lalu disimpan kedalam file loader yang kita lihat sebelumnya, kemudian melakukan chmod terhadap file tersebut agar dapat di eksekusi, kemudian program mengeksekusi file tersebut.

Disini saya ingin mencoba cari tau apa fungsi dari file loader, karena file tersebut sudah ter-encrypt sebelum sempat dibuka, jadi saya menggunakan watch untuk melihat content dari file tersebut sebelum ter-encrypt

Jadi dalam file loader sendiri berisikan sebuah bash command untuk melakukan download terhadap file main_malware kemudian menjalankannya dan langsung dihapus.

Disini saya mencoba men-download file main_malware tersebut menggunakan wget.

Berdasarkan enumeration yang sudah dilakukan, saya mencoba untuk membuat file yang akan di enkripsi oleh program ini dan akan melihat hasil enkripsinya.

Kemudian saya coba menjalankan program main_malware.

Jika diperhatikan file test dan test1 mengalami perbedaan setiap 16 karakter, jadi dapat disimpulkan karakter “A” dan “B” yang dimasukan pada tiap file berada pada kelipatan 16 dari angka-angka tersebut.

Kemudian saya mencoba mencari bagaimana karakter “A” bisa menjadi 31 dan “B” menjadi 32, jika diperhatikan disini sebenarnya bukan lah angka 3n melainkan urutan dari tiap karakter berdasarkan alphabhet, “A” urutan 1, “B” urutan 2, untuk memastikan hal tersebut saya mencoba membuat satu file lagi menggunakan karakter “C”.

Dan benar saja pada karakter ke 16 sesuai seperti yang saya kira, jadi saya mencoba mencari karakter satu persatu agar sesuai seperti kumpulan angka-angka pada file warning.

Karna mencoba hal tersebut saya menghabiskan banyak waktu dan untuk beberapa karakter pertama berjalan lanjar saya mendapatkan string “RTL{r” tetapi setelah 5 karakter tersebut angka-angka yang dihasilkan tidak sesuai dengan encrypted flagnya, jadi saya mencoba menelaah ulang dari kumpulan angka-angka tersebut bagaiman bisa berubah sedemikian rupa.

Saya mencoba menganalisa file binary main_malware tersebut tetapi saya kurang mengerti jadi saya lanjutkan menganalisa berdasarkan perubahan stringnya, dan pada akhirnya saya berhasil menemukan kunci dari perubahan huruf huruf tersebut, yang dimana kuncinya adalah 15 angka sebelumnya.

Jika kita melakukan split setiap 16 karakter pada file yang terenkripsi tersebut, maka akan lebih terlihat jelas, saya membuat file lagi dengan menggunakan kombinasi dari huruf kecil, besar dan angka untuk melihat perbedaanya.

Kemudian masukan kumpulan angka kedalam variable encflag

encflag="33333334333333313333333433333331333333343333333136333436353931337132332333433661"
raw = [encflag[i:i+16] for i in range(0, len(encflag), 16)]
print(raw)

Perhatikan pada 15 angka sebelum karakter ke 16 pada tiap item, disini 15 angka pertama konsisten berdasarkan tipe karakter, jika kapital angka tengah adalah 4, jika kecil angka tengah adalah 6 dan jika angka, angka tengah adalah 3, tetapi pada 2 item terakhir sangat berbeda dan saya tidak menghiraukan kedua items terakhir tersebut dan saya membuat python script untuk men-decrypt flag yang terencrypt pada file warning.

Disini saya tidak berhasil mendrypt ke 24 karakter, tapi berdasarkan string tersebut, saya sudah mengetahui sisa karakter tersebut, tapi disini flag pada file warning.txt hanya 24 karakter sedangkan hasil decryptnya seperti ada yang kurang, jadi saya coba dulu untuk mengecek apakah sudah benar. Disini saya menggunakan remote file agar memudahkan dalam membuat dan mengedit file yang akan di encrypt.

*file ../test1 adalah kumpulan angka pada warning.txt yang sudah saya pisahkan

Dan menyiapkan python server pada physical machine saya.

Kemudian lakukan curl pada directory yang terdapat file main_malware dan pipe dengan bash.

jika diperhatikan hanya kurang 1karakter terakhir dan disini saya sangat yakin karakter ke 24 dari flag ini adalah “s”, kemudian saya tambahkan s pada string flag, dan jalankan ulang.

Tetapi 16 karakter terakhir belum pas, tapi program hanya menerima 24 karakter input, jadi saya beranggapan huruf terakhir dari flag adalah “s” dan ditutup oleh “}” sebagai akhir flag, dan benar saja saat diinput itu adalah flagnya.

FLAG: RTL{r4nsom3_15_m4licious}

--

--

InersIn

PARSECT // IT Security Enthusiast // STOICISM // KEEP DO SOMETHING LEGAL