Auf den Grazer Linuxtagen hat grommunio eine vielbeachtete Coding Challenge veranstaltet. Von den 23 Teilnehmern konnten 9 erfolgreiche Ergebnisse präsentieren, Den Hauptgewinn konnte der durchs Los bestimmte Gewinner jetzt im grommunio-Büro abholen.

Die Aufgabenstellung klingt doch ganz einfach, nicht wahr?
„Für diese Aufgabe ist in der Datei \src\main.cpp C/C++-Code zu schreiben, um die Coding Challenge am Ende dieser Readme-Datei zu lösen. Es wird MinGW64 mit gcc/g++ 15.2 verwendet, das automatisch in einem lokalen Verzeichnis eingerichtet wird und mit den folgenden Befehlen genutzt werden kann.“
Was für Normalsterbliche unverständlich klingen mag, scheint für Programmierer auf den ersten Blick nicht schwer, auch die folgenden vier Aufgaben die grommunio eingebaut hat, waren wohl prinzipiell durchaus lösbar, so dass sich 23 Linux-Profis an einem Aprilsamstag in Graz an die Challenge machten.
Unter Zeitdruck programmieren
Dabei hatte so mancher Teilnehmer mit dem Zeitlimit zu kämpfen, innerhalb dessen die passende Lösung mit selbst geschriebenen Code zu finden war. Die anfangs angenommenen 20 Minuten erwiesen sich als viel zu optimistisch, auch innerhalb der letztendlich 40 vorgegebenen Minuten konnten nur 9 von 23 Teilnehmern korrekte Lösungen finden.
Damit waren die beiden eigens präparierten Windows-Maschinen am Samstag in Graz fast durchgehend belegt, mehr als sieben Stunden waren für die Challenge selbst verbucht.
Das Coding Challenge Setup
Auf den Rechnern hatten grommunio-Mitarbeiter neue User angelegt, VSCode als Editor und diverse Kommandos via Windows cmd skripts automatisiert, um das kompilieren und submitten zu beschleunigen.

„Wir haben einen kleinen HTTP-Endpoint vorbereitet, der es in Kombination mit einem Shell-Skript auf den Challenge-Rechnern ermöglicht hat, individualisierten Input für jeden Teilnehmer anhand seiner E-Mail Adresse zu generieren und dann entsprechend mit Feedback auf Lösungsversuche zu antworten.“ erklärt Fabian Ortner von grommunio (im Bild oben). „In einem Readme gab es dann noch eine genauere Beschreibung, was bei der Programmieraufgabe zu tun war und so war ein recht simpler, automatisierter Prozess geschaffen, um die Teilnahme möglichst einfach zu gestalten.“
Das „so einfach wie möglich“ endete aber schnell. Für die Challenge mussten die Teilnehmer die Fehlfunktion eines Mailservers durch ein kleines Konvertierungsskript fixen. Im Readme beginnt der erste Teil von vier zu lösenden Aufgaben mit:
„Es scheint pro Zeile ein ganzzahliges Vielfaches von 8 Zeichen zu geben, also versuchen wir, diese als einzelne Bytes zu interpretieren. Zum Beispiel:
010001000101000101001010 0x44 0x51 0x4A
010001000101000001001100 => 0x44 0x50 0x4C
010000100101000101001100 0x42 0x51 0x4C
Wir wissen, dass der alte Mailserver nach dem Export der E-Mail eine sehr einfache Verschlüsselung verwendet hat:
- Nimm jede Textzeile, d. h. jedes Byte
- Führe für jede Zeile eine XOR-Verschlüsselung mit dem Schlüssel `grommunio` Zeichen für Zeichen durch
- Wenn eine Zeile länger als der Schlüssel ist, wende den Schlüssel einfach erneut an, beginnend mit dem ersten Zeichen.“
Damit nicht genug, es folgen weitere Anforderungen und Aufgaben, die die Köpfe zum Rauchen brachten, sodass sich nur 9 Teilnehmer mit richtigen Lösungen durchsetzen konnten.
Doch auch die nicht erfolgreichen konnten hoffen, weil unter allen Teilnehmern am Ende das Los darüber entschied, wer die versprochene Playstation bekommen sollte – abzuholen im 30. Stock der Donautowers in Wien.
Die Lösung? Wird hier nicht veröffentlicht, aber das Readme mit der kompletten Aufgabenstellung gibt es hier unter diesem Post. Ohne den für die Grazer Linuxtage gebauten Server von grommunio braucht es allerdings ein wenig Phantasie…
Erfahren Sie mehr über grommunio bei den Grazer Linuxtagen in diesem Artikel.
Coding Challenge Instructions
This challenge requires you to write some C/C++ code inside .\src\main.cpp to solve the challenge at the end of this readme. It uses MinGW64 with gcc/g++ 15.2 which is set up automatically in a local directory and can be used with the following commands.
There are four important commands for the included script:
1. To Register your E-Mail address and start the 20min timer:
.\glt.cmd start
2. To just build your code:
.\glt.cmd build
3. To build and run your code and print it’s output to the terminal:
.\glt.cmd build_and_run
4. To build, run and submit your solution:
.\glt.cmd submit
The command used to build your solution has no optimizations enabled by default:
g++.exe -static -O0 -g -std=c++17 src\main.cpp -o build/app.exe
Challenge
To start the challenge, first put your E-Mail address in the user.txt file and then use the start command to get your input. We only use it, to contact you in case you win the drawing. You only need to change the result variable in your code and then run the submit command to check whether it is correct.
WOW. What happened to that E-Mail during migration? Somehow one of your E-Mails got corrupted during the setup of your new mail server. It seems to only consist of binary symbols split into a few lines (your input). There seems to be an integer multiple of 8 symbols per line, so let’s try interpreting them as individual bytes. For example:
010001000101000101001010 0x44 0x51 0x4A
010001000101000001001100 => 0x44 0x50 0x4C
010000100101000101001100 0x42 0x51 0x4C
We know that the old mail server used a really simple encryption after exporting the Email:
- Take each line of text, i.e. each byte
- XOR each line with the key grommunio character-wise
- If a line is longer than the key, simply reuse the key starting from the first character.
0x44 ^ g = 0x23 0x51 ^ r = 0x23 0x4A ^ o = 0x25
0x44 ^ g = 0x23 0x50 ^ r = 0x22 0x4C ^ o = 0x23
0x42 ^ g = 0x25 0x51 ^ r = 0x23 0x4C ^ o = 0x23
That looks more promising already, but still there are many messed up characters…
In earlier times the old mailserver already had problems with offsets on individual character values, with the offset depending on two things:
- A horizontal checksum of your E-Mail address
- the index of the character in a line and the line number it is in
At the time, the server calculated a horizontal checksum, by simply adding all byte values of your E-Mail address together.
[email protected] => (m=109) + (a=97) + (x=120) + ... = 2888
Then, for each character, it’s positive offset was calculated by taking the checksum modulo it’s position in the line. To correct this error we therefore have to subtract the offset values from each of the bytes. Additionally these offsets are then shifted left by one character after each line.
0x23 - (2888 % 1) = '#' 0x23 - (2888 % 2) = '#' 0x25 - (2888 % 3) = '#'
0x23 - (2888 % 2) = '#' 0x22 - (2888 % 3) = ' ' 0x25 - (2888 % 1) = '#'
0x23 - (2888 % 3) = '#' 0x23 - (2888 % 1) = '#' 0x25 - (2888 % 2) = '#
Now this looks like a correct message! But to ensure we have a correct algorithm, we need to calculate the element-wise product of the offset values times the character-values of each used key-character and sum them up for each #-character in the message. (\n and \r should be discarded)
(g=103)*0 + (r=114)*0 + (o=111)*2
+ (g=103)*0 + (o=111)*0
+ (g=103)*2 + (r=114)*0 + (o=111)*0 = 428
You need to write this sum of element-wise products to the result variable to finish the Coding Challenge!
Good Luck!

