Cyber Jawara 2022 Quals

InersIn
7 min readDec 5, 2022

Rev

1. Sekr3T Message

Jika kita download file yang diberikan, kita tahu file tersebut adalah file binary executable, dan jika kita buka menggunakan IDA, kita tahu file tersebut menggunakan bahasa pemrograman GO karena terdapat library milik GO.

Kemudian jika kita buka main function, pada IDA versi 8.0, kita akan mendapatkan string base64

Jika kita decode string tersebut, kita mendapatkan flagnya.

Flag: CJ2022{S1n4u_Ben_6a_K3t1ngg4l4N}

Disini saya berhasil mendapatkan First Blood (keberuntungan 3 hari terpakai 🤣)

2. BabyRev

Jika kita download file yang diberikan, disini saya coba gunakan IDA untuk static analysis.

Jika dilihat pada main function kita tahu kalau input kita di compare dengan flag nya, setelah itu saya gunakan GDB untuk melakukan debugging.

Saya pasang catch pada exit_group menggunakan command berikut.

$ catch syscall exit_group

Setelah itu saya coba masukan input “AAAA”

Muncul setengah flag “CJ2022{no_st” tapi tidak terdapat sisa flagnya, kemudian saya coba find format flagnya menggunakan command berikut.

$ find CJ2022

GDB akan me-return banyak fake flag, tapi jika kita check pada stack, tidak ada sisa flagnya, kemudian saya coba masukan banyak string A.

Program akan mengalami Segmentation fault, dan setengah flag sebelumnya juga tidak muncul lagi, tapi jika kita check menggunakan find lagi.

Flag nya muncul.

FLAG: CJ2022{no_strings_just_ltrace}

3. Kamu Nanya?

Setelah kita download file zip tersebut dan setelah di unzip, kita akan mendapatkan banyak binary executable.

Kemudian saya buka file bertanya0 menggunakan IDA.

bertanya0

Input kita akan dilakukan operasi add (tambah) dan kemudian akan di-compare dengan hex 0x49, dan jika kita buka file bertanya1.

bertanya1

Input kita juga di lakukan operasi sub (pengurangan) kemudian di-compare dengan hex 0x35.

Disini jika di perhatikan, address pada saat melakukan kalkulasi sama, yang berbeda hanya operasi nya, dan kemungkinan flagnya bisa didapatkan dengan melakukan kebalikan operasi yang dilakukan, misal jika input kita di lakukan sub maka kita lakukan add, jika input kita dilakukan add, maka kita lakukan sub.

Berdasarkan ide tersebut, saya buat python code untuk melakukan automation, dan untuk mengetahui operasi yang dilakukan, saya menggunakan objdump.

Kemudian jika kita run, kita akan mendapatkan flagnya.

Flag: CJ2022{opoKuwi_Kowe_t3k0000k}

Pwn

1. Minato Aqua

Setelah mendownload file tersebut, saya buka dengan IDA untuk melakukan static analysis.

Main function

Jika kita lihat pada main function, program memanggil function “sub_4011DE”, jika kita lihat function tersebut, function memanggil gets yang dimana vuln terhadap Buffer Overflow.

Function sub_4011DE

Setelah itu saya gunakan GDB untuk dynamic analysis.

Karena file stripped, kita tidak bisa melihat main function dan yang lainnya. Jadi disini saya coba mencari address yang akan saya breakpoint, disini saya mengambil nya dari IDA.

Disini saya copy function sub_4011DE, kita akan mendapatkan address dari function itu, kemudian pada GDB, kita bisa melihat function tersebut menggunakan address yang didapat.

Kemudian saya pasang breakpoint pada address 0x401211.

Jika kita run menggunakan bnyak karakter A, kita akan mendapatkan Segmentation fault.

Kemudian kita cari padding agar program mengalami crash. Untuk mencari nya cukup mudah, bisa dengan tool built in GDB, tapi disini saya coba manual dengan menghitung posisi input kita dan posisi address rsp.

Jika kita run seperti biasa, program akan breakpoint dan kita lihat pada register RSP.

Address RSP pada 0x7fffffffdcb8, dan kita bisa cari posisi input kita dengan command berikut.

$ find AAAA

Address input kita adalah 0x7fffffffdc90, sekarang tinggal kita kurangi saya address RSP dengan addres input kita.

0x7fffffffdcb8 - 0x7fffffffdc90 = 40

Sekarang kita tahu paddin yang dibutuhkan untuk membuat program crash. Kemudian berdasarkan enumerasi sebelumnya, kita tahu jika ada function system pada program, kita bisa memanfaatkan function system agar mendapatkan command execution. Untuk menggunakan function system, kita perlu memasukan input kita ke register RDI, tetapi setelah saya coba cari gadget POP RDI, gadget tersebut tidak tersedia di program jadi kita perlu mencari alternatif lain.

Setelah saya mencari cari, pada intinya kita perlu memasukan input kita ke register RDI, jadi tidak berpaku pada POP RDI, kita bisa memanfaatkan gadget lain.

Jika kita perhatikan pada register RAX, kita bisa liat input kita tersimpan pada register RAX, jadi jika kita bisa menemukan gadget yang melakukan MOV dari RAX ke RDI, kita bisa memasukan input kita sebagai argument system. Setelah saya cari cari ternyata terdapat gadget yang melakukan move dari RAX ke RDI dan langsung memanggil system.

Setelah mendapatkan gadget yang diinginkan, kita bisa membuat payload kita dengan format berikut.

"A"*40
+
gadget
from pwn import *
payload = "A"*40
payload += p64(0x4011d3)

with open("payload", 'w') as f:
f.write(payload)
f.close()

Setelah itu, coba kita run GDB menggunakan file payload sebagai input.

Kemudian kita Step Into.

Program akan memasukan RAX ke RDI, kita Step Into lagi.

RDI terisi sama persis seperti RAX, kemudian kita ubah 8 byte pertama input kita menjadi /bin/sh karena kita ingin mendapatkan shell.

from pwn import *
payload = "/bin/sh\x00"
payload += "A"*(40-len(payload))
payload += p64(0x4011d3)

with open("payload", 'w') as f:
f.write(payload)
f.close()

Kemudian kita run lagi.

Jikat kita jalan kan program tersebut dengan file payload sebagai input, kita akan mendapatkan command execution.

Pada local payload kita berhasil, tapi pada server challenge payload kita gagal.

Kita gagal mengeksekusi shell, karena AAAAAAAA not found, disini saya mengalami stuck beberapa saat, sampai akhirnya saya sadar /bin/sh mencoba mengeksukusi AAAAAAAA, jadi saya ubah format “A”*(40-len(payload)) menjadi berikut.

from pwn import *

movedi = 0x4011d3

payload = "/bin/sh\x00"
payload += "aaaabbbbccccddddeeeeffffgggghhhh"
payload += p64(movedi)

with open("payload", 'wb') as f:
f.write(payload)

Disini kita lihat, program coba mengeksekusi “gggghhhh”, jadi saya ubah payload pada bagian “gggghhhh” menjadi “/bin/sh\x00”.

from pwn import *

movedi = 0x4011d3

payload = "/bin/sh\x00"
payload += "aaaabbbbccccddddeeeeffff/bin/sh\x00"
payload += p64(movedi)

with open("payload", 'wb') as f:
f.write(payload)

Kemudian, jika kita run, kita akan berhasil mendapatkan command injection.

Flag: CJ2022{good_luck_with_the_other_challs!!!!!!}

--

--

InersIn

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