Friday, March 17, 2017

VolgaCTF 2017 Teaser - Octaves & Notes writeup

Eve intercepted this midi-file. She only knows that notes must be in 1st and 2nd octaves. Can you help her?

Stegano & Crypto. Hmmm...

Let's open this midi file in audio editor:


I've noticed that only ABCDE and F notes are present (no G note). Thus, it is possible to understood the relationship with hex.

If write out the full melody in octave-note format, we will have the next result:
2D, 1A, 2D, 1B, 2C, 1A, 2D, 1F, ...

Then I've noticed that 0x2d in ASCII is "-" (dash), 0x2c is "," or some sort of delimiter. And the other 4 notes (all in first octave) are non-printable in ASCII.
Often non-printable characters are replaced with a dot in the output.
So using the next Python script, I've got a flag encoded in Morse code:

import string

notes = [0x2D, 0x1A, 0x2D, 0x1B, 0x2C, 0x1A, 0x2D, 0x1F, 0x1E, 0x2C, 0x1B, 0x2D, 0x2C, 0x1F, 0x1E, 0x1A, 0x2C, 0x1B, 0x1F, 0x1E, 0x2C, 0x1B, 0x1A, 0x2C, 0x2D, 0x1B, 0x2D, 0x1A, 0x2C, 0x2D, 0x2D, 0x2C, 0x2D, 0x2D, 0x2D, 0x2C, 0x1B, 0x2D, 0x1B, 0x2C, 0x1A, 0x1B, 0x1F, 0x2C, 0x1E, 0x2C, 0x2D, 0x2D, 0x2D, 0x2C, 0x2D, 0x1B, 0x2C, 0x1F, 0x2C, 0x1A, 0x2D, 0x1B, 0x1A, 0x2C, 0x2D, 0x2D, 0x2D, 0x2C, 0x1A, 0x1F, 0x1E, 0x2D, 0x2C, 0x1E]
out = ''
for n in notes:
    out += chr(n) if chr(n) in string.printable else '.'

print(out.replace(',', ' '))

-.-. .-.. .- ... ... .. -.-. -- --- .-. ... . --- -. . .-.. --- ...- .

And the flag is:

CLASSICMORSEONELOVE

PS: WTF! Where is hint about non-standard flag format? :(