BCA CTF 2019 - Writeup
- 35 minsDisini saya akan membagikan writeup beberapa soal BCA CTF 2019 yang saya berhasil selesaikan .
Category : Welcome
hello-world 50 Pts
Flag : bcactf{hello!}
net-cat 50 Pts
Jalankan commandnya dan muncullah flagnya
Flag : bcactf{5urf1n_7h3_n37c47_c2VydmVyc2lkZQ
wuphf 50 Pts
Buka setiap sosmed dari BCACTF dan terdapat pecahan dari flag pada setiap sosmednya .
Flag : bcactf{h17_u5_uP_d3VwaGYuY29t}
Category : Binary Exploitation
executable 150 Pts
Disini saya menggunakan radare2 untuk melakukan debugging dan ghidra untuk melakukan decompiling.
Berikut hasil decompile file executable
Jadi disini puVar3 mengambil data dari section .rodata pada address 004008c0 yang mana data tersebut nantinya disimpan pada local_498. Dan kemudian terdapat while looping yang mengisi local_318 yang mana setiap index genap merupakan value dari local_498, misal ketika local_49c=0 maka local_318[0*2] =local_498[0] dan untuk index ganjil diisi dengan "\n" sampai memenuhi local_49c < 377 . Nantinya local_318 ini lah yang diprint jika uVar1 == 1. Namun bagaimana caranya menjadikan uVar1 = 1 sedangkan uVar1 sendiri memiliki value rand() ? . Disini kita dapat menggunakan radare2 untuk mengubah value register yang nantinya di bandingkan dengan 1 .
Perbandingan tadi terdapat pada address 0x004006a4 , yaitu cmp ebx,0x1 . Jadi disini kita cukup mengubah value dari register ebx menjadi 1 agar hasilnya True.
Karena ini file binary 64 bit maka yang kita ubah adalah register rbx (ebx untuk 32 bit)
Dan berhasil , dibawah tulisan Congratulations terdapat string hasil encode dari brainfuck sebagai berikut.
Yang jika didecode hasilnya adalah sebuah flag.
Flag : bcactf{3x3cut4bl3s_r_fun_124jher089245}
executable-2 250 Pts
Disini saya menggunakan radare2 untuk melakukan debugging dan ghidra untuk melakukan decompiling.
Berikut hasil decompile file executable-2
Jadi disini puVar3 mengambil data dari section .rodata pada address 004008e0 yang mana data tersebut nantinya disimpan pada local_11f8. Dan kemudian terdapat while looping yang mengisi local_618 yang mana setiap index ganjil ke-n merupakan value dari local_11f8 index ke -n*4 dengan valuenya dibagi 100, misal ketika local_11fc=0 maka local_618[0*2+1] =local_11f8[0*4] (jika value dari local_11f8=4600 maka yang disimpan di local_618 adalah 46 )dan untuk index genap diisi dengan "\n" sampai memenuhi local_11fc < 758 . Nantinya local_618 ini lah yang diprint jika iVar1 == 1. Disini kita juga akan menggunakan radare2 untuk mengubah value register yang nantinya di bandingkan dengan 1 .
Perbandingan tadi terdapat pada address 0x00400691 , yaitu cmp ebx,0x1 . Jadi disini kita cukup mengubah value dari register ebx menjadi 1 agar hasilnya True.
Karena ini file binary 64 bit maka yang kita ubah adalah register rbx (ebx untuk 32 bit)
Dan berhasil , dibawah tulisan Congratulations terdapat string hasil encode dari brainfuck sebagai berikut.
Yang jika didecode hasilnya adalah sebagai berikut.
Karena kita tahu bahwa format flag adalah bcactf{} , maka tentunya string tersebut bukanlah flag,jadi disini kita coba gunakan caesar cipher untuk menemukan flag sebenarnya.
Dan ketemulah flagnya.
Flag : bcactf{Aboxd_ohomedklvoc_pex?_I_drsxu_cy_cnuptrasgoebisaegobktjxmhlfksrasgeoib}
Category : Crypto
basic-number 50 Pts
Disini kita diberikan soal sebagai berikut
Setiap 8 digit biner tersebut ternyata membentuk suatu character , jadi disini saya membuat sebuah script yang melakukan konversi biner tersebut ke karakter ascii .
Flag : bcactf{b1nary_s0lv3d_g00d_w0rk}
cracking-the-cipher 50 Pts
Disini kita diberikan sebuah soal yang mana terdapat clue yaitu Caesar Salad Dressing yang berarti terdapat sebuah string yang di encode menggunakan caesar cipher. Pada bagian akhir soal terdapat sebuah ciphertext yang sepertinya telah di encode menggunakan caesar cipher
Kemudian disini saya membuat sebuah script untuk mengembalikan cipher text tersebut menjadi plain text,karena disini kita tidak tahu text tersebut di encode menggunakan shift key berapa maka kita lakukan bf mulai dari 1 - 26 .
Flag : bcactf{learning_caesar_ciphers_is_fun!}
three-step-program 125 Pts
Disini kita diberika sebuah file txt yang isinya sebagai berikut.
Dari list karakter yang membentuk string tersebut dapat ditentukan bahwa kemungkinan block 1 = base64 , block 2 = base32 .
Kemudian kita lakukan decode sesuai dengan encodingnya
Dari block 2 kita dapat mengetahui bahwa block 3 menggunakan vignere cipher ( salah satu cipher yang diciptakan oleh orang prancis ) dengan key yaitu **SALT**. Berikut hasil decode nya
Flag : bcactf{ju57_y0u_w4i7_znjhbmnhaxm}
a-major-problem 200 Pts
Disini kita diberikan hint yaitu
The words translate to numbers, which then translate to the flag.
Berarti disini kita mengubah kata kata tersebut menjadi angka lalu mengubahnya ke karakter ascii . Cluenya disini adalah Major Mnemonic .
Saya menggunakan website https://major-system.info/en/ untuk melakukan translate ke angka dan didapatkan angka sebagai berikut .
Ternyata karakter ke 13 bukanlah / melainkan 0.
Flag : bcactf{g3t_g0t}
Category : Forensics
split-the-red-sea 100 Pts
Berikut file redsea.png nya
Disini saya menggunakan exiftool untuk melakukan forensic terhadap file tersebut dan didapatkan flag sebagai berikut .
Flag : bcactf{7w0_r3d5_sdf3wqa}
bca-craft 125 Pts
Disini saya menemukan sebuah file dengan nama flag.mfunction yang didalamnya terdapat flag dengan format sebagai berikut .
Flag : bcactf{m1n3cr4f7_b347s_f0rtn1t3}
file-head 125 Pts
Terdapat sebuah file flag.png yang mana ketika dibuka error ( not a png file ). Dilihat dari clue nya maka disini kita diminta untuk merubah file header nya sehingga file tersebut dapat dikenali sebagai file png.
Kita ubah file header nya menjadi file header dari png
Kemudian buka kembali maka muncullah flagnya.
Flag : bcactf{f1l3_h3ad3rs_r_c001}
of-course-rachel 150 Pts
Isi dari file zip tersebut adalah screenshot dari hex sebuah file yang terbagi menjadi 5. Disini saya menggunakan tesseract untuk melakukan konversi img to txt lalu menjadikan file part1-5 tersebut menjadi satu file
Disini saya menamakan file nya sebagai **full**
Lalu setelah itu saya coba untuk mengembalikannya kembali dengan command **xxd -r -p**
Sepertinya file tersebut adalah script python, namun hanya beberapa baris kode saja yang readable. Kemungkinan besar kesalahan sewaktu konversi dari img ke txt,setelah saya betulkan dan menggabungkan semua part berikut adalah potongan kodenya .
Pada script tersebut terdapat potongan kode yang menarik yaitu function int_to_text serta variable flag. Kemudian saya jadikan satu lalu coba run
Flag : bcactf{0p71c4lly_r3c0gn1z3d_ch4r4c73rs
open-docs 150 Pts
Disini kita bisa mengexplore isi dari file docx dengan cara mengubah ekstensinya menjadi .zip
Saya menemukan sebuah file xml yang menarik bernama secrets.xml
Isi dari secrets.xml adalah sebuah string yang diencode menggunakan base64
Setelah di decode ketemulah flagnya
Flag : bcactf{0OxMl_1s_4m4z1Ng}
study-of-roofs 150Pts
Diberikan sebuah file jpg , kemudian saya coba untuk menjalankan binwalk pada file jpg tersebut dan muncullah flagnya.
Flag : bcactf{r4i53_7h3_r00f_liz4rd}
wavey 150 Pts
Diberikan sebuah file straightfire.wav , disini saya coba langsung melihat spectogram dari file straightfire tersebut menggunakan audacity.
Flag : bcactf{f33lin_7h3_vib3z
corrupt-psd 200 Pts
Diberikan sebuah file psd yang mengalami error,dapat diketahui dari soal errornya disebabkan oleh file header yang salah , jadi disini saya merubah file header nya sesuai dengan file header psd.
Dan berikut ketika file tersebut dibuka
Flag : bcactf{corrupt3d_ph0705sh0p?_n0_pr0b5_1af4efb890}
the-flag-is 200 Pts
Disini saya membuka file flag.pdf dengan browser dan muncul lah flagnya
Flag : bcactf{d0n7_4g3t_4b0u7_1nCr3Men74l_uPd473s}
one-punch-zip 250 Pts
Diberikan sebuah file png dan juga file zip terpassword. Disini saya coba analisa file png karena passwordnya pasti ada hubungannya dengan file tersebut.
Setelah saya melakukan banyak percobaan forensic dan ternyata tidak membuahkan hasil akhirnya saya coba memanfaatkan string yang terdapat pada opm.png saat saya melakukan binwalk.
Disini saya coba melakukan bruteforce terhadap zip tersebut menggunakan string printable yang ada pada file 84.
Kemudian langsung saya coba crack dengan menggunakan fcrackzip dengan worldist pada bf.txt
Dan hasilnya
Lalu saya extract dan ketemulah flagnya
Flag : bcactf{u5ing_4ll_string5_0f_1mag3_@s_dictionary?}
Category : Programming
1+1=window 75 Pts
Diberikan sebuah file one.txt dan two.txt yang isinya adalah hex,dilihat dari soal dapat disimpulkan bahwa flagnya adalah hasil penjumlahan dari one.txt dan two.txt yang dikonversi ke ascii.
Flag : bcactf{1_h0p3_y0u_us3_pyth0n}
bca-store 75 Pts
Di berikan soal seperti diatas, dengan isi file input.txt sebagai berikut
Disini saya menggunakan python untuk membuat solvernya .
Output : 5.70 -1 1.00 75.00 -1 77.40 -1
instructions 175 Pts
Berikut isi pesannya
Dear Agent Reffef,
I have attached the super secret plans for operation 0x576f726b206f6e207468652070757a7a6c652c2073746f702072656164696e672068657821. You will need to decode it first though.
The rules are simple:
A line is "viable" if the length of a line is divisible by 3, and the line does not contain the & character.
For every viable line, you will grab the `n`th character, where `n` is the corresponding number at the top of the file (Counting from one!) The first viable line will use the first number, etc.
Put all the letters together to find the answer!
- Agent Doposi
Disini saya menggunakan python untuk membuat solver soal diatas
public-library 200 Pts
Diberikan file .class lalu saya decompile file tersebut dan didapatlah file .java yang isinya sebagai berikut.
Flag : bcactf{t4k3_4_j4v4_c7a55_789208694209642475
manner-of-thpeaking 250 Pts
Berikut isi dari file inthtructhins.txt
dan berikut isi dari file printableth.txt
Mekanisme encoding pada string di file inthructhins.txt adalah mengikuti urutan grup string pada printableth . Berikut penjelasannya
Berikut solver yang saya buat menggunakan python
Flag : bcactf{L157_8453d_pR0gR4Mm1nG_15_4w3S0Me!}
Category : Reversing
large-pass 100 Pts
Diberikan sebuah file binary large-linux , disini saya coba untuk melakukan decompile dengan ghidra
Terlihat jelas bahwa input kita tersimpan pada variable LStack32 yang mana dibandingkan dengan LStack24 dan jika sama maka akan melakukan print Correct password.
beriku adalah value dari variable LStack24 jika diubah ke decimal
Lalu jalankan ./{nama-file} lalu masukkan password tersebut maka outputnya adalah Correct password.
Flag : 5546068866699313608
basic-pass-1
Diberikan sebuah file binary basic-pass-1-linux , disini saya coba untuk melakukan decompile dengan ghidra.
Terlihat bahwa dibutuhkan setidaknya satu argument yang merupakan passwordnya sendiri yang dicocokkan dengan variable iVar1. Variable iVar1 sendiri jika diubah ke decimal adalah 1234. Jadi disini kita bisa tau langsung flagnya ataupun kita bisa juga menjalankan ./basic-pass-1-linux 1234 untuk mengetahui flagnya
Flag : bcactf{hey_its_a_password}
scratch-that 150 Pts
Link : https://scratch.mit.edu/projects/276674047/
Ketika kita membuka link tersebut maka akan tampil seperti gambar diatas,lalu disini saya coba menginputkan bebas dan berikut hasilnya
Dilihat dari judulnya adalah guess the flag, namun akan sangat sangat lama jika kita menebak flagnya karena tampilannya ketika salah flag hanya merah dan tulisan wrong , tidak ada info tambahan mengenai flagnya.
Jadi disini saya coba untuk melihat struktur dari program tersebut dan menemukan sesuatu yang menarik yaitu sebuah block generate flag dan variable flag.
Jadi saya coba menyalinnya ke function utama dengan struktur awal seperti berikut
Setelah saya ubah menjadi sebagai berikut
Dan berikut hasilnya setelah dijalankan
Flag : bcactf{scr4tch3d_Pourquoi_empty_23412342463682
another-pass 200 Pts
Diberikan sebuah file binary another-linux , disini saya coba untuk melakukan decompile dengan ghidra.
Hasil decompile fungsi main()
Terlihat disini inputkan kita disimpan sebagai string pada variable auStack72 dan kemudian variable tersebut digunakan sebagai parameter function checkinput()
Dan berikut hasil decompile fungsi checkinput()
inputan kita tadi pada function checkinput dinamakan lParm1. Kemudian lParm1 dicek panjangnya dengan fungsi strlen() lalu dimasukkan ke variable uVar1 , jika panjang uVar1 lebih besar dari uVar2 yang mana uVar2 sendiri di increment 1 setiap akhir looping ( local_24+=1 ) maka program akan mengeluarkan output Incorrect dan berhenti. Namun didalam proses looping terdapat pengecekan lain , yaitu pengecekan local_28 == 0x4b (75 dalam decimal) , local_28 sendiri adalah hasil penjumlahan dari local_2c (local_2c adalah setiap karakter pada lParm1 , *(undefined *)(lParm1 + (long)local_24) seperti array lParm1[0] dikarenakan looping pertama local_24 = 0 ) , jika pengecekan tersebut bernilai True maka akan memunculkan output Correct dan program akan berhenti .
Jadi disini kita hanya perlu memberikan input angka yang jika setiap digitnya dijumlah bernilai 75 , contoh : 999999993
Flag : 999999993
basic-pass-2 200 Pts
Diberikan sebuah file binary basic-pass-2-linux , disini saya coba untuk melakukan decompile dengan ghidra.
Hasil decompile fungsi main()
Password kita disimpan dalam variable puParm2[1] yang mana dicocokkan dengan string this is a much more secure password, i think , yang merupakan value dari variable uStack32 - Ustack72 dengan fungsi strcmp. Disini kita dapat mengetahui flag secara langsung melalui hasil decompile atau dengan menjalankan program sebagai berikut.
./basic-pass-2-linux ‘this is a much more secure password, i thin
Flag : bcactf{its_another_password
basic-pass-3 200 Pts
Pertama kita coba jalankan nc challenges.ctfd.io 30133 , berikut hasilnya
Karena kita tahu format flagnya adalah bcactf{} maka saya coba menginputkan b saja , hasilnya seperti diatas.
Jadi program akan mengeluarkan angka 1 jika input kita cocok dengan karakter yang ada index tersebut. contohnya jika saya menginputkan b sebanyak 38 kali (sesuai panjang flag) maka akan keluar angka 1 di index yang karakternya b.
Jadi disini saya langsung membuat script automation untuk melakukan percobaan semua string yang printable lalu melakukan print terhadap flagnya.
Flag : bcactf{y0u_4r3_4_m4573rm1nD!_Ym9vbGlu}
compression 200 Pts
Disini kita diberikan sebuah file yang bernama 999 , tanpa ekstensi . Namun kita dapat tahu file tersebut jenis apa dari command file di linux , jadi disini intinya kita tinggal memberikan ekstensi lalu extract ( atau langsung extract jika bisa ) , dan terdapat juga file hasil dari hexdump, kita dapat mengembalikannya dengan command berikut .
Kemudian jika sudah kita kembalikan lagi menjadi file aslinya dengan command berikut.
Jika sudah kita lakukan hal yang sama , yaitu extract dan extract sampai menemukan sebuah file dengan nama 000 yang berisi flag.
Flag : bcactf{A_l0t_0f_c0mPr3s510n}
Category : Web
the-inspector 50 Pts
Disini kita cukup melakukan inspect element sesuai dengan judul soal dan muncullah flagnya
Flag : bcactf{1nsp3ct_3l3m3nt}
wite-out 50 Pts
Terdapat sebuah string di bawah challenge description dengan warna yang sama dengan background dan string tersebut adalah flagnya
Flag : bcactf{17s_r1gh7_h3r3_1n_wh1t3_1397856}
dig-dug 100 Pts
Disini kita cukup jalankan command berikut untuk mencari dns record berupa TXT pada domain tersebut.
Flag : bcactf{d1g-f0r-h073s-w/-dns-8044323}
cookie-clicker 150 Pts
Berikut adalah tampilan ketika kita membuka link tersebut
Ketika kita melakukan klik pada cookies maka angka cookie tersebut akan bertambah 1,kemudian saya coba klik shop.
Dan ternyata kita membutuhkan sekian banyak cookies untuk dapat membeli flag,namun berdasarkan judulnya dapat kita ketahui bahwa soal ini berhubungan dengan cookie. Selanjutnya saya coba untuk membeli flag dan berikut hasilnya
Saya coba untuk mengamati http request yang dilakukan saat mengklik buy flag tadi.
Dan ternyata terdapat paramter cookies pada bagian cookie,dan saya ubah menjadi sejumlah yang dibutuhkan lalu coba untuk melakukan send kembali.
Berikut hasilnya
Flag : bcactf{c00k13s_c71ck3d_34a2344d}
Terima kasih telah membaca :)