Mein Geburtstagsgeschenk

Wie im letzten Blog-Eintrag berichtet, hatte ich Dario ein etwas nerdiges Geschenk gemacht, indem ich einen Amazon-Gutschein als Geocache versteckt und die Koordinaten etwas verschleiert habe. Daraufhin habe ich zu meinem eigenen Geburtstag (im Februar) von Dario und mehreren Arbeitskollegen etwas ähnliches geschenkt bekommen. Das eigentliche Geschenk ist das folgende, kleine Kästchen mit roter, blinkender LED:

Ich hab direkt vermutet, dass es sich hierbei um einen Morse-Code handelt. Das lag insofern nahe, weil Dario zuletzt auch was mit Morsen für Yvonnes Adventskalender gemacht hatte. Ich dachte mir er verwendet sicher seinen alten Code wieder :). Um das zu bestätigen habe ich erstmal ein paar Sekunden mit meiner alten Digicam aufgenommen und dann langsam abgespielt. Das erste Wort ist „BOCHUM“ … gut, damit ist die Vermutung des Morse-Codes also bestätigt. Dario hat allerdings mit einem schadenfrohen Lachen angedeutet, dass die Datenmenge durchaus größer sein könnte und mich das etwas beschäftigen wird. Ich kann nicht morsen und hab auch keine Muße es zu lernen. Also musste eine automatische Lösung her!

Ich hatte anfangs auch überlegt den Kasten zu öffnen und irgendwie den Anschluss der LED an meinen Rechner anzuschließen um das Signal direkt abzugreifen. Ich bin aber alles andere als ein Bastler und ich wollte das Gerät auch nicht kaputt machen. Also überlegte ich mir das Morsen aufzunehmen und dann mit einem eigenen Programm zu dekodieren. Nachher wurde mir übrigens gesagt, dass es dafür auch eine App gegeben hätte. Als Nicht-Smartphonebesitzer hab ich nach sowas erst gar nicht gesucht ;).

Versuch 1: Webcam (Logitech C170)

Ich hab es zunächst mit meiner Webcam und dem Programm Simple Webcam Recorder versucht. Allerdings schaffte meine billige Webcam nur lausige 12-14 FPS (frames per second). Das ist tatsächlich zu langsam um kurz und lang im Morse-Code eindeutig zu unterscheiden.

Versuch 2: Digicam (Panasonic Lumix DMC-FS16)

Ok, dann halt meine Digicam. Die schafft auf jeden Fall gute 30 FPS. Die Qualität hatte ich auf das niedrigste eingestellt (320 x 240 Pixel) um möglichst lange aufnehmen zu können. Allerdings musste ich dann feststellen, dass eingestellte Qualität und Speicherplatz der SD-Karte vollkommen egal sind: Es gehen immer nur maximal 15 Minuten! Einzelne Abschnitte aufzunehmen und dann zusammen zu puzzlen war für mich auch keine Option (der Kasten mit der LED hat keine Pause-Taste!).

Versuch 3: Integrierte Webcam vom Laptop (HP 6530b)

Die Webcam ist – wie üblich für einen Laptop – im Deckel integriert. Das macht den Aufbau etwas fummeliger, aber es gibt keine Einschränkung bezüglich Speicherplatz, und die Framerate stimmte mit 22 FPS diesmal auch. Den Aufnahmeprozess hatte ich noch etwas verfeinert, indem ich diesmal VirtualDub als Software verwendet und dort den Bildausschnitt für die Aufnahme auf winzige 8 x 20 Pixel verringert habe (weniger Daten, schnellere Verarbeitung!). Die Aufnahme lief über Nacht in einem abgedunkelten Raum um keine Schwankungen der Helligkeit im Bild zu haben. Ich habe über acht Stunden lang aufgenommen (letztendlich hätten auch ca. 30-40 Minuten Aufnahmezeit genügt – darüber war ich schon fast etwas enttäuscht ;)). Danach hatte ich eine ca. 240 MB große Datei mit Bilddaten. Ich hatte es vorher mit einzelnen Bitmaps versucht, aber die schiere Anzahl an Dateien machte diesen Ansatz unbrauchbar.

Die Aufnahme war im Kasten und ich hab mir ein einfaches Programm in C++ geschrieben um die Daten zu dekodieren. Das Programm ist nur ca. 260 Zeilen lang. Und zwar werden für jedes Bild alle Rotwerte aufaddiert. Damit hat man also eine Summe pro Bild, anhand dessen man zwischen „leuchtet“ und „leuchtet nicht“ unterscheiden kann. Den Schwellenwert um zwischen diesen Zuständen zu unterscheiden hab ich einfach als Hälfte zwischen Maximum und Minimum aller Summen genommen. Wieviel Bilder nun ein Kurz, ein Lang oder eine Pause ausmachen, hatte ich hingegen händisch anhand des Videos bestimmt und entsprechend im Programm kodiert. Das Dekodieren des Morsens ist dann am Ende nur noch eine Lookup-Table (bzw. std::map<std::string, char> ;)).

Folgender Text kam raus:

BOCHUM, DER 21.02.2015
HALLO FELIX,
ALLES GUTE ZUM GEBURTSTAG.
WIR HABEN UNS GEDACHT, WIR MACHEN ES DIR AUCH EIN WENIG KOMPLIZIERTER.
VIEL SPASS DAMIT.
ANDRE, CHRISTOPH, DARIO, NADINE, OLIVER, THOMAS UND YVONNE
ACHTUNG, FESTHALTEN. ES GEHT LOS
IT’S SHOWTIME
HEY CHRISTMAS TREE CA
YOU SET US UP 8
DO IT NOW DUDE CA 5
HEY CHRISTMAS TREE CB
YOU SET US UP 4
DO IT NOW DUDE CB 4
HEY CHRISTMAS TREE CC
YOU SET US UP 30
DO IT NOW DUDE CC 11
HEY CHRISTMAS TREE CD
YOU SET US UP 28
DO IT NOW DUDE CD 8
HEY CHRISTMAS TREE CE
YOU SET US UP 36
DO IT NOW DUDE CE 23
HEY CHRISTMAS TREE CF
YOU SET US UP 8
DO IT NOW DUDE CF 5
HEY CHRISTMAS TREE CG
YOU SET US UP 26
DO IT NOW DUDE CG 4
HEY CHRISTMAS TREE CH
YOU SET US UP 11
DO IT NOW DUDE CH 11
HEY CHRISTMAS TREE CI
YOU SET US UP 27
DO IT NOW DUDE CI 8
HEY CHRISTMAS TREE CJ
YOU SET US UP 49
DO IT NOW DUDE CJ 23
HEY CHRISTMAS TREE CK
YOU SET US UP 8
DO IT NOW DUDE CK 5
HEY CHRISTMAS TREE CL
YOU SET US UP 18
DO IT NOW DUDE CL 4
HEY CHRISTMAS TREE CM
YOU SET US UP 30
DO IT NOW DUDE CM 11
HEY CHRISTMAS TREE CN
YOU SET US UP 34
DO IT NOW DUDE CN 8
HEY CHRISTMAS TREE CO
YOU SET US UP 26
DO IT NOW DUDE CO 23
HEY CHRISTMAS TREE CP
YOU SET US UP 9
DO IT NOW DUDE CP 5
YOU HAVE BEEN TERMINATED
LISTEN TO ME VERY CAREFULLY DUDE
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE KEY
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE BABY
HEY CHRISTMAS TREE BURN
YOU SET US UP 0
GET TO THE CHOPPER BURN
HERE IS MY INVITATION KEY
GET DOWN BABY
ENOUGH TALK
TALK TO THE HAND BURN
HASTA LA VISTA, BABY

Nach einem verwunderten Blick auf den skurrilen Text half Google weiter: Es handelt sich um ein Programm in der esoterischen Programmiersprache Arnold-C. Alle Anweisungen in Arnold-C sind Zitate von Arnold Schwarzenegger aus diversen Filmen, in denen er mitgespielt hat.  Der Erfinder dieser Sprache bietet praktischerweise auch einen Interpreter (in Java) an um Programme in Arnold-C direkt auszuführen. Witzigerweise kann der Interpreter auch ein Programm in eine *.wav-Dateie konvertieren, die quasi das Programm vorliest :). Wie dem auch sei, folgendes kam bei obigem Programm als Ausgabe:

3
0
19
20
13
3
22
0
19
26
3
14
19
26
3
4

Wenn man die Zahlen als Abstand zu A betrachtet (A = 0, B = 1, C = 2, …), dann kommt man auf folgenden Text: „DATUNDWAT[DOT[DE“. Aha, eine URL! Ich weiß nicht ob Dario die URL in Zukunft noch anderweitig verwenden will, daher hier ein Screenshot der Seite hinter datundwat.de:

paroleUnd da hing ich nun fest. Ich hab diverse Dinge einfach ausprobiert, hab mir den HTML-Quelltext, die CSS Stylesheets und sogar die Bilder (das „Parole“-Bild und das graue Hintergrundbild) angeguckt um darin irgendwelche Hinweise oder Daten zu finden. Nichts. Gar nichts. Nachdem ich die wildesten Sachen probiert habe, musste ich dann Dario fragen. Und ich KONNTE gar nicht weiter kommen :(. Da Ganze war noch nicht fertig und Dario hatte nicht vermutet, dass ich so schnell sein würde.

Dann vergingen mehrere Wochen und irgendwann sagte mir Dario per SMS, dass es weiterginge. Die Seite sah unverändert aus, aber es gab etwas neues im HTML-Quelltext:

<META name="hint @ phone:" content="fd5c0dbe192903f389cad1fb90f076b4dfd63efc8d634af62864706a7fac235b">

Aha, scheinbar ein Hex-String aus 64 Zeichen, also 32 Bytes. Die Zeichen im Hex-String scheinen relativ gleichverteilt, könnte also ein Hash-Digest sein, z.B. SHA-256. Ehrlich gesagt hatte ich aber an dieser Stelle nicht verstanden was mit „hint @ phone“ gemeint sein könnte. Ich dachte es könnte irgendwas mit der SMS zu tun haben, die mir Dario geschickt hatte. Aber der Text dieser SMS wirkte ganz normal. Irgendwann musst ich dann doch um Hilfe fragen und bekam als Tipp, dass eine Telefonnummer gesucht sei. Damit war alles klar: Es ist der SHA-256 Digest einer Telefonnummer, die ich per Brute-Force suchen muss. Auch hierzu hab ich ein relativ kurzes Programm in C++ in die Tasten gehackt (nein, ich mag C++ eigentlich überhaupt nicht, aber ich bin darin ziemlich geübt ;)). Für die Crypto hab ich mal eben OpenSSL verwendet. Meine Annahme war, dass die Telefonnummer keine Sonder- oder Leerzeichen enthält und es entweder eine Bochumer Festnetznummer oder eine Handynummer ist. Also hat mein Programm Ziffernkombinationen in aufsteigender Länge durchiteriert und für jede Kombination „0234“ (Bochumer Vorwahl) oder alle gängigen Handy-Vorwahlen durchprobiert. Und dies jeweils mit „0“ oder mit „+49“ am Anfang. Das Programm hatte ca. eine halbe Stunde gerrechnet und mir dann die richtige Telefonnummer ausgespuckt. Der oben stehende Hash-Wert ist übrigens nicht das Original, sondern an mehreren Stellen modifiziert (soviel Privatsphäre muss sein).

Angerufen: Es läuft vom Band „Das Schlimmste ist, wenn das Bier alle ist“ von den Kassierern (wie mir Dario später mitteilte lief das auf einem Anrufbeantworter seiner Fritzbox). Das Passwort war dann „kassierer“. Pingeligerweise auch nur genau in dieser Schreibweise. Ich hatte vorher versucht den Songnamen in verschiedensten Variationen einzugeben, weil mich das eher an eine „Parole“ erinnert hat ;).

Nach korrekter Eingabe des Passworts bekam man von der Seite folgendes Bild:

datenHässlicherweise wirklich als Bild! D.h. ich musste das für die Weiterverarbeitung erstmal in Text umwandeln. Mit einem Gratis Online-OCR-Tool ging das zwar automatisch, strotzte aber vor Fehlern. Also hab ich das Ganze nochmal händisch abgetippt und mit dem OCR-Ergebnis abgeglichen. Offensichtlich ist der Text BASE64-kodiert. Nach dem Dekodieren kam aber kein Text, sondern irgendwelche Binärdaten raus. Das Tool ent lieferte mir eine sehr hohe Entropie für die Daten. D.h. sie sind wahrscheinlich komprimiert, verschlüsselt oder bestehen nur aus zufälligem Unsinn ;).

An dieser Stelle hing ich eine ganze Weile fest. Irgendwann kam ich dann auf die Idee mal in den Meta-Daten des Bildes zu gucken. Und siehe da: in den EXIF-Daten sind GPS-Koordinaten drin! (Das Bild oben ist nicht das Originalbild, denn Dario möchte daraus evtl. später einen öffentlichen Geocache machen).

Nachdem Dario und ich erst bei dem Cache für sein Geschenk waren,  waren wir zusammen an den entsprechenden Koordinaten wo ich mich dann auf die Suche machte. Ich bin bei Geocaching eher unerfahren und dann bedurfte es auch eines Tipps bis ich auf die Stelle gestoßen bin. Dario hatte diesen Behälter (Kanaldeckel samt Rohr?) vergraben:

cache1cache2

Darin war dann ein kleiner Zettel mit dem AES256-Schlüssel für die Daten versteckt:

schluesselDamit ließen sich die Daten dann bequem mit dem Kommandozeilentool von OpenSSL entschlüsseln. Und heraus kamen 9 Amazon-Gutscheine. Das war viel Aufwand, aber es hat sehr viel Spaß gemacht :). Ich überlege schon jetzt wie ich das Geschenk für Darios nächsten Geburtstag gestalte ;).

Advertisements
Dieser Beitrag wurde unter Allgemein abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

w

Verbinde mit %s