zenCipher

Back

FWE CTF 2025 - WriteupBlur image

CTFTime: https://ctftime.org/event/2864 โ†—

Table of Contents
CategoryNameDiff
MiscPoison AppleBeginner
Cryptobaby-cryptoBeginner
base-๐Ÿš€Easy
Revstrings jackingBeginner
No need Logical ThinkingEasy
Web Exploitregex-authBeginner
Foren/osintdatamoshBeginner
RSA Phone TreeMedium
EXITMedium
GeoGuessr1Beginner
GeoGuessr2Easy

โœจ Misc#

Poison Apple#

Description

iOSใงใฏใ‚ฆใ‚ฉใƒƒใƒใƒ‰ใƒƒใ‚ฐใ‚ฟใ‚คใƒžใŒๆ•…้šœใ—ใŸๆ™‚ใซ่ฟ”ใฃใฆใใ‚‹ไธๆ€่ญฐใช4ใƒใ‚คใƒˆใŒใ‚ใ‚‹ใ‚‰ใ—ใ„โ€ฆ ๅคงๆ–‡ๅญ—ใซใ—ใฆfwectfใงๅ›ฒใฃใฆใญ ไพ‹:1234ABCDโ†’fwectf{1234ABCD}

Apparently, there are four special bytes returned when the watchdog timer fails on iOSโ€ฆ Capitalize them and enclose them in fwectf. e.g.1234ABCDโ†’fwectf{1234ABCD}

Solve So, basically i just have to search about this challenge. Itโ€™s all about iOS special bytes that is returned when the wathcdog timer fails on it. I just found it on appleโ€™s documentation here โ†—. It said

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
txt

So, the flag is 8badf00d wrapped and capitalized. Flag:

fwectf{8BADF00D}
sh

๐Ÿ” Crypto#

baby-crypto#

Description

sjrpgs{ebg13rq_zrffntr!} Solve Just decode it with rot13 decoder like rot13.com โ†—

Flag:

fwectf{rot13ed_message!}
sh

base-๐Ÿš€#

Description

๐Ÿช›๐Ÿ”ฑ๐Ÿ›œ๐Ÿซ—๐Ÿšž๐Ÿ‘ž๐Ÿ๐ŸŽฉ๐ŸšŽ๐Ÿ’๐ŸŒฌ๐Ÿงจ๐Ÿ–ฑ๐Ÿฅš๐Ÿซ๐Ÿงถ๐Ÿช›๐Ÿ”ฑ๐Ÿ‘€๐Ÿ”ง๐Ÿšž๐Ÿ‘›๐Ÿ˜„๐ŸŽฉ๐ŸšŠ๐ŸŒก๐ŸŒฌ๐Ÿงฎ๐Ÿคฎ๐Ÿฅš๐Ÿซ๐Ÿ›ž๐Ÿช›๐Ÿ”ฑ๐Ÿ‘ฝ๐Ÿ”ง๐Ÿšž๐Ÿป๐Ÿ”ณ๐ŸŽฉ๐Ÿ˜ฅ๐Ÿชจ๐ŸŒฌ๐Ÿฉฐ๐Ÿ––๐Ÿฅš๐Ÿซ๐Ÿช๐Ÿช›๐Ÿ”ฑ๐Ÿ‘ฟ๐Ÿซ—๐Ÿšž๐Ÿต๐Ÿ“š๐ŸŽฉ๐ŸšŠ๐ŸŽ„๐ŸŒฌ๐Ÿงฏ๐Ÿ•บ๐Ÿฅš๐Ÿซ๐Ÿ“‘๐Ÿช›๐Ÿ”ฐ๐Ÿ€๐Ÿซ—๐Ÿšž๐Ÿ’ฟ๐Ÿ”ณ๐ŸŽฉ๐Ÿšฒ๐ŸšŸ๐ŸŒฌ๐Ÿงฒ๐Ÿšฏ๐Ÿฅš๐Ÿซ๐Ÿšฐ๐Ÿช›๐Ÿ”ฑ๐Ÿ’€๐Ÿ”ง๐Ÿšž๐Ÿ“๐Ÿ›ผ๐ŸŽฉ๐Ÿšฟ๐Ÿชป๐ŸŒฌ๐Ÿงช๐Ÿ™Š๐Ÿฅš๐Ÿซ๐Ÿงข๐Ÿช›๐Ÿ”ฑ๐Ÿ›Ÿ๐Ÿ”ง๐Ÿšž๐Ÿš‹๐Ÿซณ๐ŸŽฉ๐Ÿ˜†๐Ÿ‰๐ŸŒฌ๐Ÿงถ๐Ÿš“๐Ÿฅš๐Ÿซ…๐Ÿ’›๐Ÿช›๐Ÿ”ฑ๐Ÿ”Œ๐Ÿƒ๐Ÿšž๐Ÿ‹๐Ÿฅ๐ŸŽฉ๐Ÿ˜ฑ๐Ÿคฎ๐ŸŒฌ๐Ÿฉฐ๐Ÿ›ณ๐Ÿฅš๐Ÿซ€๐Ÿ“๐Ÿช›๐Ÿ”ฐ๐Ÿฝ๐Ÿซ—๐Ÿšž๐Ÿ’ฟ๐Ÿ๐ŸŽฉ๐ŸšŠ๐ŸŒ‹๐ŸŒฌ๐Ÿงต๐Ÿ”ท๐Ÿš€๐Ÿš€๐Ÿš€

Solve So, i got the chall.py and emoji.txt

chall.py
#!/usr/bin/env python๐Ÿš€

with open('emoji.txt', 'r', encoding='utf-8') as f:
    emoji = list(f.read().strip())

table = {i: ch for i, ch in enumerate(emoji)}

def encode(data):
    bits = ''.join(f'{b:08b}' for b in data)
    pad = (-len(bits)) % 10
    bits += '0' * pad
    out = [table[int(bits[i:i+10], 2)] for i in range(0, len(bits), 10)]
    r = (-len(out)) % 4
    if r:
        out.extend('๐Ÿš€' * r)
    return ''.join(out)

if __name__ == '__main__':
    msg = 'Hello!'
    enc = encode(msg.encode())
    print('msg:', msg)
    print('enc:', enc)
python
emoji.txt
โญโญ•๐Ÿ€„๐Ÿƒ๐ŸŒ€๐ŸŒ๐ŸŒ‚๐ŸŒƒ๐ŸŒ„๐ŸŒ…๐ŸŒ†๐ŸŒ‡๐ŸŒˆ๐ŸŒ‰๐ŸŒŠ๐ŸŒ‹๐ŸŒŒ๐ŸŒ๐ŸŒ๐ŸŒ‘๐ŸŒ“๐ŸŒ•๐ŸŒ—๐ŸŒ™๐ŸŒš๐ŸŒ›๐ŸŒœ๐ŸŒ๐ŸŒž๐ŸŒŸ๐ŸŒ ๐ŸŒก๐ŸŒค๐ŸŒฅ๐ŸŒฆ๐ŸŒง๐ŸŒจ๐ŸŒฉ๐ŸŒช๐ŸŒฌ๐ŸŒญ๐ŸŒฎ๐ŸŒฏ๐ŸŒฐ๐ŸŒฑ๐ŸŒฒ๐ŸŒณ๐ŸŒด๐ŸŒต๐ŸŒถ๐ŸŒท๐ŸŒธ๐ŸŒน๐ŸŒบ๐ŸŒป๐ŸŒผ๐ŸŒฝ๐ŸŒพ๐ŸŒฟ๐Ÿ€๐Ÿ๐Ÿ‚๐Ÿƒ๐Ÿ„๐Ÿ…๐Ÿ†๐Ÿ‡๐Ÿˆ๐Ÿ‰๐ŸŠ๐Ÿ‹๐ŸŒ๐Ÿ๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ๐ŸŽ€๐ŸŽ๐ŸŽ‚๐ŸŽƒ๐ŸŽ„๐ŸŽ…๐ŸŽ†๐ŸŽ‡๐ŸŽˆ๐ŸŽ‰๐ŸŽŠ๐ŸŽ‹๐ŸŽŒ๐ŸŽ๐ŸŽŽ๐ŸŽ๐ŸŽ๐ŸŽ‘๐ŸŽ’๐ŸŽ“๐ŸŽ–๐ŸŽ—๐ŸŽ™๐ŸŽš๐ŸŽ›๐ŸŽž๐ŸŽŸ๐ŸŽ ๐ŸŽก๐ŸŽข๐ŸŽฃ๐ŸŽค๐ŸŽฅ๐ŸŽฆ๐ŸŽง๐ŸŽจ๐ŸŽฉ๐ŸŽช๐ŸŽซ๐ŸŽฌ๐ŸŽญ๐ŸŽฎ๐ŸŽฏ๐ŸŽฐ๐ŸŽฑ๐ŸŽฒ๐ŸŽณ๐ŸŽด๐ŸŽต๐ŸŽถ๐ŸŽท๐ŸŽธ๐ŸŽน๐ŸŽบ๐ŸŽป๐ŸŽผ๐ŸŽฝ๐ŸŽพ๐ŸŽฟ๐Ÿ€๐Ÿ๐Ÿ‚๐Ÿƒ๐Ÿ„๐Ÿ…๐Ÿ†๐Ÿ‡๐Ÿˆ๐Ÿ‰๐ŸŠ๐Ÿ‹๐ŸŒ๐Ÿ๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿช๐Ÿซ๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿณ๐Ÿด๐Ÿต๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿ€๐Ÿ๐Ÿ‚๐Ÿƒ๐Ÿ„๐Ÿ…๐Ÿ†๐Ÿ‡๐Ÿˆ๐Ÿ‰๐ŸŠ๐Ÿ‹๐ŸŒ๐Ÿ๐ŸŽ๐Ÿ๐Ÿ๐Ÿ‘๐Ÿ’๐Ÿ“๐Ÿ”๐Ÿ•๐Ÿ–๐Ÿ—๐Ÿ˜๐Ÿ™๐Ÿš๐Ÿ›๐Ÿœ๐Ÿ๐Ÿž๐ŸŸ๐Ÿ ๐Ÿก๐Ÿข๐Ÿฃ๐Ÿค๐Ÿฅ๐Ÿฆ๐Ÿง๐Ÿจ๐Ÿฉ๐Ÿช๐Ÿซ๐Ÿฌ๐Ÿญ๐Ÿฎ๐Ÿฏ๐Ÿฐ๐Ÿฑ๐Ÿฒ๐Ÿณ๐Ÿด๐Ÿต๐Ÿถ๐Ÿท๐Ÿธ๐Ÿน๐Ÿบ๐Ÿป๐Ÿผ๐Ÿฝ๐Ÿพ๐Ÿฟ๐Ÿ‘€๐Ÿ‘๐Ÿ‘‚๐Ÿ‘ƒ๐Ÿ‘„๐Ÿ‘…๐Ÿ‘†๐Ÿ‘‡๐Ÿ‘ˆ๐Ÿ‘‰๐Ÿ‘Š๐Ÿ‘‹๐Ÿ‘Œ๐Ÿ‘๐Ÿ‘Ž๐Ÿ‘๐Ÿ‘๐Ÿ‘‘๐Ÿ‘’๐Ÿ‘“๐Ÿ‘”๐Ÿ‘•๐Ÿ‘–๐Ÿ‘—๐Ÿ‘˜๐Ÿ‘™๐Ÿ‘š๐Ÿ‘›๐Ÿ‘œ๐Ÿ‘๐Ÿ‘ž๐Ÿ‘Ÿ๐Ÿ‘ ๐Ÿ‘ก๐Ÿ‘ข๐Ÿ‘ฃ๐Ÿ‘ค๐Ÿ‘ฅ๐Ÿ‘ฆ๐Ÿ‘ง๐Ÿ‘จ๐Ÿ‘ฉ๐Ÿ‘ช๐Ÿ‘ซ๐Ÿ‘ฌ๐Ÿ‘ญ๐Ÿ‘ฎ๐Ÿ‘ฏ๐Ÿ‘ฐ๐Ÿ‘ฑ๐Ÿ‘ฒ๐Ÿ‘ณ๐Ÿ‘ด๐Ÿ‘ต๐Ÿ‘ถ๐Ÿ‘ท๐Ÿ‘ธ๐Ÿ‘น๐Ÿ‘บ๐Ÿ‘ป๐Ÿ‘ผ๐Ÿ‘ฝ๐Ÿ‘พ๐Ÿ‘ฟ๐Ÿ’€๐Ÿ’๐Ÿ’‚๐Ÿ’ƒ๐Ÿ’„๐Ÿ’…๐Ÿ’†๐Ÿ’‡๐Ÿ’ˆ๐Ÿ’‰๐Ÿ’Š๐Ÿ’‹๐Ÿ’Œ๐Ÿ’๐Ÿ’Ž๐Ÿ’๐Ÿ’๐Ÿ’‘๐Ÿ’’๐Ÿ’”๐Ÿ’•๐Ÿ’–๐Ÿ’˜๐Ÿ’™๐Ÿ’š๐Ÿ’›๐Ÿ’œ๐Ÿ’๐Ÿ’ž๐Ÿ’Ÿ๐Ÿ’ ๐Ÿ’ก๐Ÿ’ข๐Ÿ’ฃ๐Ÿ’ค๐Ÿ’ฅ๐Ÿ’ฆ๐Ÿ’ง๐Ÿ’จ๐Ÿ’ฉ๐Ÿ’ช๐Ÿ’ซ๐Ÿ’ฌ๐Ÿ’ญ๐Ÿ’ฎ๐Ÿ’ฏ๐Ÿ’ฐ๐Ÿ’ณ๐Ÿ’ด๐Ÿ’ต๐Ÿ’ถ๐Ÿ’ท๐Ÿ’ธ๐Ÿ’น๐Ÿ’บ๐Ÿ’ป๐Ÿ’ผ๐Ÿ’ฝ๐Ÿ’พ๐Ÿ’ฟ๐Ÿ“€๐Ÿ“…๐Ÿ“†๐Ÿ“‡๐Ÿ“ˆ๐Ÿ“‰๐Ÿ“Š๐Ÿ“‹๐Ÿ“Œ๐Ÿ“๐Ÿ“Ž๐Ÿ“๐Ÿ“๐Ÿ“‘๐Ÿ“’๐Ÿ““๐Ÿ“”๐Ÿ“•๐Ÿ“–๐Ÿ“š๐Ÿ“›๐Ÿ“œ๐Ÿ“๐Ÿ“ž๐Ÿ“Ÿ๐Ÿ“ ๐Ÿ“ก๐Ÿ“ข๐Ÿ“ฃ๐Ÿ“ฆ๐Ÿ“ง๐Ÿ“จ๐Ÿ“ช๐Ÿ“ฎ๐Ÿ“ฏ๐Ÿ“ฐ๐Ÿ“ฑ๐Ÿ“ฒ๐Ÿ“ต๐Ÿ“ถ๐Ÿ“ท๐Ÿ“ธ๐Ÿ“น๐Ÿ“บ๐Ÿ“ป๐Ÿ“ผ๐Ÿ“ฝ๐Ÿ“ฟ๐Ÿ”…๐Ÿ”†๐Ÿ”‡๐Ÿ”ˆ๐Ÿ”‰๐Ÿ”Š๐Ÿ”‹๐Ÿ”Œ๐Ÿ”๐Ÿ”Ž๐Ÿ”๐Ÿ”๐Ÿ”‘๐Ÿ”’๐Ÿ”“๐Ÿ””๐Ÿ”•๐Ÿ”–๐Ÿ”—๐Ÿ”˜๐Ÿ”ž๐Ÿ”ฅ๐Ÿ”ฆ๐Ÿ”ง๐Ÿ”จ๐Ÿ”ฉ๐Ÿ”ช๐Ÿ”ซ๐Ÿ”ฌ๐Ÿ”ญ๐Ÿ”ฎ๐Ÿ”ฏ๐Ÿ”ฐ๐Ÿ”ฑ๐Ÿ”ฒ๐Ÿ”ณ๐Ÿ”ด๐Ÿ”ต๐Ÿ”ถ๐Ÿ”ท๐Ÿ”ธ๐Ÿ”น๐Ÿ”บ๐Ÿ”ป๐Ÿ”ผ๐Ÿ”ฝ๐Ÿ•‰๐Ÿ•Š๐Ÿ•‹๐Ÿ•Œ๐Ÿ•๐Ÿ•Ž๐Ÿ•๐Ÿ•ฏ๐Ÿ•ฐ๐Ÿ•ณ๐Ÿ•ด๐Ÿ•ต๐Ÿ•ถ๐Ÿ•ท๐Ÿ•ธ๐Ÿ•น๐Ÿ•บ๐Ÿ–‡๐Ÿ–Š๐Ÿ–‹๐Ÿ–Œ๐Ÿ–๐Ÿ–๐Ÿ–•๐Ÿ––๐Ÿ–ค๐Ÿ–ฅ๐Ÿ–จ๐Ÿ–ฑ๐Ÿ–ฒ๐Ÿ–ผ๐Ÿ—‚๐Ÿ—ƒ๐Ÿ—„๐Ÿ—‘๐Ÿ—’๐Ÿ—“๐Ÿ—œ๐Ÿ—๐Ÿ—ž๐Ÿ—ก๐Ÿ—ฃ๐Ÿ—จ๐Ÿ—ฏ๐Ÿ—ณ๐Ÿ—บ๐Ÿ—ป๐Ÿ—ผ๐Ÿ—ฝ๐Ÿ—พ๐Ÿ—ฟ๐Ÿ˜‚๐Ÿ˜ƒ๐Ÿ˜„๐Ÿ˜…๐Ÿ˜†๐Ÿ˜‡๐Ÿ˜ˆ๐Ÿ˜Š๐Ÿ˜๐Ÿ˜Ž๐Ÿ˜๐Ÿ˜“๐Ÿ˜˜๐Ÿ˜œ๐Ÿ˜ก๐Ÿ˜ข๐Ÿ˜ฅ๐Ÿ˜จ๐Ÿ˜ช๐Ÿ˜ซ๐Ÿ˜ฌ๐Ÿ˜ญ๐Ÿ˜ฎ๐Ÿ˜ฐ๐Ÿ˜ฑ๐Ÿ˜ณ๐Ÿ˜ต๐Ÿ™„๐Ÿ™…๐Ÿ™†๐Ÿ™‡๐Ÿ™ˆ๐Ÿ™‰๐Ÿ™Š๐Ÿ™‹๐Ÿ™Œ๐Ÿ™๐Ÿ™Ž๐Ÿ™๐Ÿš๐Ÿš‚๐Ÿšƒ๐Ÿš„๐Ÿš…๐Ÿš†๐Ÿš‡๐Ÿšˆ๐Ÿš‰๐ŸšŠ๐Ÿš‹๐ŸšŒ๐Ÿš๐ŸšŽ๐Ÿš๐Ÿš๐Ÿš‘๐Ÿš’๐Ÿš“๐Ÿš”๐Ÿš•๐Ÿš–๐Ÿš—๐Ÿš˜๐Ÿš™๐Ÿšš๐Ÿš›๐Ÿšœ๐Ÿš๐Ÿšž๐ŸšŸ๐Ÿš ๐Ÿšก๐Ÿšข๐Ÿšฃ๐Ÿšค๐Ÿšฅ๐Ÿšฆ๐Ÿšง๐Ÿšจ๐Ÿšฉ๐Ÿšช๐Ÿšซ๐Ÿšฌ๐Ÿšญ๐Ÿšฎ๐Ÿšฏ๐Ÿšฐ๐Ÿšฑ๐Ÿšฒ๐Ÿšณ๐Ÿšด๐Ÿšต๐Ÿšถ๐Ÿšท๐Ÿšธ๐Ÿšฝ๐Ÿšฟ๐Ÿ›€๐Ÿ›๐Ÿ›Œ๐Ÿ›๐Ÿ›Ž๐Ÿ›๐Ÿ›๐Ÿ›‘๐Ÿ›’๐Ÿ›•๐Ÿ›–๐Ÿ›œ๐Ÿ›๐Ÿ›ž๐Ÿ›Ÿ๐Ÿ› ๐Ÿ›ก๐Ÿ›ฃ๐Ÿ›ค๐Ÿ›ฅ๐Ÿ›ฉ๐Ÿ›ซ๐Ÿ›ฌ๐Ÿ›ฐ๐Ÿ›ณ๐Ÿ›ด๐Ÿ›ต๐Ÿ›ถ๐Ÿ›ท๐Ÿ›ธ๐Ÿ›น๐Ÿ›บ๐Ÿ›ป๐Ÿ›ผ๐ŸŸ ๐ŸŸก๐ŸŸข๐ŸŸฃ๐ŸŸค๐ŸŸฅ๐ŸŸฆ๐ŸŸง๐ŸŸจ๐ŸคŒ๐Ÿค๐Ÿค๐Ÿค‘๐Ÿค’๐Ÿค”๐Ÿค•๐Ÿค–๐Ÿค—๐Ÿค˜๐Ÿค™๐Ÿคš๐Ÿค›๐Ÿค๐Ÿคž๐ŸคŸ๐Ÿค ๐Ÿคก๐Ÿคข๐Ÿคฃ๐Ÿคฆ๐Ÿคง๐Ÿคฉ๐Ÿคช๐Ÿคฌ๐Ÿคฎ๐Ÿคฏ๐Ÿคฐ๐Ÿคฑ๐Ÿคฒ๐Ÿคณ๐Ÿคด๐Ÿคต๐Ÿคถ๐Ÿคท๐Ÿคธ๐Ÿคน๐Ÿคบ๐Ÿคผ๐Ÿคฝ๐Ÿคพ๐Ÿคฟ๐Ÿฅ€๐Ÿฅ๐Ÿฅ‚๐Ÿฅƒ๐Ÿฅ„๐Ÿฅ…๐Ÿฅ‡๐Ÿฅˆ๐Ÿฅ‰๐ŸฅŠ๐Ÿฅ‹๐ŸฅŒ๐Ÿฅ๐ŸฅŽ๐Ÿฅ๐Ÿฅ๐Ÿฅ‘๐Ÿฅ’๐Ÿฅ“๐Ÿฅ”๐Ÿฅ•๐Ÿฅ–๐Ÿฅ—๐Ÿฅ˜๐Ÿฅ™๐Ÿฅš๐Ÿฅ›๐Ÿฅœ๐Ÿฅ๐Ÿฅž๐ŸฅŸ๐Ÿฅ ๐Ÿฅก๐Ÿฅข๐Ÿฅฃ๐Ÿฅค๐Ÿฅฅ๐Ÿฅฆ๐Ÿฅง๐Ÿฅจ๐Ÿฅฉ๐Ÿฅช๐Ÿฅซ๐Ÿฅฌ๐Ÿฅญ๐Ÿฅฎ๐Ÿฅฏ๐Ÿฅฐ๐Ÿฅฒ๐Ÿฅณ๐Ÿฅด๐Ÿฅต๐Ÿฅถ๐Ÿฅท๐Ÿฅธ๐Ÿฅน๐Ÿฅบ๐Ÿฅป๐Ÿฅผ๐Ÿฅฝ๐Ÿฅพ๐Ÿฅฟ๐Ÿฆ€๐Ÿฆ๐Ÿฆ‚๐Ÿฆƒ๐Ÿฆ„๐Ÿฆ…๐Ÿฆ†๐Ÿฆ‡๐Ÿฆˆ๐Ÿฆ‰๐ŸฆŠ๐Ÿฆ‹๐ŸฆŒ๐Ÿฆ๐ŸฆŽ๐Ÿฆ๐Ÿฆ๐Ÿฆ‘๐Ÿฆ’๐Ÿฆ“๐Ÿฆ”๐Ÿฆ•๐Ÿฆ–๐Ÿฆ—๐Ÿฆ˜๐Ÿฆ™๐Ÿฆš๐Ÿฆ›๐Ÿฆœ๐Ÿฆ๐Ÿฆž๐ŸฆŸ๐Ÿฆ ๐Ÿฆก๐Ÿฆข๐Ÿฆฃ๐Ÿฆค๐Ÿฆฅ๐Ÿฆฆ๐Ÿฆง๐Ÿฆจ๐Ÿฆฉ๐Ÿฆช๐Ÿฆซ๐Ÿฆฌ๐Ÿฆญ๐Ÿฆฎ๐Ÿฆฏ๐Ÿฆฐ๐Ÿฆฑ๐Ÿฆฒ๐Ÿฆณ๐Ÿฆด๐Ÿฆต๐Ÿฆถ๐Ÿฆท๐Ÿฆธ๐Ÿฆน๐Ÿฆบ๐Ÿฆป๐Ÿฆผ๐Ÿฆฝ๐Ÿฆพ๐Ÿฆฟ๐Ÿง€๐Ÿง๐Ÿง‚๐Ÿงƒ๐Ÿง„๐Ÿง…๐Ÿง†๐Ÿง‡๐Ÿงˆ๐Ÿง‰๐ŸงŠ๐Ÿง‹๐Ÿง•๐Ÿง–๐Ÿง—๐Ÿง˜๐Ÿง™๐Ÿงš๐Ÿง›๐Ÿงœ๐Ÿง๐Ÿงž๐ŸงŸ๐Ÿง ๐Ÿงก๐Ÿงข๐Ÿงฃ๐Ÿงค๐Ÿงฅ๐Ÿงฆ๐Ÿงง๐Ÿงจ๐Ÿงฉ๐Ÿงช๐Ÿงซ๐Ÿงฌ๐Ÿงญ๐Ÿงฎ๐Ÿงฏ๐Ÿงฐ๐Ÿงฑ๐Ÿงฒ๐Ÿงณ๐Ÿงด๐Ÿงต๐Ÿงถ๐Ÿงท๐Ÿงธ๐Ÿงน๐Ÿงบ๐Ÿงป๐Ÿงผ๐Ÿงฝ๐Ÿงพ๐Ÿงฟ๐Ÿฉฐ๐Ÿฉฑ๐Ÿฉฒ๐Ÿฉณ๐Ÿฉด๐Ÿฉน๐Ÿฉบ๐Ÿฉป๐Ÿฉผ๐Ÿช€๐Ÿช๐Ÿช‚๐Ÿชƒ๐Ÿช„๐Ÿช…๐Ÿช†๐Ÿช‡๐Ÿชˆ๐Ÿช๐Ÿช‘๐Ÿช’๐Ÿช“๐Ÿช”๐Ÿช•๐Ÿช–๐Ÿช—๐Ÿช˜๐Ÿช™๐Ÿชš๐Ÿช›๐Ÿชœ๐Ÿช๐Ÿชž๐ŸชŸ๐Ÿช ๐Ÿชก๐Ÿชข๐Ÿชฃ๐Ÿชค๐Ÿชฅ๐Ÿชฆ๐Ÿชง๐Ÿชจ๐Ÿชฉ๐Ÿชช๐Ÿชซ๐Ÿชฌ๐Ÿชญ๐Ÿชฎ๐Ÿชฏ๐Ÿชฑ๐Ÿชด๐Ÿชต๐Ÿชถ๐Ÿชท๐Ÿชธ๐Ÿชน๐Ÿชบ๐Ÿชป๐Ÿชผ๐Ÿชฝ๐Ÿชฟ๐Ÿซ€๐Ÿซ๐Ÿซ‚๐Ÿซ…๐ŸซŽ๐Ÿซ๐Ÿซ๐Ÿซ‘๐Ÿซ’๐Ÿซ“๐Ÿซ”๐Ÿซ•๐Ÿซ–๐Ÿซ—๐Ÿซ˜๐Ÿซ™๐Ÿซš๐Ÿซ›๐Ÿซ ๐Ÿซก๐Ÿซฆ๐Ÿซง๐Ÿซฐ๐Ÿซฑ๐Ÿซฒ๐Ÿซณ๐Ÿซต๐Ÿซถ๐Ÿซท
txt

The challenge uses a custom emoji-based encoding scheme, inspired by Base64.

  1. Convert to bits
    Each character of the input message is converted to its ASCII value, then represented as an 8-bit binary string.

  2. Group into 10-bit chunks
    The binary stream is padded with zeros until its length is divisible by 10.
    Every 10-bit chunk is then interpreted as an integer.

  3. Map integer โ†’ emoji
    Each integer is used as an index into a large emoji table (emoji.txt).
    Example: 0000001010 (decimal 10) โ†’ 10th emoji in the table.

  4. Padding with ๐Ÿš€
    If the total length of encoded emojis is not a multiple of 4, extra ๐Ÿš€ characters are added (similar to = padding in Base64).

Decoding Process

  • Remove ๐Ÿš€ padding.
  • Convert each emoji back to its corresponding index.
  • Convert the index into a 10-bit binary string.
  • Concatenate all 10-bit chunks and split into 8-bit segments.
  • Convert the 8-bit values back into ASCII characters.

Summary In short:

8-bit ASCII โ†’ 10-bit chunks โ†’ emoji table โ†’ encoded string (with ๐Ÿš€ padding)
The reverse process recovers the original message.

Okay, hereโ€™s my decode script.

decoder.py
#!/usr/bin/env python3
# decoder untuk chall.py

with open('emoji.txt', 'r', encoding='utf-8') as f:
    emoji = list(f.read().strip())

table = {i: ch for i, ch in enumerate(emoji)}
rev_table = {ch: i for i, ch in enumerate(emoji)}

def decode(enc):
    # buang padding ๐Ÿš€
    enc = enc.rstrip("๐Ÿš€")
    # ambil index dari tiap emoji
    nums = [rev_table[ch] for ch in enc]
    # convert ke biner 10-bit
    bits = ''.join(f'{n:010b}' for n in nums)
    # ambil per 8-bit
    out = []
    for i in range(0, len(bits), 8):
        byte = bits[i:i+8]
        if len(byte) < 8:
            break
        out.append(int(byte, 2))
    return bytes(out).decode(errors="ignore")

if __name__ == "__main__":
    from chall import encode
    msg = "Hello!"
    enc = encode(msg.encode())
    dec = decode(enc)
    print("enc:", enc)
    print("dec:", dec)
python
main.py
from chall import encode  # from chall.py
from decoder import decode  # decoder that i've created

enc_data = "๐Ÿช›๐Ÿ”ฐ๐Ÿ›๐Ÿˆ๐Ÿ“›๐Ÿคต๐Ÿ”ˆ๐Ÿš๐Ÿ“ท๐Ÿฆจ๐Ÿฅฉ๐Ÿ’‡๐Ÿ’ผ๐Ÿฅ‡๐Ÿงท๐Ÿฅณ๐ŸŽ†๐Ÿš‡๐Ÿ”…๐Ÿ‘ถ๐Ÿ“ท๐Ÿš‡๐Ÿคง๐Ÿ—ฃ๐Ÿ’๐Ÿฅต๐ŸŒš๐Ÿฆฝ๐Ÿ–๐Ÿง‡๐Ÿชฅ๐Ÿฆฟ๐Ÿ‹๐Ÿ›œ๐Ÿ™†๐Ÿง€๐Ÿ‹๐Ÿ”ญ๐Ÿฅฌ๐Ÿฒ๐Ÿ”ซ๐Ÿš€๐Ÿš€๐Ÿš€"
decoded = decode(enc_data)
print(decoded)
python

Flag:

fwectf{n0_r0ck37_3m0ji_n0_llm}
sh

๐Ÿ”€ Reverese Engineering#

strings jacking#

Description

ๅˆๅฟƒ่€…ๅ‘ใ‘ใฎใƒชใƒใƒผใ‚นใ‚จใƒณใ‚ธใƒ‹ใ‚ขใƒชใƒณใ‚ฐ๏ผ้ ‘ๅผตใฃใฆ๏ผ

Solve I donโ€™t know what was the description meaning, but from the challโ€™s name, we know itโ€™s about strings command on linux. Just try to use this command, and i got the flag.

strings strings_jacking
sh

![ss gambar] Flag:

fwectf{5tr1n65_30F_p4ss937_0011}
sh

No need Logical Thinking#

Description

่ซ–็†็š„ๆ€่€ƒใฏใฉใ‚“ใช็‰ฉไบ‹ใซใ‚‚ๅฟ…่ฆใ€‚

Logical Thiniking is need for everything.

Solve So, i got the challenge.pl which is written in perl language.

challenge.pl
process_flag(FileName) :-
    open(FileName, read, Stream),
    read_string(Stream, _, Content),
    close(Stream),
    string_codes(Content, Codes),
    transform_codes(Codes, 1, Transformed),
    string_codes(NewString, Transformed),
    writeln(NewString).
transform_codes([], _, []).
transform_codes([H|T], Index, [NewH|NewT]) :-
    NewH is H + Index,
    NextIndex is Index + 1,
    transform_codes(T, NextIndex, NewT).
%EXECUTE
%?- process_flag('flag.txt').
perl

When opening the challenge, I saw a Prolog file Challenge.pl and an encrypted output output.txt. The Prolog code defined a simple transformation: each character of the flag was converted to its ASCII code, then the index of that character (starting from 1) was added. In other words, the first character is shifted by +1, the second by +2, the third by +3, and so on.

![gambar ss cat .pl and output]

Naturally, to reverse this, I just need to subtract the index from each character instead of adding it. However, when I tried to decode output.txt, the result was messy, full of strange symbols like ยป, ยค, ยข. At first it looked like the algorithm was wrong, but after checking the raw hex with xxd, I realized the problem came from the way Prolog wrote the file. Characters above 0x7F were encoded as multi-byte UTF-8 sequences, which introduced extra 0xC2 bytes into the output.

The fix was simple: read the file as raw bytes and strip out the 0xC2 artifacts before applying the reverse transformation. Then, for each byte, subtract its index and rebuild the string.

solver.py
with open("output.txt", "rb") as f:
    data = f.read()

# Buang semua 0xC2 yang jadi artefak UTF-8
clean = data.replace(b'\xc2', b'')

result = []
for i, b in enumerate(clean, start=1):
    result.append(chr((b - i) % 256))

flag = "".join(result)
print(flag)
python

With this adjustment, the decrypted text gave me a clean flag in the expected format: Flag:

fwectf{the_Pr010g_10gica1_Languag3!}
sh

FWE CTF 2025 - Writeup
https://zenc.my.id/blog/fwe-ctf-2025
Author Abi Abdillah
Published at September 1, 2025