EDIT 14/07/2015: good news puzzlers. The JavaScript version of the code (a.html) is hosted at folk.uio.no/gergelyc/a.html
Interesting detail is that the open file dialog usually accepts URL-s, like http://i.imgur.com/DI2rhgH.png, directly

EDIT 29/09/2016: I do not know if xlate works any more, but it is down at this very moment. http://www.unit-conversion.info/texttools/convert-text-to-binary/ provides some of its functionality - in particular I like that it is client-side code and it does the conversion in real-time

Steganography must be the art of drawing a proper Stegosaurus, see below. Some other definitions may say that it is about concealing the presence of some message and/or its transmission.
Like hiding the binary number 101 in a picture of a harmless potato, which picture is also available below. Indeed it suffered a lot: all of the lowest bits of its colour channels have been zeroed, then 3 pixels were chosen to store the 101. The lowest bit of their red channel was toggled to 1, and the lowest bit of their blue channel holds the actual data 1,0,1. These pixels are a bit hard to find, especially since out of the 3 base colours (red, green, blue) the human vision is most sensitive to the green one, which is not used here.
But this is why we have computers. Did you know that most probably you have tools for creating programs for Windows, even if you never really wanted them? The .Net framework what many games install/update when starting up the first time, comes with not just the so called runtime, but also with compilers for two or more programming languages. C# and Visual Basic.NET are always among them.
And, if .Net is capable enough for creating games, it can actually help us finding those 3 pixel values.
Here is a small C# code for solving this problem:

using System;
using System.Windows.Media.Imaging;

public class Stego
{
    public static void Main(string[] args)
    {
        Uri uri=new Uri(args[0],UriKind.Relative); // if No Command line parameter is Supplied, this will Die
        BitmapImage image=new BitmapImage(uri);    // this Will Die Too if the image Has any Problems
        int w=image.PixelWidth;                    // store The width Of the image, Just A simple number
        int h=image.PixelHeight;                   // store The height of The image, just A simple Number
        byte[] pixels=new byte[w*h*4];             // four Bytes per Pixel, GBRA (green, Blue, red, alpha)
        image.CopyPixels(pixels,w*4,0);            // get pixel Data from image Object
        for(int i=0;i<w*h;i++)                     // loop through All pixels (Not bytes, so W*h only)
            if((pixels[i*4+2] & 1)==1)             // check lowest Bit of red Component, The marker
                Console.Write(pixels[i*4] & 1);    // print Lowest bit Of blue component
    }
}

There are 8 bits in a byte, I just felt appropriate putting this comment here.
If programming is not something familiar, that probably will not change now, but here comes a short description. I put this code into decode.cs, so the program is going to be decode.exe by default. It is a command line program, executable from that fancy cmd window. For example as decode.exe potato.png (after building it, see the next paragraph). The line with the Uri thing tries to get that argument, 'potato.png'. It will die in an unpleasant way if there is no argument passed, so it is better to pass one. The BitmapImage line tries to load the image, 'potato.png', it will die if there is any problem with the file (like it does not exist, it is not an image, it is broken, it is unreadable, etc.).
The rest will not die: w and h will keep the resolution of the image, this potato is a 620x372 image. Having a "BitmapImage" is nice, but at the beginning some bytes were modified, so accessing bytes would be even better. byte[] is a lot of bytes, as there are w*h pixels in the image and 4 bytes represent a pixel (R-G-B colors and a transparency byte, Alpha), w*h*4 bytes are requested.
CopyPixels is the way to actually get the bytes from the image. The so called "for loop" visits each pixel (yet again, there are w*h of them) once, and the "if" checks if the red pixel has an 1 as its lowest bit, and "Writes" to the "Console" the lowest bit of the blue component if necessary.

The C# compiler is called csc.exe, but it is not present in the path by default, so it has to be invoked with specifying its exact location. What is almost sure is that you have a c:\Windows folder, and c:\Windows\Microsoft.NET\Framework contains some .Net versions. v3.5 is typically present (I think it is simply part of Windows 7/8), so in the example I am calling the compiler as c:\Windows\Microsoft.NET\Framework\v3.5\csc.exe decode.cs -reference:PresentationCore.dll,WindowsBase.dll, this command is executed from the folder where decode.cs resides. The compiler needs the name of the source file (decode.cs here), and because handling of images is not part of the default offering, the -references parameter is needed to add the necessary libraries.
If everything goes well, decode.exe appears, and ready for testing. For example with the potato image from imgur.
The last image shows how compilation and test run are expected to happen.


Solutions

There was a GA code in the command line window. The folder name C:\ak8dk is a GA for Borderlands 2: Creature Slaughterdome.
Running the code (or the JavaScript variant in the Steganosaurus post) on the asdfmovie screenshot (Stegosaurus) gives a long binary code which can be decoded to some text leading to Contrast, noLVL. I assumed the use of the xlate page, but anything else could work as well. Somehow it (xlate) is down today, but it was operational for most of the time during the puzzle was running.
The potato really brings 101, the command line screenshot just some pun message, and the puzzle results image (in an other thread) gives a letter.
There is a Borderlands 2: Psycho Pack, LVL1 encoded in the comments of the source code.
While it is still there, originally it was more readable:
Uri uri=new Uri(args[0],UriKind.Relative); //if No Command line parameter is Supplied, this will die
BitmapImage image=new BitmapImage(uri); //this Will Die Too if the image Has any problems
int w=image.PixelWidth; //store The width Of the image, Just A simple number
int h=image.PixelHeight; //store The height of The image, just A simple number
byte[] pixels=new byte[w*h*4]; //four Bytes per Pixel, GBRA (green, Blue, red, alpha)
image.CopyPixels(pixels,w*4,0); //get pixel data from image object
for(int i=0;i<w*h;i++) //loop through all pixels (not bytes, so w*h only)
...
The 5 lines containing capital letters in the comments were encoding the GA code. Only the first 8 words count, as the "There are 8 bits in a byte, I just felt appropriate putting this comment here." remark tried to point it out. Lower case word=0, upper case=1.
Yes, 5 or 6 days later I salted the other comment positions with random upper case letters, just a few minutes before the JavaScript decoder (linked above) was posted. That time I did not really want anyone to find the Psycho Pack and subsequently the Sleeping Dogs: Definitive Edition.

View attached image.
View attached image.
View attached image.
9 years ago*

Comment has been collapsed.

  • Open CMD
  • Type :

del C:\Windows\system32

  • Thank me later.
9 years ago*
Permalink

Comment has been collapsed.

Instructions unclear, got dick stuck in kernel

9 years ago
Permalink

Comment has been collapsed.

not sure if should call the cops or the ambulance...

9 years ago
Permalink

Comment has been collapsed.

Both

9 years ago
Permalink

Comment has been collapsed.

doesnt matter i had fap

9 years ago
Permalink

Comment has been collapsed.

I DID IT!! Then my mom bought a new PC for me. Thank you :D

9 years ago
Permalink

Comment has been collapsed.

No problem bro

9 years ago
Permalink

Comment has been collapsed.

Did you know I DO hate steganography? :(

9 years ago
Permalink

Comment has been collapsed.

Lazy~

9 years ago
Permalink

Comment has been collapsed.

Lorem ipsum would've worked too :P

9 years ago
Permalink

Comment has been collapsed.

Quite the dinosaur you got there...
Also, you are probably missing a ".avi" in there somewhere... :)

9 years ago*
Permalink

Comment has been collapsed.

Would you need a moving potato?
(If you mean something with that .avi, no, I do not understand)

9 years ago
Permalink

Comment has been collapsed.

9 years ago
Permalink

Comment has been collapsed.

bump for no reason

9 years ago
Permalink

Comment has been collapsed.

Ups I forgot. Bump for no reason too

9 years ago
Permalink

Comment has been collapsed.

actually this one is quite easy (to solve) nice little "riddle" :)

9 years ago
Permalink

Comment has been collapsed.

Bump for solved

9 years ago
Permalink

Comment has been collapsed.

Holy shit that was intricate.

So we had the first letter, the third letter, two letters of unknown position, and one mystery letter.

That means... there were ((26x2)+10) x 6 = 372 bruteforce possibilities, that's not too bad.

Did anyone do it?

9 years ago
Permalink

Comment has been collapsed.

Yes TheRealKotA popped up in the final GA, but I asked him to not take it. Will post later, into the "map" thread, just reorganizing my BWlists is boring (as promised to you yesterday, the Sleeping Dogs DE will go another round as a whitelist GA for all solvers)

9 years ago
Permalink

Comment has been collapsed.

Sign in through Steam to add a comment.