February 15, 2026
Introduction
USACyO (USA Cybersecurity Olympiad) seems to be a more structured CTF in the form of an "olympiad" for high schoolers in the US. Those that qualify after 2 rounds will represent USA in the International Cybersecurity Olympiad (ICO). More information on the ICO can be found here and here.
Since there are no rules on not releasing writeups for the sample problems (which don't count for anything), I will post my solutions.
Overall, these were really simple/trivial problems... I'd expect the actual olympiad to be much harder.
web
Rob
Problem Statement
Become one with the rob
Solution
A simple wget -r usacyo-rob.chals.io obtains a
robots.txt file:
User-agent: *
Disallow: /secret
Visiting https://usacyo-rob.chals.io/secret/ provides the key
USACYO{hmm_r0b0ts}
where is it
Problem Statement
Where is it?
Solution
Inspect-element-ing the website and searching
USACYO{ in the HTML provides us with the flag,
USACYO{itshidden} hidden with a
style="display:none".
rev
REDACTED
Problem Statement
I had a flag that was supposed to be kept secret, but somehow someone stole it and encrypted it so now I can't get it back. Please help!
flag_var = b"REDACTED"
def encrypt(data):
out = bytearray()
for i, b in enumerate(data):
out.append(((b ^ 0x5A) + i) & 0xFF)
return bytes(out[::-1])
encrypted = encrypt(flag_var)
print("Encrypted output:")
print(encrypted)
# Encrypted output: b"=8\x82@\x80\x16FE|\x12:v\x0f5q/'\x1a\x07\x1c\x1d\n\x0f"
Analysis
Looking at the provided encryption algorithm, we see the input
plaintext is a byte literal. We iterate across each byte,
XOR-ing each byte with 0x5A. Then, each byte is
modified based on its position (the + i).
This means the first byte gets +0, second byte gets +1, third byte gets +2, etc...
We finally use & 0xFF to ensure the value stays
between 0-255.
Solution
We can write a simple Python script to undo all three of these reversible operations:
encrypted = b"=8\x82@\x80\x16FE|\x12:v\x0f5q/'\x1a\x07\x1c\x1d\n\x0f"
def decrypt(data):
data = data[::-1]
out = bytearray()
for i, b in enumerate(data):
original = ((b - i) & 0xFF) ^ 0x5A
out.append(original)
return bytes(out)
decrypted = decrypt(encrypted)
print("Output:")
print(decrypted)
We get the flag b'USACYO{r3v_1t_4ll_4w4y}'
Safe
Problem Statement
I forgot the code to my safe...but maybe there's another way.
We are also given a file named "safe".
Solution
Pretty standard binary analysis here.
Everything seems normal, we can go ahead and decompile using your decompiler of choice. I am using Binary Ninja Free.
Upon a file-wide search for "USACYO{", we find our flag as
USACYO{str1ngs_1s_us3ful}
foren
Starry Night
Problem Statement
Starry Night...but something's a little off.
We are also given a .jpg file:
Solution
Of course, you should always check for steganography in image-based chall.
Running stegseek --crack starrynight.jpg gives us
flag USACYO{h1dd3n_1n_pl41n_s1ght}.
err...what?
Problem Statement
I've been trying to make it work...but this image won't open...
We are given a .png file called "falg.png"
Analysis
falg.png won't open in feh or any other image
viewer, which means it's probably corrupted. The goal of this
chall is probably to repair the corruption.
Running file on falg.png returns only:
This is abnormal as a healthy PNG should look like this:
Running pngcheck affirms our suspicions:
❯ pngcheck -v falg.png
File: falg.png (8977 bytes)
this is neither a PNG or JNG image nor a MNG stream
ERRORS DETECTED in falg.png
Solution
Dumping the first 8 bytes of the file (the signature) and comparing against the PNG specificiation, we see falg.png's signature does not match up:
❯ xxd -l8 falg.png
00000000: 4419 8d47 0d0a 1a0a D..G....
Using a hex editor of choice (or just
hexed.it), we
can edit the first three bytes of falg.png to match the correct
PNG signature. Opening the corrected PNG file gives us the flag:
USACYO{h0w_d1d_th1s_h4pp3n}