neven@dimitri-dev:~$
cd ../hacknite-2021

$cat completely-normal-picture.mdSteganographyHacknite 2.0

Completely Normal Picture

The flag is written behind a logo in a colour two shades away from white. Boosting the contrast makes it readable, apart from two digits the logo covers.

  • #png
  • #low-contrast
  • #image-editing

$man completely-normal-picture

What this one teaches:

  • How computers store colours as numbers, and why a difference of 2 out of 255 is invisible to the eye.
  • Revealing hidden pixels with a fill tool or a contrast adjustment in an image editor.
  • Narrowing down a partly hidden answer to a few candidates and trying each one.

Task description

Ana decided to combine two of her great loves, the film The Da Vinci Code and steganography, by hiding some useful information inside a picture. Don’t worry, you won’t need to know anything about the film to solve this task, but knowing about steganography will help!

The original was in Croatian; this is my translation.

The picture

The task gives slika.png: the logo of CERT.hr, the national computer emergency response team that ran the competition, on a white band between two mustard-yellow stripes. It really does look completely normal.

How computers store colour

Each pixel in an image is stored as three numbers: how much red, green and blue light it has, each from 0 to 255. Pure white is 255, 255, 255 and pure black is 0, 0, 0.

Two colours a couple of steps apart look identical to the eye. Checking the white band pixel by pixel shows it isn’t all pure white. Some pixels are 253, 253, 253, and together they form text. That’s less than a 1% difference, so the text is effectively invisible. It’s also drawn behind the logo, so the logo’s letters cover parts of it.

Making it visible

The team opened the image in Photoshop and filled the visible areas with strong colours, so anything that didn’t get filled stood out. Any image editor can do the same with less effort:

  • Use a paint bucket or magic wand with the tolerance set to 0 on the white area. Only the exact 255, 255, 255 pixels get selected, and the 253 ones show up as the gap in the selection.
  • Or push the contrast up as far as it goes (in most editors, Levels or Curves). Small differences near white get stretched into big ones.

Here’s the left end of the text, before and after. Everything that isn’t the hidden text is faded back so the text stands out:

Two crops of the left side of the picture. Above, the original: the grey C and blue bars of the CERT.hr logo on white, with no text visible. Below, the boosted version: the letters F2021 and an opening bracket in black, partly behind the faded logo shapes

Filling in the gaps

With the text visible, most of it can be read: CTF2021[ followed by 12 digits. Two of the digits sit behind the logo’s letters, and only their edges show. From those edges, each one could be a 3 or an 8.

Two uncertain digits with two options each makes four possible flags. We submitted them one at a time until the scoreboard accepted one.

$cat flag.txt revealCTF2021[308349504071]

Written by Neven Marić. This writeup was written with the help of Claude Code (Anthropic).