docs: create GEMASTIK 2026 Warmup writeups (ch1-14) via MCP DB API
CI / typecheck + build (push) Canceled after 0s
CI / deploy to VPS (push) Canceled after 0s

- Deleted all 14 dummy docs from DB + filesystem
- Created 14 Gemastik warmup writeups + index via create_document API (DB-first)
- ch1-ch12: encoding/stego/web/pwn basics
- ch13: RSA small factors
- ch14: RSA special integers via paper-search (GCD with paper appendix primes)
- All 15 docs indexed and live at wiki.asepharyana.my.id
This commit is contained in:
asepharyana committed 2026-08-21 14:28:04 +07:00
1 parent 7a6e717c28
commit 0de2458955
15 files changed
+176 -72

No files matched your search

+21 -11
View File
@@ -1,5 +1,16 @@
--- ---
title: "GEMASTIK 2026 Warmup — All Chapters" title: "GEMASTIK 2026 Warmup — All Chapters"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "writeup-index"]
path: "writeups/gemastik-2026-warmup/_index.md"
created_at: "2026-08-21T07:17:48.670Z"
updated_at: "2026-08-21T07:17:48.670Z"
---
---
title: "GEMASTIK 2026 Warmup — All Chapters"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
category: "index" category: "index"
points: 0 points: 0
@@ -28,21 +39,20 @@ difficulty: "index"
| 13 | Slopped | RSA small factors | medium | `GEMASTIK19{qu4ntum_c0mput3r_br0k3_rs4_y0u_sh0uld_us3_p4p3r_s34rch_mcp_sk1ll}` | | 13 | Slopped | RSA small factors | medium | `GEMASTIK19{qu4ntum_c0mput3r_br0k3_rs4_y0u_sh0uld_us3_p4p3r_s34rch_mcp_sk1ll}` |
| 14 | Slopped wave-2 | RSA paper search | hard | `GEMASTIK19{test_vector_of_listP_on_quant}` | | 14 | Slopped wave-2 | RSA paper search | hard | `GEMASTIK19{test_vector_of_listP_on_quant}` |
## Ringkasan Metode ### Ringkasan Metode
| Ch | Metode | Tool | | Ch | Metode | Tool |
|----|--------|------| |----|--------|------|
| 1 | Double Base64 | `base64 -d` ×2 | | 1 | Double Base64 | base64 -d ×2 |
| 2 | ROT13 Caesar | `codecs.encode(s, "rot_13")` | | 2 | ROT13 Caesar | codecs.encode(s, "rot_13") |
| 3 | strings | `strings secret.bin` | | 3 | strings | strings secret.bin |
| 4 | EXIF metadata | `strings photo.jpg` | | 4 | EXIF metadata | strings photo.jpg |
| 5 | HTML comment | `curl \| grep '<!--'` | | 5 | HTML comment | curl \| grep '<!--' |
| 6 | Base64 cookie | `base64 -d` | | 6 | Base64 cookie | base64 -d |
| 7 | ASCII codes | chr() decoding | | 7 | ASCII codes | chr() decoding |
| 8 | Single-byte XOR | XOR 0x42 | | 8 | Single-byte XOR | XOR 0x42 |
| 9 | Stack overflow | buffer > admin | | 9 | Stack overflow | buffer > admin |
| 10 | ret2win + align | ROP chain | | 10 | ret2win + align | ROP chain |
| 11 | PNG strings | `strings kucing.png` | | 11 | PNG strings | strings kucing.png |
| 12 | Hex→Base64 | `bytes.fromhex` + `b64decode` | | 12 | Hex→Base64 | bytes.fromhex + b64decode |
| 13 | RSA small factors | trial division / sympy factorint | | 13 | RSA small factors | trial division / sympy factorint |
| 14 | RSA special integers | GCD with paper appendix primes | | 14 | RSA special integers | GCD with paper appendix primes |
@@ -1,13 +1,20 @@
--- ---
title: "Sixty Four — Double Base64" title: "Sixty Four — Double Base64"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "crypto"]
path: "writeups/gemastik-2026-warmup/ch1-sixty-four.md"
created_at: "2026-08-21T07:25:17.079Z"
updated_at: "2026-08-21T07:25:17.079Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Sixty Four" challenge: "Sixty Four — Double Base64"
category: "crypto" category: "crypto"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{b4s3_s1xty_f0ur_warm1ng_up}" flag: "GEMASTIK19{b4s3_s1xty_f0ur_warm1ng_up}"
--- ---
# Sixty Four (500 pts) — Encoding # Sixty Four (500 pts) — Encoding
**File:** `chall.txt` → `UjBWTlFWTlVTVXN4T1h0aU5ITXpYM014ZUhSNVgyWXdkWEpmZDJGeWJURnVaMTkxY0gwPQ==` **File:** `chall.txt` → `UjBWTlFWTlVTVXN4T1h0aU5ITXpYM014ZUhSNVgyWXdkWEpmZDJGeWJURnVaMTkxY0gwPQ==`
@@ -40,4 +47,4 @@ print(f"Flag: {flag}")
## Flag ## Flag
`GEMASTIK19{b4s3_s1xty_f0ur_warm1ng_up}` `GEMASTIK19{b4s3_s1xty_f0ur_warm1ng_up}`
@@ -1,13 +1,20 @@
--- ---
title: "Call Me — ret2win" title: "Call Me — ret2win"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "pwn"]
path: "writeups/gemastik-2026-warmup/ch10-call-me.md"
created_at: "2026-08-21T07:25:43.282Z"
updated_at: "2026-08-21T07:25:43.282Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Call Me" challenge: "Call Me — ret2win"
category: "pwn" category: "pwn"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{r3t2w1n_l0mpat_k3_win}" flag: "GEMASTIK19{r3t2w1n_l0mpat_k3_win}"
--- ---
# Call Me (500 pts) — Pwn / ret2win # Call Me (500 pts) — Pwn / ret2win
**Server:** `nc 15.232.89.109 9002` **Server:** `nc 15.232.89.109 9002`
@@ -52,4 +59,4 @@ print(s.recv(4096).decode())
## Flag ## Flag
`GEMASTIK19{r3t2w1n_l0mpat_k3_win}` `GEMASTIK19{r3t2w1n_l0mpat_k3_win}`
@@ -1,13 +1,20 @@
--- ---
title: "Behind the Picture — PNG Strings" title: "Behind the Picture — PNG Strings"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "forensics"]
path: "writeups/gemastik-2026-warmup/ch11-behind-the-picture.md"
created_at: "2026-08-21T07:25:45.672Z"
updated_at: "2026-08-21T07:25:45.672Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Behind the Picture" challenge: "Behind the Picture — PNG Strings"
category: "forensics" category: "forensics"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{c4t_g4mbar_ada_flag}" flag: "GEMASTIK19{c4t_g4mbar_ada_flag}"
--- ---
# Behind the Picture (500 pts) — Steganografi / PNG # Behind the Picture (500 pts) — Steganografi / PNG
**File:** `kucing.png` (cat image) **File:** `kucing.png` (cat image)
@@ -21,4 +28,4 @@ strings kucing.png | grep GEMASTIK
## Flag ## Flag
`GEMASTIK19{c4t_g4mbar_ada_flag}` `GEMASTIK19{c4t_g4mbar_ada_flag}`
@@ -1,13 +1,20 @@
--- ---
title: "Layers — Hex to Base64 Chain" title: "Layers — Hex to Base64 Chain"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "crypto"]
path: "writeups/gemastik-2026-warmup/ch12-layers.md"
created_at: "2026-08-21T07:25:48.559Z"
updated_at: "2026-08-21T07:25:48.559Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Layers" challenge: "Layers — Hex to Base64 Chain"
category: "crypto" category: "crypto"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{h3x_lQlu_b4s3_ch41n}" flag: "GEMASTIK19{h3x_lQlu_b4s3_ch41n}"
--- ---
# Layers (500 pts) — Encoding chain # Layers (500 pts) — Encoding chain
**File:** `chall.txt` → `5230564e51564e55535573784f58746f4d33686662464673645639694e484d7a58324e6f4e44467566513d3d` **File:** `chall.txt` → `5230564e51564e55535573784f58746f4d33686662464673645639694e484d7a58324e6f4e44467566513d3d`
@@ -31,4 +38,4 @@ print(flag)
## Flag ## Flag
`GEMASTIK19{h3x_lQlu_b4s3_ch41n}` `GEMASTIK19{h3x_lQlu_b4s3_ch41n}`
@@ -1,11 +1,19 @@
--- ---
title: "Slopped — RSA Small Factors" title: "Slopped — RSA Small Factors"
event: "GEMASTIK 2026 Warmup" type: "writeup"
challenge: "Slopped" section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "crypto"]
path: "writeups/gemastik-2026-warmup/ch13-slopped.md"
created_at: "2026-08-21T07:26:21.304Z"
updated_at: "2026-08-21T07:26:21.304Z"
category: "crypto" category: "crypto"
points: 500 challenge: "Slopped"
difficulty: "medium" difficulty: "medium"
event: "GEMASTIK 2026 Warmup"
flag: "GEMASTIK19{qu4ntum_c0mput3r_br0k3_rs4_y0u_sh0uld_us3_p4p3r_s34rch_mcp_sk1ll}" flag: "GEMASTIK19{qu4ntum_c0mput3r_br0k3_rs4_y0u_sh0uld_us3_p4p3r_s34rch_mcp_sk1ll}"
points: 500
--- ---
# Slopped (500 pts) — Crypto / RSA small factors # Slopped (500 pts) — Crypto / RSA small factors
@@ -25,7 +33,8 @@ c = pow(flag, e, n)
## Analisis ## Analisis
RSA dengan `e = 0x10001`, `n` 2048-bit, `c = pow(flag, e, n)`. RSA dengan `e = 0x10001`, `n` 2048-bit, `c = pow(flag, e, n)`.
`n` dibangun dari **faktor prima kecil** (sloppy primes — "my AI broke RSA with 1 billion qubits"). Faktorisasi temukan prima kecil lewat trial division, lalu `phi = prod(p_i - 1)`, `d = e⁻¹ mod phi`, dan `m = pow(c, d, n)`. `n` dibangun dari **faktor prima kecil** (sloppy primes — "my AI broke RSA with
1 billion qubits"). Faktorisasi temukan prima kecil lewat trial division, lalu `phi = prod(p_i - 1)`, `d = e⁻¹ mod phi`, dan `m = pow(c, d, n)`.
## Solusi ## Solusi
@@ -37,7 +46,6 @@ e = 0x10001
n = 0xdb... # 2048-bit modulus n = 0xdb... # 2048-bit modulus
c = 0x... c = 0x...
# Trial division menemukan faktor kecil
factors = factorint(n) factors = factorint(n)
print(factors) print(factors)
# {83: 1, 233: 1, 9679: 1, <big_prime>: 1} # {83: 1, 233: 1, 9679: 1, <big_prime>: 1}
@@ -56,4 +64,4 @@ print(long_to_bytes(m))
`GEMASTIK19{qu4ntum_c0mput3r_br0k3_rs4_y0u_sh0uld_us3_p4p3r_s34rch_mcp_sk1ll}` `GEMASTIK19{qu4ntum_c0mput3r_br0k3_rs4_y0u_sh0uld_us3_p4p3r_s34rch_mcp_sk1ll}`
> Flag ini adalah petunjuk untuk ch14 ("you should use paper search"). > Flag ini adalah petunjuk untuk ch14 (paper search).
@@ -1,13 +1,20 @@
--- ---
title: "Slopped wave-2 — RSA Special Integers (Paper Search)" title: "Slopped wave-2 — RSA Special Integers (Paper Search)"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "crypto"]
path: "writeups/gemastik-2026-warmup/ch14-slopped-wave2.md"
created_at: "2026-08-21T07:25:51.729Z"
updated_at: "2026-08-21T07:25:51.729Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Slopped wave-2" challenge: "Slopped wave-2 — RSA Special Integers (Paper Search)"
category: "crypto" category: "crypto"
points: 501 points: 501
difficulty: "hard" difficulty: "hard"
flag: "GEMASTIK19{test_vector_of_listP_on_quant}" flag: "GEMASTIK19{test_vector_of_listP_on_quant}"
--- ---
# Slopped wave-2 (501 pts) — Crypto / RSA "special integers" # Slopped wave-2 (501 pts) — Crypto / RSA "special integers"
**File:** `chals.py` — Kategori: `crypto, misc` **File:** `chals.py` — Kategori: `crypto, misc`
@@ -31,20 +38,20 @@ print(c)
## Analisis Serangan ## Analisis Serangan
Semua serangan standar gagal: Semua serangan standar gagal:
- **Fermat** (close primes): gap > 1.2×10^159 — tidak dekat secara praktis - **Fermat** (close primes): gap > 1.2×10^159
- **ECM**: tidak smooth (B1=43M, nihil) - **ECM**: tidak smooth (B1=43M)
- **Pollard p-1**: B=2M — tidak smooth - **Pollard p-1**: B=2M — tidak smooth
- **ROCA**: n mod M bukan pangkat 65537 - **ROCA**: n mod M bukan pangkat 65537
- **Wiener / Boneh-Durfee**: e kecil (0x10001) berarti d besar — tidak berlaku - **Wiener / Boneh-Durfee**: e kecil berarti d besar
- **Trial division** ke 10M: bersih (bukan multi-prime) - **Trial division** ke 10M: bersih
### Hint "paper search" ### Hint "paper search"
Hint eksplisit dari ch13 (`"you should use paper search mcp skill"`) mengarah ke paper akademik. Hint dari ch13 ("you should use paper search mcp skill") mengarah ke paper akademik.
Paper yang relevan: **[Wang et al., "A First Successful Factorization of RSA-2048 Integer by D-Wave Quantum Computer (TST 2024.9010028)"](https://www.sciopen.com/article/10.26599/TST.2024.9010028)**. Paper: **[Wang et al., "A First Successful Factorization of RSA-2048 Integer by D-Wave Quantum Computer (TST 2024.9010028)"](https://www.sciopen.com/article/10.26599/TST.2024.9010028)**.
Paper ini mendefinisikan **"special integer"**: `n = p·q` di mana kedua prima berbeda tepat 2 bit (`popcount(p XOR q) = 2`). Appendix Table S1 berisi 10 contoh (N, p, q) yang **menggunakan kembali prima yang sama** antar contoh — inilah "sloppiness" wave-2: modulus challenge merekonstruksi ulang dua prima dari dua contoh berbeda di appendix. Paper mendefinisikan **"special integer"**: `n = p·q` di mana kedua prima berbeda tepat 2 bit (`popcount(p XOR q) = 2`). Appendix Table S1 berisi 10 contoh (N, p, q) yang **menggunakan kembali prima yang sama** — inilah "sloppiness" wave-2: modulus challenge merekonstruksi ulang dua prima dari dua contoh berbeda.
## Solusi ## Solusi
@@ -54,16 +61,12 @@ Hitung `gcd(n, P_i)` untuk setiap prima `P_i` di 10 contoh paper:
import math import math
from Crypto.Util.number import long_to_bytes from Crypto.Util.number import long_to_bytes
n = 280088984259197676303322409340162768479248055253332178324048979479391032432289729496895136889553954879681054017549377236761031572728785368094833820151098377195413332119600135231380112995454122165424468980135704765977852529569814690639351847175244215778770376263888879859156353972612170752463744913383401062048491249958029243091765282473774483093168121753713425292265614066847042063133253723914013765258726038858443157129746991645277096281312454572347302870277064727079382216834376085631299651357Line truncated n = <2048-bit modulus from challenge>
e = 0x10001 e = 0x10001
c = 0x... # dari challenge c = <ciphertext>
# Dari appendix paper: 10 contoh, setiap contoh punya p & q # 10 contoh dari appendix paper, setiap contoh punya (p, q)
paper_examples = [ paper_examples = [...]
# (p_i, q_i) — faktor dari 10 contoh paper
...
]
for ex in paper_examples: for ex in paper_examples:
for P in (ex.p, ex.q): for P in (ex.p, ex.q):
@@ -71,7 +74,6 @@ for ex in paper_examples:
if 1 < g < n: if 1 < g < n:
p_factor = g p_factor = g
q_factor = n // g q_factor = n // g
print(f"Found factor via GCD with paper prime!")
break break
phi = (p_factor - 1) * (q_factor - 1) phi = (p_factor - 1) * (q_factor - 1)
@@ -83,4 +85,4 @@ print(long_to_bytes(flag))
## Flag ## Flag
`GEMASTIK19{test_vector_of_listP_on_quant}` `GEMASTIK19{test_vector_of_listP_on_quant}`
@@ -1,13 +1,20 @@
--- ---
title: "Julius — ROT13 Caesar Cipher" title: "Julius — ROT13 Caesar Cipher"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "crypto"]
path: "writeups/gemastik-2026-warmup/ch2-julius.md"
created_at: "2026-08-21T07:25:20.120Z"
updated_at: "2026-08-21T07:25:20.120Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Julius" challenge: "Julius — ROT13 Caesar Cipher"
category: "crypto" category: "crypto"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{caesar_r0t_th1rt33n_klasik}" flag: "GEMASTIK19{caesar_r0t_th1rt33n_klasik}"
--- ---
# Julius (500 pts) — Caesar / ROT13 # Julius (500 pts) — Caesar / ROT13
**File:** `chall.txt` → `TRZNFGVX19{pnrfne_e0g_gu1eg33a_xynfvx}` **File:** `chall.txt` → `TRZNFGVX19{pnrfne_e0g_gu1eg33a_xynfvx}`
@@ -26,4 +33,4 @@ print(f"Flag: {flag}")
## Flag ## Flag
`GEMASTIK19{caesar_r0t_th1rt33n_klasik}` `GEMASTIK19{caesar_r0t_th1rt33n_klasik}`
@@ -1,13 +1,20 @@
--- ---
title: "Needle — Strings Binary" title: "Needle — Strings Binary"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "forensics"]
path: "writeups/gemastik-2026-warmup/ch3-needle.md"
created_at: "2026-08-21T07:25:23.053Z"
updated_at: "2026-08-21T07:25:23.053Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Needle" challenge: "Needle — Strings Binary"
category: "forensics" category: "forensics"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{str1ngs_c4n_f1nd_m3}" flag: "GEMASTIK19{str1ngs_c4n_f1nd_m3}"
--- ---
# Needle (500 pts) — Steganografi / Binary # Needle (500 pts) — Steganografi / Binary
**File:** `secret.bin` (748 bytes, binary) **File:** `secret.bin` (748 bytes, binary)
@@ -21,4 +28,4 @@ strings secret.bin | grep GEMASTIK
## Flag ## Flag
`GEMASTIK19{str1ngs_c4n_f1nd_m3}` `GEMASTIK19{str1ngs_c4n_f1nd_m3}`
@@ -1,13 +1,20 @@
--- ---
title: "Say Cheese — EXIF Metadata" title: "Say Cheese — EXIF Metadata"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "forensics"]
path: "writeups/gemastik-2026-warmup/ch4-say-cheese.md"
created_at: "2026-08-21T07:25:25.953Z"
updated_at: "2026-08-21T07:25:25.953Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Say Cheese" challenge: "Say Cheese — EXIF Metadata"
category: "forensics" category: "forensics"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{h1dd3n_1n_m3tadata_exif}" flag: "GEMASTIK19{h1dd3n_1n_m3tadata_exif}"
--- ---
# Say Cheese (500 pts) — Steganografi / Metadata # Say Cheese (500 pts) — Steganografi / Metadata
**File:** `photo.jpg` **File:** `photo.jpg`
@@ -21,4 +28,4 @@ strings photo.jpg | grep GEMASTIK
## Flag ## Flag
`GEMASTIK19{h1dd3n_1n_m3tadata_exif}` `GEMASTIK19{h1dd3n_1n_m3tadata_exif}`
@@ -1,13 +1,20 @@
--- ---
title: "Nothing Here — Web Comment" title: "Nothing Here — Web Comment"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "web"]
path: "writeups/gemastik-2026-warmup/ch5-nothing-here.md"
created_at: "2026-08-21T07:25:28.880Z"
updated_at: "2026-08-21T07:25:28.880Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Nothing Here" challenge: "Nothing Here — Web Comment"
category: "web" category: "web"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{v13w_s0urc3_pahlawan}" flag: "GEMASTIK19{v13w_s0urc3_pahlawan}"
--- ---
# Nothing Here (500 pts) — Web # Nothing Here (500 pts) — Web
**URL:** `http://15.232.89.109:8001/` **URL:** `http://15.232.89.109:8001/`
@@ -26,4 +33,4 @@ curl -s http://15.232.89.109:8001/ | grep -i 'GEMASTIK\|<!--'
## Flag ## Flag
`GEMASTIK19{v13w_s0urc3_pahlawan}` `GEMASTIK19{v13w_s0urc3_pahlawan}`
@@ -1,13 +1,20 @@
--- ---
title: "Sweet Cookie — Base64 Cookie" title: "Sweet Cookie — Base64 Cookie"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "web"]
path: "writeups/gemastik-2026-warmup/ch6-sweet-cookie.md"
created_at: "2026-08-21T07:25:31.627Z"
updated_at: "2026-08-21T07:25:31.627Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Sweet Cookie" challenge: "Sweet Cookie — Base64 Cookie"
category: "web" category: "web"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{c00k13_b4s3_d3c0d3}" flag: "GEMASTIK19{c00k13_b4s3_d3c0d3}"
--- ---
# Sweet Cookie (500 pts) — Web # Sweet Cookie (500 pts) — Web
**URL:** `http://15.232.89.109:8002/` **URL:** `http://15.232.89.109:8002/`
@@ -26,4 +33,4 @@ print(decoded)
## Flag ## Flag
`GEMASTIK19{c00k13_b4s3_d3c0d3}` `GEMASTIK19{c00k13_b4s3_d3c0d3}`
@@ -1,13 +1,20 @@
--- ---
title: "Open Book — Python Source" title: "Open Book — Python Source"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "misc"]
path: "writeups/gemastik-2026-warmup/ch7-open-book.md"
created_at: "2026-08-21T07:25:34.522Z"
updated_at: "2026-08-21T07:25:34.522Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Open Book" challenge: "Open Book — Python Source"
category: "misc" category: "misc"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{pyth0n_s0urc3_t3rbuka}" flag: "GEMASTIK19{pyth0n_s0urc3_t3rbuka}"
--- ---
# Open Book (500 pts) — Misc / Source # Open Book (500 pts) — Misc / Source
**File:** `chall.py` **File:** `chall.py`
@@ -25,4 +32,4 @@ print(flag)
## Flag ## Flag
`GEMASTIK19{pyth0n_s0urc3_t3rbuka}` `GEMASTIK19{pyth0n_s0urc3_t3rbuka}`
@@ -1,13 +1,20 @@
--- ---
title: "Back and Forth — XOR" title: "Back and Forth — XOR"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "reverse"]
path: "writeups/gemastik-2026-warmup/ch8-back-and-forth.md"
created_at: "2026-08-21T07:25:37.394Z"
updated_at: "2026-08-21T07:25:37.394Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Back and Forth" challenge: "Back and Forth — XOR"
category: "reverse" category: "reverse"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{x0r_it_back_4gain}" flag: "GEMASTIK19{x0r_it_back_4gain}"
--- ---
# Back and Forth (500 pts) — Reversing / XOR # Back and Forth (500 pts) — Reversing / XOR
**File:** `chall.c` **File:** `chall.c`
@@ -26,4 +33,4 @@ print(flag)
## Flag ## Flag
`GEMASTIK19{x0r_it_back_4gain}` `GEMASTIK19{x0r_it_back_4gain}`
@@ -1,13 +1,20 @@
--- ---
title: "Are You Admin? — Buffer Overflow" title: "Are You Admin? — Buffer Overflow"
type: "writeup"
section: "writeups"
status: "published"
author: "asep"
tags: ["gemastik", "ctf", "warmup", "pwn"]
path: "writeups/gemastik-2026-warmup/ch9-are-you-admin.md"
created_at: "2026-08-21T07:25:39.978Z"
updated_at: "2026-08-21T07:25:39.978Z"
event: "GEMASTIK 2026 Warmup" event: "GEMASTIK 2026 Warmup"
challenge: "Are You Admin?" challenge: "Are You Admin? — Buffer Overflow"
category: "pwn" category: "pwn"
points: 500 points: 500
difficulty: "easy" difficulty: "easy"
flag: "GEMASTIK19{0v3rfl0w_ubah_var}" flag: "GEMASTIK19{0v3rfl0w_ubah_var}"
--- ---
# Are You Admin? (500 pts) — Pwn / Buffer Overflow # Are You Admin? (500 pts) — Pwn / Buffer Overflow
**Server:** `nc 15.232.89.109 9001` **Server:** `nc 15.232.89.109 9001`
@@ -43,4 +50,4 @@ print(s.recv(4096).decode())
## Flag ## Flag
`GEMASTIK19{0v3rfl0w_ubah_var}` `GEMASTIK19{0v3rfl0w_ubah_var}`