Skip to main content
FAZer0
←cd ../writeups
cryptohard
🏆 600 PTS

GEMASTIK XIX 2026 - CTF Penyisihan Official Writeup

Penyisihan GEMASTIK XIX 2026 writeup covering custom binary token decoding (common-encoding), discrete logs, memory triage, and bitmap reverse engineering.

EventGEMASTIK XIX (Penyisihan 2026)
PublishedAugust 21, 2026
Estimated Read2 min read
ToolsPython 3, SageMath, Wireshark, Ghidra, Volatilty

1. Overview & Team

Event: GEMASTIK XIX (Penyisihan Keamanan Siber 2026)
Date: 21 Agustus 2026
Team: POROS La Haula wa la quwwata Illa Billah (FAZer0, Araahi, Phya)


2. Crypto: common-encoding (100 pts)

Challenge Analysis

Given an encoded string constructed from tokens containing combinations of S, O, H, D, W, Z:

SOOHOHHDWOOHOOODWOOHOHHDWOOHOHODWOOHOHHDWOOHHOHHDWOOHOHHDWOOHHHODWOOHOHODWO...

By analyzing frequency distribution and character patterns:

  • Characters S and Z mark the start and end of the payload stream.
  • D and W act as delimiter tokens between encoded character blocks.
  • H represents bit 0 and O represents bit 1 (Inverted Binary).

Python Solver

cipher = "SOOHOHHDWOOHOOODWOOHOHHDWOOHOHODWOOHOHHDWOOHHOHHDWOOHOHHDWOOHHHODWOOHOHODWOOHHOODWOOHOHODWOOHOHHDWOOHOHHDWOOOHHODWOOHOHHDWOOHHHOHDWOOHHOODWOOHHHODWOOHHOODWOOOHHODWOOHOOODWOOHHHOHDWOOHOHODWOOHOHHDWOOHOHODWOOHOHODWOOHOHODWOOHOHHDWOOHOHHDWOOHHOOHDWOOHOHODWOOHHOHDWOOHHOHDWOOHHHODWOOHHOHDWOOHHHODWOOHOHODWOOHHOOHDWOOHOOODWOOHHOODWOOHOOODWOOHOHODWOOHOOHDWOOHHOHDWOOHOOHDWOOHHOHHDWOOHOOHDWOOOHHODWOOHOOODWOOHOHHDWOOHHOHDWOOHHOHHDWOOHOOHDWOOHHOODWOOHOOODWOOHHOHDWOOHOOODWOOOHHODWOOHOOODWOOHHHHDWOOHOOODWOOHOHHDWOOHOOHDWOOHHOOHDWOOHHOHDWOOHHOHHDWOOHOOHDWOOHOOHDWOOHOOHDWOOHHHOODWOOHOOHDWOOHHHODWOOHOOHDWOOHOOODWOOHOHODWOOHHOOHDWOOHOHHDWOOHOHHDWOOHHOODWOOHHHHDWOOHOOHDWOOHHOHODWOOHOOHDWOOHOOODWOOHOOODWOOHHOHHZ"

clean = cipher.strip("SZ")
blocks = [b.replace('W', '') for b in clean.split('D') if b]
result_chars = []

for b in blocks:
    inverted_bits = b.replace('H', '0').replace('O', '1')
    padded = inverted_bits.zfill(8)
    val = int(padded, 2)
    if 32 <= val <= 126:
        result_chars.append(chr(val))

flag_content = "".join(result_chars).replace(" ", "")
print(f"[+] Recovered Flag: GEMASTIK19{{{flag_content}}}")
ℹ️common-encoding Flag
Challenge Flag
Click to Decrypt

3. Reverse Engineering: Dot Matrix (100 pts)

The binary simulates a LED dot matrix display board. Binary analysis using Ghidra reveals memory mapping where pixel raster buffers are stored as row-wise byte bitmasks. De-rasterizing the dynamic frame buffers extracts the ASCII glyph rendering of the flag.