Christmas Tree EXEC1 was de eerste computerworm2 die in december 1987 verschillende internationale computernetwerken lamlegde. Het virus draaide op het IBM VM/CMS-besturingssysteem en werd in de scriptingtaal REXX3 geschreven door een student van de Clausthal University of Technology4 (Duitsland).

Op zich was het virus vrij onschuldig. Het tekende een ruwe ASCII-tekening van een kerstboom op het scherm, die door een IBM 3279-kleurenterminal zelfs weer met knipperende gekleurde tekens (sterretjes) werd weergegeven. Daardoor leek de kerstboom te fonkelen.

                *
                *
               ***
              *****
             *******
            *********
          *************                A
             *******
           ***********                VERY
         ***************
       *******************            HAPPY
           ***********
         ***************            CHRISTMAS
       *******************
     ***********************         AND MY
         ***************
       *******************         BEST WISHES
     ***********************
   ***************************     FOR THE NEXT
             ******
             ******                    YEAR
             ******

Maar na het tekenen stuurde de worm zichzelf via e-mail naar elk contact in het adresboek van het slachtoffer. Op deze manier verspreidde het zich over het European Academic Research Network5 (EARN), BITNET6 en IBM's wereldwijde VNET7. Het veroorzaakte enorme storingen op al deze netwerken.

Sommige versies van de worm hadden verborgen code. Het uitvoerbare deel van de worm zat verborgen op het einde van zeer lange regels (meer dan 80 tekens). Daardoor was het standaard niet zichtbaar op een computerscherm, tenzij de gebruiker naar rechts scrolde.

Opgave

Het Christmas Tree EXEC virus heeft in het bestandssysteem een ASCII-tekening verborgen zodat die moeilijk kan opgespoord worden. Daarvoor heeft het virus het bestand opgesplitst in stukken die elk uit $$n \in \mathbb{N}_0$$ regels bestaan. Elk stuk wordt verborgen door vooraan in een bestaand bestand enkele extra regels toe te voegen. Hierna ziet het bestand er schematisch als volgt uit:

a) 1 extra regel met een aanwijzing waar het volgende bestand kan gevonden worden
b) n extra regels met een stuk van de ASCII-tekening (optioneel)
c) bestaande regels van het bestand

Als we het eerste bestand kennen waaraan het virus extra regels heeft toegevoegd, dan kunnen we daarmee de ASCII-tekening reconstrueren. De eerste regel die het virus heeft toegevoegd bevat immers drie tokens die van elkaar gescheiden worden door spaties (een token bevat zelf geen witruimte-karakters). Deze drie tokens geven aan of er in dit bestand een volgende stuk van de ASCII-tekening te vinden is en wat het volgende bestand is waaraan het virus extra regels heeft toegevoegd:

  1. Het eerste token is print of skip. Bij skip werden behalve de eerste regel geen extra regels aan het bestand toegevoegd. Bij print werden na de eerste regel nog $$n$$ regels met een volgende stuk van de ASCII-tekening aan het bestand toegevoegd.

  2. Als het tweede token een natuurlijk getal $$m \in \mathbb{N}$$ is, dan zit het volgende bestand $$m$$ directories hoger in de bestandshiërarchie. Anders zit het volgende bestand in een subdirectory waarvan de naam correspondeert met het token.

    Opmerking

    Als het tweede token het getal 0 is, dan betekent dat dus dat het volgende bestand in dezelfde directory staat als het huidige bestand.

  3. Het derde token is de naam van het volgende bestand waaraan het virus extra regels heeft toegevoegd.

Op deze manier vormen de opeenvolgende bestanden waaraan het virus extra regels heeft toegevoegd dus een gelinkte lijst8.

gelinkte lijst
Gelinkte lijst van bestanden waaraan het virus extra regels heeft toegevoegd om een ASCII-tekening verbergen.

Schrijf een bash shell script christmas waarmee een ASCII-tekening die door het Christmas Tree EXEC virus in het bestandssysteem verborgen werd naar stdout kan uitgeschreven worden. Aan dit script moet één argument doorgegeven worden: de padnaam (absoluut of relatief) van het eerste bestand waaraan het virus extra regels heeft toegevoegd. Daarnaast moet het shell script de volgende opties ondersteunen:

Het script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen eventueel samengenomen worden, argument bij een optie moet niet noodzakelijk van de optieletter gescheiden worden door witruimte, …. Daarnaast moet het script de volgende foutafhandeling voorzien:

Het script moet stoppen met exit status 0 van zodra aan één van de volgende voorwaarden voldaan is:

Deze voorwaarden gelden ook voor het eerste bestand waarin het shell script moet zoeken.

Voorbeeld

Onderstaande voorbeeldsessie toont hoe het shell script christmas moet kunnen gebruikt worden. In dit ZIP-bestand9 vind je naast de test1 directory die hier gebruikt wordt (en die correspondeert met de figuur uit de opgave), ook alle andere directories die bij het testen van je ingediende oplossing gebruikt worden.

$ christmas -q 0 test1/board/yourself.mp4
Syntax: christmas [-m] [-n integer] [-s integer] FILE
$ echo $?
1        
$ christmas -n yo test1/board/yourself.mp4
Syntax: christmas [-m] [-n integer] [-s integer] FILE
$ echo $?
2
$ christmas -n 0 test1/board/yourself.mp4
Syntax: christmas [-m] [-n integer] [-s integer] FILE
$ echo $?
2
$ christmas -s lo test1/board/yourself.mp4
Syntax: christmas [-m] [-n integer] [-s integer] FILE
$ echo $?
3
$ christmas -s 0 test1/board/yourself.mp4
Syntax: christmas [-m] [-n integer] [-s integer] FILE
$ echo $?
3
$ christmas
Syntax: christmas [-m] [-n integer] [-s integer] FILE
$ echo $?
4
$ christmas -n 2 test1/board/yourself.mp4
                *
                *
               ***
              *****
             *******
            *********
          *************                A
             *******
           ***********                VERY
         ***************
       *******************            HAPPY
           ***********
         ***************            CHRISTMAS
       *******************
     ***********************         AND MY
         ***************
       *******************         BEST WISHES
     ***********************
   ***************************     FOR THE NEXT
             ******
             ******                    YEAR
             ******
$ echo $?
0
$ christmas test1/board/yourself.mp4
                *
               ***
             *******
          *************                A
           ***********                VERY
       *******************            HAPPY
         ***************            CHRISTMAS
     ***********************         AND MY
       *******************         BEST WISHES
   ***************************     FOR THE NEXT
             ******                    YEAR
$ echo $?
0

Epiloog

Voor we jullie met deze opgave op wilde ideeën zouden brengen, wijzen we graag toch nog eens op "Reglement voor correct gebruik van de ICT-infrastructuur van de Universiteit Gent10". Zeker voor mensen met geavanceerde Unix-skills geldt:

With great power comes great responsibility.

Enkele jaren gelden is een UGent-student erin geslaagd om op kerstavond drie uur lang alle mailverkeer aan de UGent lam te leggen. Je zal begrijpen dat de systeembeheerder die die avond wachtdienst had daar niet zo mee opgezet was. Gevolg: de UGent-account van de student werd afgesloten, waardoor hij bij aanvang van de blok geen enkele toegang meer had tot de online diensten van de UGent. Een verwittigd man of vrouw is er twee waard …