Minggu, 23 September 2018

[Write Up] IDCC 2018 Crypto -DecryptME- 50pts

Assalamu'aikum teman-teman :)
Kali ini saya akan berbagi Write Up dari salah satu soal di IDCC Ctf 2018 yang baru saja berakhir. Selamat membaca~
Langsung saja soal kali merupakan soal Crypto. Diberikan sebuah file yang berisi string flag yang sudah di enkripsi dan program yang digunakan untuk enkripsi kedua file tersebut bisa didownload disini.

Pertama, kita lihat dulu program yang digunakan untuk mengenkripsi, kira-kira seperti ini.
Serta untuk hasil enkripsi flagnya adalah seperti ini:
Tugas kita adalah untuk mendekripsi string tersebut supaya bisa mendapatkan flagnya. Nah, karena proses dekripsi merupakan kebalikan dari proses enkripsi maka untuk mendekrip string tersebut kita memprosesnya secara terbalik.
Dilihat dari proses paling akhir yaitu mengubah nilai integer menjadi huruf. Maka langkah pertama untuk mendekripnya adalah mengubah setiap huruf dari string yang kita dapat menjadi bentuk integernya. Nilai integer itu didapat dari nilai var teks dan var kunci di modulo 127. Modulo disini bisa juga diartikan sebagai pengurangan. Maka jika pengurang dibalik hasilnya harus ditambah. Jadi integer yang sudah kita dapat ditambah dengan 127.

Sekarang nilai integernya merupakan jumlah dari nilai var teks dan var kunci. Disini saya mengguakan program  seperti dibawah ini untuk mendapatkan nilai integernya:
Hasilnya:
Langkah selanjutnya kita harus melakukan proses bruteforce untuk bisa mendapatkan nilai dari kunci. Sedangkan untuk nilai dari var teks akan menjadi parameter pengecekan yang bisa kita tebak dari format flagnya. Dimana format dari flagnya pasti diawali dengan string 'IDCC{', nah kita cek jika kunci yang dimasukkan senilai maka itu kunci jika tidak senilai berarti bukan. Eit, tapi jangan lupa pada awal enkripsi bentuknya diencode dulu menjadi base64. Selanjutnya tambahkan beberapa baris script baru untuk mengecek key pada program yang sudah kita buat sebelumnya:
Hasil kuncinya:
Sekarang kita sudah mendapatkan nilai dari kunci. Saatnya melakukan dekripsi dari string flag yang sudah dienkripsi.Caranya adalah dengan mengurangi setiap nilai integer dari string enkripsi dengan kunci secara berulang kemudian diubah menjadi huruf lalu didecode base64. Kenapa dikurangi? Karena pada saat proses enkripsi ditambah. Kira-kira beginilah bentuk program untuk mendekripsinya:

Hasilnya adalah flag:

Flag : IDCC{S1mpl3_4nd_stR4ight}

Sekian, terima kasih sudah menyimak sampai akhir. Silakan berikan kritik & saran kepada penulis, karena penulis juga masih belajar. :)
Share:

[Write Up] IDCC 2018 Binary Exploit -Format Playing- 50pts

Assalamu'aikum teman-teman. :)
Kali ini saya akan berbagi Write Up dari salah satu soal di IDCC Ctf 2018 yang baru saja berakhir. Selamat membaca~
Langsung saja soal kali merupakan soal Binary Exploit. Diberikan sebuah service pada server dan program ELF 32-bitnya  yang bisa didownload disini.

Langkah pertama yang dilakukan langsung saja lakukan reversing menggunakan IDA Pro. Lalu lihat pada bagian pseudocodenya. Kira-kira akan tampil seperti ini:

Bisa dilihat dari hasil diatas, inputan akan dibaca menggunakan scanf yang dibatasi hanya membaca inputan sepanjang 128 char. Program akan menampikan string "Congratulions!" dan Flag jika nilai dari variabel secret adalah 48879. Jika tidak maka program hanya akan menampilkan nilai dari variabel secret dan string "hahaha... shame". Nah, sekarang kita tahu bahwa tujuan dari soal ini adalah mengubah nilai dari variabel secret menjadi nilai tertentu yang pada kesempatan kali ini bernilai 48879. Tapi, dari inputan yang disediakan tidak bisa untuk mengubah nilai dari variabel secret. Bagaimana caranya ya? hm, Kita coba jalankan dulu servicenya pada sisi server.
Terlihat bahwa input yang kita masukkan akan ditampilkan ulang oleh program. Hm, bagaimana kalau kita coba memberi inputan lebih dari 128?
Hm, ternyata yang tampilkan tetap saja 128 char awal yang kita masukkan. Hm, setelah melihat ulang hasil reverse dari IDA Pro tadi seksama ternyata pada bagian scanf hanya memberikan batas inputan yang dibaca, tapi menentukan jenis inputan atau format dari masukkan. Nah, ini bisa dimanfaatkan untuk melakukan exploit menggunakan celah itu yang disebut format vulnebilities. Jadi kita bisa menentukan sendiri jenis format yang ingin dimasukkan yang kemudian ditampilkan oleh program. Untuk mengeceknya apakah benar service ini memiliki celah tersebut kita coba masukkan %x untuk menampilkan nilai hexadecimal, yang jika dimasukkan seharusnya menampilkan alamat memory dari service. Langsung saja kita coba.
Nah, seperti dugaan kita sebelumnya ternyata benar bahwa service ini mempunyai format vulnebilities. Selanjutanya kita cari alamat memory yang akan menampung inputan kita. Caranya dengan memasukkan beberapa huruf yang diikuti dengan beberapa %x. Kali ini saya menggunakan python agar lebih mudah membuat payloadnya.

Bisa dilihat pada saat saya memasukkan 4x huruf 'A' yang diikuti 7x "%x " pada bagian akhir muncul nilai 41414141 yang merupakan bentuk hexadecimal dari huruf 'A'. Nah, sekarang kita sudah dapat posisi alamat memory yang menampung inputan kita. Selanjutnya adalah kita ubah inputan kita dengan alamat memory dari nilai variabel secret, karena kita akan mengubah nilai variabel tersebut. Cara mencarinya gunakan perintah pada linux 'objdump -t format_playing' lalu akan muncul alamatnya seperti dibawah ini:
Nah, terlihat bahwa alamat dari variabel secret adalah '0804a034'. Sekarang kita ubah inputan kita yang tadinya 4x 'A' menjadi  alamat itu. Kita gunakan python lagi, lalu karena nilai dari alamat memory menggunakan little endian maka tulisan dibalik. Langsung saja kita coba lagi.
Nah, pada bagian akhir sekarang sudah muncul alamat memory dari variabel secret, sekarang kita coba ubah nilai dengan cara mengubah '%x' yang terkahir menjadi '%n'. Seharusnya sekarang nilai dari secret berubah.
Seperti yang kita harapkan sekarang nilai dari variabel secret sudah berubah, tapi nilainya belum sesuai dengan yang diinginkan. Kita bisa mengaturnya dengan cara memberikan nilai pada '%x' yang mana nilai tersebut adalah pengurangan dari nilai yang diinginkan dengan nilai yang sekarang. Maka 48879 - 43 = 48836. Sekarang kita coba udah nilainya.

Nilai dari secret sudah berubah, tapi masih belum sesuai. yang mana sekarang selisih nilainya tinggal 9. Kita tambahkan saja dengan nilai sebelumnya menjadi 48845. Sekarang kita coba lagi.

Sudah muncul tulisan Congratulations!, coba kita scroll ke atas maka akan muncul flagnya.
Flag : IDCC{M4nipulat1n9_F0rm4t_for_pR0f1T_$$$}

Sekian, terima kasih sudah menyimak sampai akhir. Silakan berikan kritik & saran kepada penulis, karena penulis juga masih belajar. :)

Share:

Senin, 10 September 2018

[Write Up] Cyber Jawara 2018 Reversing -Numbers-

Assalamu'aikum teman-teman. :)
Kali ini saya akan berbagi Write Up dari salah satu soal di Cyber Jawa 2018 yang baru saja berakhir. Selamat membaca~
Langsung saja soal kali merupakan soal Reversing. Diberikan sebuah program ELF 64-bitnya not stripped  yang bisa didownload disini.
Langsung saja kita buka dengan IDA Pro 64-bit, lalu lihat hasil pseudocodenya. Hasilnya kurang lebih seperti ini.
Seperti yang terlihat diatas kita disuruh untuk memasukkan 20 angka yang kemudian dicek menggunakan perulangan yang mana jika setelah dicek nilai dari v7 adalah true atau 1 maka akan muncul string "Good numbers" dan flag. Jika nilai dari v7 selain itu maka akan muncul string "Bad numbers". Nah, untuk bisa membuat nilai v7 tetap 1 maka kita harus bisa memasukkan 20 angka yang sesuai dengan pengecekan. Kita coba jalankan dulu programnya.
Kita coba memasukkan 20 angka bebas dan hasilnya adalah string "Bad numbers". Hm, sekarang saat kita membuat program yang akan menghasilkan angka yang sesuai dengan pengecekan. Pertama, kita harus pahami dulu pengecekannya.

Pada perulangan pengecekan yang pertama tertulis seperti ini.
Yang artinya apa? Artinya jika nilai dari numbers[0] dan numbers[1] harus bernilai 1. Nah, nilai dari variabel numbers sendiri merupakan nilai dari inputan kita. Berarti angka pertama dan kedua kita harus bernilai 1.

Lanjut ke perulangan pada pengecekan yang kedua terlihat seperti ini
Selanjutnya jika nilai dari j lebih dari 1 yaitu 2 maka angka inputan kita akan dicek disini. Berarti nilai yang pertama dicek adalah numbers[2] atau inputan ke-3 kita. Perulangan tersebut mengecek apakah nilai dari numbers[j] tidak senilai dengan nilai numbers[j - 1] + numbers[j-2]. Kita ambil contoh inputan angka ke-3 kita berarti j = 2. Kita masukkan nilai j ke pengecekan diatas, maka hasilnya:
numbers[2] != numbers[1] + numbers[0].
Kita sudah tau sebelumnya bahwa nilai dari numbers[0] dan number[1] adalah 1. Kita coba masukkan nilai tersebut, hasilnya: numbers[2] != 1 +1. Artinya input ke 3 kita harus 2. Nah, jika kita perhatikan pola ini bisa diartikan bahwa nilai inputan kita adalah jumlah dari 2 inputan sebelumnya. Hm, sekarang langsung saja buat program sederhana yang akan menghasilkan 20 angka yang sesuai dengan pengecekan. Kali ini saya menggunakan pyhton. Kurang lebih program saya seperti ini:
Yang kalau dijalankan akan mengahasilkan 20 angka seperti dibawah ini:
Langsung saja kita jadikan hasil angka dari program yang kita buat menjadi inputan angka untuk program numbersnya menggukan pipe linux atau '|'.
Nah, miuncul string 'Good numbers' diikuti dengan flagnya.

Flag : CJ2018{l0g1c_t35t_!}

Sekian, terima kasih sudah menyimak sampai akhir. Silakan berikan kritik & saran kepada penulis, karena penulis juga masih belajar. :)
Share: