8 - August

MetaCTF August 2025 Flash CTF (24th / 1423) -- It was a pleasure doing a full clear for the first time, but I was so close...

Challenges:

Thu, August 28th

Forensics — Baby Something

How does the song go again? Baby something do do do do do do...

Download the artifact herearrow-up-right.

  • You received a babysomething.pcap file

  • You can see that the intended solution involves opening the file in Wireshark and analyzing it there.

  • However, since I saw this was a 50-point challenge, I decided to take the lazy approach instead:

    • tshark -r babysomething.pcap -V

  • MetaCTF{w1r3sh4rk_d00_d00_d00_d00_d00_d00}

Rev — All About Flags

I wrote a command line application all about flags! Can you take a look at it for me?

There's downloads both for Windowsarrow-up-right and Linuxarrow-up-right, but they're functionally the same, just download the version for whichever OS you prefer.

chevron-rightIf you are unable to download and run applications, click here, but we recommend downloading and running it yourself if possible - it is a useful skill to learn and will be faster than waiting for our instance to start.hashtag

Spawn a browser-based shell below. Note that this is provided as a convenience only and will be paused or removed if there is excessive load.

  • I did my usual routine and ...that is all

  • MetaCTF{I_f1y_m4ny_fl4g5_4nd_c4p7ur3_3v3n_m0r3}

  • The intended solution is actually to run the executable, though. Which, ehm... makes sense.

Crypto — Rainbow Box

Several planes crashed in the same location, but we could only find one black box. All we found was this weird rainbow image? Can you make anything out?

Download the image herearrow-up-right.

  • tbh 🤷‍♂️, my first instinct was that the hidden flag was a QR code or something where all the pixels had been scrambled here and there.

    • So I checked the pixels and examined the dimensions to see if it fits 25x25, etc.

    • Then I decided on a whim to throw it into my favorite tool

    • From that... the answer is just a breeze — click and take notes

  • Another tool will help you visualize this will be:\\

chevron-rightExplanationhashtag

This is a bitplane steganography chall, w where the flag is hidden in the individual bit layers of the image data. Each RGB channel contains a letter, so when we separate tand visualize each bitplain, the flag becomes visible.

  • MetaCTF{fly-b1tpl4ne}

OSINT — On The Grid

I was hanging out on Granite Beach when I found a message in a bottle, it didn't say very much though. Can you help me figure out where it came from? Here's the transcript:

Help! 4V FH 246 677

The answer to the challenge is the name of the location the message was most likely written at.

  • My first couple attempts that I thought it was simple Alaska so I shoot myself in the foot w that

  • Google Map will leads us here

  • Flag: Sutwik Island

  • However, the official writeup said that the answer is Foogy Cape (which is just a zoom in specific location of the island)

Web — Super Quick Logic Invitational

I'll take "Rather Vexing" for 500 Alex.

This new trivia game is pretty fun, but one of the challenges is impossible! "What is the flag for this CTF challenge?", how would I know?! Maybe you'll fare better?

  • Lets hit up the site and see what we are dealing with

  • After reconnaissance we could pull up the script in the game, I first spotted the

  • So simply input that in the console (the game time will stop and give us time to do our shenanigans.

circle-check
  • The frontend lets you pull new questions from /next_problem.

  • The backend builds a SQL string like SELECT * FROM problems WHERE id = <id> AND answer = '<user_input>' and even returns the failed SQL back to the client on error.

    • This can be confirm when we input special characters like '";:[{]}| and the code leak in the source.

  • So our exploit process is straight forward, if we can cause a DB error, we’ll see the exact SQL the server tried to run.

circle-check
  • Finally, we send our regard, I mean payload

    • On the flag question, our payload will short-circuits the WHERE clause to true by selecting the flag row, the server will think our answer is (id = <current_id> AND ...) OR (id = 201) which is true when we are at question 201. And then route to /game_end

  • The reason why it is 201 is because when we are at the question "What is the flag...", we break the sql again so it reveals to us

  • Also the challenge description, bro literally said "201 unique problems to solve each game, you'll never believe what's the answer to challenge 201"

  • MetaCTF{wh4t_1s_7h3_fl4g_f0r_7hi5_ch5l1eng3}

Binary Exploitation — Spreadsheet

I can't afford Office 365 so I've decided to roll my own. What could possibly go wrong!

My spreadsheet application is a work in progress but feel free to give it a try. You can download my program herearrow-up-right.

Try it live here: nc kubenode.mctf.io 31009 If that instance is not working, there is a backup instance at: nc host5.metaproblems.com 7542

circle-info

One sad thing about this challenge is that it took me an entire hour due to misidentifying the challenge type. It was Binary Exploitation, but my dumb ass thought the purple category color indicated Forensics. This led me down a rabbit hole I never wish to jump into again.

tldr; The program stores a 10×10 grid of char* in .bss right before a global pointer named savefile. edit_spreadsheet() bounds-checks the row as 1..10 but allows the column letter up to 'K' (off-by-one). Writing to cell K10 therefore writes one pointer past the grid and overwrites savefile. Set it to flag.txt, then Load → Print.

Because the service is jailed at /srv/app, the correct in-jail path is flag.txt (or /flag.txt), not /srv/app/flag.txt. (My mistake for not reading the dockerfile)

  • Okay, now after the moment I realized the flag is not directly in the hex of the bin (Forensics - duh), and some address manipulation (Binary Exploit), I throw it into dogbolt and get the ghidra decompiler code to works.

  • That's when I realized:

    • Edit OOB (off-by-one): column allows 'K', so col-'A' == 10 is written, overflowing row’s 10-element row.

  • Why K overwrites savefile?

  • The grid occupies indices 0..99; the next pointer (index 100) is savefile. Valid indices are: 0..99 (A1..J10).

  • K10(10-1)*10 + ('K'-'A' = 10) = 9*10 + 10 = 100 exactly one past the array → savefile.

  • Set cell K10 to the file you want to load (the flag), and the next Load will fopen(savefile, "r").

  • MetaCTF{c0mm4_c0mm4_c0mm4_c0mma_c0mm4_ch4m3l30n}

🚩gg.

Last updated