Vector Attack

12 Jan 2026

SCPCTF 2025 Challenge: Vector Attack
Category: OSINT
Flag: scpctf{A_Sh0rt_G00s3_Ch4s3}


This challenge started with a RAR file, which had a video in it.

The circles and rectangled looked like morse code, so after slowing down a ton, I mapped frames with the circle as “.” and frames with the rectagle as “-“, using the completely black frames as seperators. This resulted in “-.-. - ..-. ….. .-.-.- .– — .-. -.. .–. .-. . … … .-.-.- -.-. — –”, which when decoded gave “CTF5.WORDPRESS.COM”.

The website was an article, which included an image of an AI-generated rat and a hint that “Everything you need is already in the picture.”

I decided to download the image, but after running some basic steg and not finding anything significant, I returned to the website. This time, after messing with the source code for a bit I found that the image was from Github.

Searching up the Github account and repository gave https://github.com/The-Real-Entity/Attack-Vector. The repo also contained snowyclues.rar, and after opening that I found diamond.png, which was just ordinary text but with a png file extention.

The text read “c2ysVNG6W6QhGPPhhqYWCY1”. Dcode identified that it was base58, and decoded it into “@GabrielXEntity”. From there, using IDCrawl I found the twitter profile https://x.com/GabrielXEntity.

The accound had one post,

After plugging the string “jvvrq8–rcqvg`kl,amo-xQGjulLZ” into Dcode’s cipher identifier once again, I found that it was a variant of ASCII shift.

These ASCII shift encoding methods -2 and +2 combined together roughly gave “https://pastebin.com/”, and I figured that the eight digit pastebin code was also a combination of those two.

Since there was no concrete pattern I could see from the first half of the url (+2,+2,+2,+2,-2,-2,-2,-2,+2,+2,-2,+2,+2,-2,+2,-2,-2,-2,-2,+2), I decided to bruteforce the second portion.

I used this script to bruteforce,

#!/usr/bin/env python3
import re
import string
import requests

s1 = "lxxts://tesxibmn.coq/zSIlwnN\\"
s2 = "httpo6++paote^ij*_km+vOEhsjJX"

# ---- CONFIG ----
ALLOWED = string.ascii_letters + string.digits + ":/.?-_"
ID_LEN = 8
TIMEOUT = 4
# ----------------

# pad for alignment
L = max(len(s1), len(s2))
s1 = s1.ljust(L)
s2 = s2.ljust(L)

pattern = re.compile(r"https?://pastebin\.com/([A-Za-z0-9]{%d})" % ID_LEN)

results = set()

def dfs(i, buf):
    if i == L:
        text = "".join(buf)
        m = pattern.search(text)
        if m:
            url = m.group(0)
            if url not in results:
                try:
                    r = requests.get(url, timeout=TIMEOUT)
                    if r.status_code != 404:
                        print("[+] VALID:", url)
                        results.add(url)
                    else:
                        print("[-] 404 :", url)
                except Exception as e:
                    print("[!] Error checking", url, e)
        return

    opts = []
    if s1[i] in ALLOWED:
        opts.append(s1[i])
    if s2[i] in ALLOWED and s2[i] != s1[i]:
        opts.append(s2[i])

    if not opts:
        dfs(i+1, buf)
        return

    for o in opts:
        buf.append(o)
        dfs(i+1, buf)
        buf.pop()

dfs(0, [])

print("\nFinal valid URLs:")
if results:
    for u in results:
        print(u)
else:
        print("None found")

And found the only valid url, “https://pastebin.com/zSEhwnNX”.

The pastebin had the text “I5RFQYKKGJYDOQRRKJ4VO3TDNF2TG4DFNNDWGNCSNUZXE5LFOJTGMTSRPJYA====”. Identifying and decoding it with base32 gave the string “GbXaJ2p7B1RyWnciu3pekGc4Rm3ruerffNQzp”. From there I used Dcode’s cipher identifier once again and decoded it with base58.

Yay! scpctf{A_Sh0rt_G00s3_Ch4s3} The flag finally showed up. This challenge was actually a really fun challenge and it taught me a lot! Personally, I would probably assign a few more points for this chall, because of the sheer amount of content, but otherwise, it was great, and thank you disavowed913 for creating it!

I ended up placing 5th in this ctf, which is really cool :)

I hope you enjoyed my writeup :D