I’m sure you all have solved this last crypto challenge, but in case you don’t . This is a short write up on how to get the hidden message.
You can use different tools to achieve what is described below. I’m going to use GNU/Linux command-line tools to get the message out of the file. Let’s go.
Looking into the image
First we have to be able to take a look to the contents of that noisy image. For easily doing this, I will use the
convert tool from the ImageMagick package and convert the original grey-scale
PNG into a plain
$ convert stego2.png stego2.pgm
.PGM format is quite convenient because it contains all the data uncompressed just after a small header. This really simplifies the access to the pixels without writing any code or use special tools. So, the
PGM file looks like this:
$ head -c 30 stego2.pgm P5 653 55 255 -FLAC- fLaC
The value 30 is just a random number (I already know which value have to put there :P), but, as you can see the header is around that size.
We can see the initial format identifier
P5. Then we find the image dimension and finally the pixel encoding format. In this case,
255 means that each pixel is 1 byte (256 values).
Those are the contents of the standard
PGM header. The string
-FLAC- we find just next is actually the value of the first 5 pixels in the image. If you do not know what FLAC is, you can do a quick search on the web.
If you are lazy like me, keep reading. FLAC ( https://en.wikipedia.org/wiki/FLAC ) is an audio file format supporting lossless compression. That makes sense. Compression will obfuscate the original message and the lossless nature of the file format will allow us to use bit masking techniques like the ones we already know ( [CryptoChallenge] Basic Stego - Making Of (Spoiler warning))
If you take a look to a FLAC file, you will find out that the format uses a magic string at the beginning of the file. That is common to many file format. The magic bytes for the FLAC format are
fLaC. That is the string just after the first
-FLAC-… So, let’s ignore the first
-FLAC- that does not fit the FLAC format, and let’s extract what follows.
An audio file
To get the FLAC file our of our PGM image we have to first find out the offset to the data we are interested on and then dump that data into a file:
$ xxd stego2 | head -n 5 0000000: 5035 0a36 3533 2035 350a 3235 350a 2d46 P5.653 55.255.-F 0000010: 4c41 432d 0a66 4c61 4300 0000 2210 0010 LAC-.fLaC..."... 0000020: 0000 0575 001c b902 b110 f000 0053 fd80 ...u.........S.. 0000030: 09c2 40f2 b686 21da 8ead 18cf e8e9 e103 [email protected]!......... 0000040: 0000 1200 0000 0000 0000 0000 0000 0000 ................
Just counting, we find out that the offset (the beginning of
fLaC string) is at 22 bytes from the beginning of the file. Let’s extract the file:
$ tail -c +22 stego2.pgm > stego2.flac $ play stego2.flac stego2.flac: File Size: 35.9k Bit Rate: 147k Encoding: FLAC Info: Processed by SoX Channels: 1 @ 16-bit Samplerate: 11025Hz Replaygain: off Duration: 00:00:01.95 In:95.3% 00:00:01.86 [00:00:00.09] Out:20.5k [!=====|=====!] Clip:0 Done. play WARN flac: decoder MD5 checksum mismatch.
You should hear some audio when playing back the flac file.
Accessing Audio Samples
Now that we have our audio file, let’s look into it. The FLAC format is compressed. Do not waste time dumping the file. We have to uncompress it to ne able to look at what is inside.
For doing this, we are going to use the
sox tool. This is a really handy command-line audio tool, that can convert between different audio formats and do some transformation to the audio stream. One of the formats it supports is raw samples… that format looks convenient.
$ sox steog2.flac stego2.raw $ xxd stego2.raw | head
You should now be able to read the message, however as I used 16bits to encode the audio samples, and used the 8 lower bits to store the message, you have to skip one out of two chars or do some little programming/scripting to read the message.