Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 20

Thema: [NYC09] - 04 - Crazy Scripting

  1. #1
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    [NYC09] - 04 - Crazy Scripting

    Crazy Scripting ist der NYC09-Beitrag aus dem Bereich Unix-Systeme, der sich heuer mit Shell-Scripting befasst.

    Den Titel haben wir nicht umsonst gewählt - der Name ist Programm, denn die beiden Teilaufgaben von Crazy Scripting stellen Aufgaben, die unter den meisten Betriebssystemen nur durch das Abrufen von Informationen mittels SysCalls lösbar sind, und daher Programmiersprachen wie z.B. C erfordern.
    Das Design der Unix-Systeme ermöglicht den Zugriff auf die nötigen Informationen aber wesentlich einfacher - mehr wird aber nicht verraten.

    Index
    • Teilaufgaben der Crazy Scripting Challenge
    • Aufgabenstellungen
    • Erlaubte Mittel
    • Nicht erlaubte Mittel



    Teilaufgaben der Crazy Scripting Challenge
    1. Passwortgenerator
    2. Primary Partition Viewer

    Aufgabenstellungen

    1. Passwortgenerator
    Zu scripten ist ein Passwort-Generator, der Passwörter erzeugt, die folgende Anforderungen erfüllen:
    • Das Passwort ist 8 Zeichen lang
    • Mindestens 1 Zeichen ist ein Großbuchstabe
    • Mindestens 1 Zeichen ist ein Kleinbuchstabe
    • Mindestens 1 Zeichen ist eine Zahl (0-9) oder eines der folgenden Sonderzeichen:
      Code:
      "#$%&'()*+,-./
      (Hinweis: Das sind einschließlich der Zahlen die ASCII-Codes 33 bis 57)


    Der Passwortgenerator muss nicht höchsten kryptografischen Ansprüchen genügen, d.h. ich werde keinen mathematischen Beweis dafür antreten, dass die Wahrscheinlichkeit für das Auftreten jedes Zeichens an jeder Stelle gleich hoch ist.
    Er sollte aber schon soweit zufällig sein, dass er keinen erkennbaren Mustern folgt (also nicht z.B. den einzigen Großbuchstaben immer an 2. Stelle o.ä.)

    Das Passwort wird ganz normal in einer Zeile auf stdout ausgegeben (z.B. echo, printf, ..., 8 Byte und Zeilenumbruch)

    2. Primary Partition Viewer
    Zu scripten ist ein Primary Partition Viewer, also ein Script, das die Eigenschaften der 4 primären Partitionen eines Datenträgers aus dem Master-Boot-Record liest und anzeigt.

    Auszugeben sind folgende Informationen für jede der primären Partitionen:
    • Start-Cylinder, -Head, -Sector der Partition (Hinweis: bei großen Disks steht da für die meisten Partitionen 1024, 254, 63, das ist kein Bug)
    • Linearer Start-Sektor der Partition
    • Anzahl der Sektoren in der Partition
    • Partitionstyp (Zahl reicht, eleganter wäre es, wenn das Script einige wichtige Filesysteme benennen kann)
    • Größe der Partition in Megabyte (mit Faktor 1 Megabyte = 1048576 Byte)


    Der Output sollte ungefähr so aussehen:

    Code:
    PARTITION 0
        C=0 H=1 S=1
        Start sector 63, 157292352 sectors, 76802 MB
        Partiton type is 7 (HPFS / NTFS)
    
    PARTITION 1
        C=1023 H=254 S=63
        Start sector 157292415, 31471335 sectors, 15366 MB
        Partiton type is 131 (Linux native)
    
    PARTITION 2
        C=1023 H=254 S=63
        Start sector 188763750, 123812955 sectors, 60455 MB
        Partiton type is 15 (Extended partition with BIOS extension)
    
    PARTITION 3
        C=0 H=0 S=0
        Start sector 0, 0 sectors, 0 MB
        Partiton type is 0 (unused)
    Sinn und Zweck des Scripts ist es, den Output ohne Benutzung von fdisk zu erzeugen, also fdisk | awk | grep etc. ist klarerweise keine gültige Lösung.

    Wo der Master-Boot-Record steht und wie er aufgebaut ist weiß Google.

    Erlaubte Mittel
    Gescriptet werden darf mit:
    sh, bash, csh, tcsh, ksh (=ksh88), ksh93, zsh

    Erlaubt sind außerden alle gängigen Standard-Unix-Befehle wie:
    awk, cat, cd, chgrp, chmod, chown, cmp, cp, cpio, cut, dd, df, diff, du, echo
    false, file, grep, less, ln, ls, mkdir, mkfifo, more, mv, patch, ps, rm, tee, true,
    etc. (Liste nicht vollständig)

    Wer sich nicht sicher ist, ob ein bestimmtes Utility erlaubt ist, kann per PN oder in diesem Thread fragen.

    Zusätzlich ist folgendes C-Programm erlaubt, um euch die Aufgabe etwas zu erleichtern, da die Shells nicht gerade optimal mit binären Daten umgehen können:
    Code:
    /* asciival.c */
    #include <unistd.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main(int argc, char* argv[], char* envp[])
    {
        int c;
    
        c = fgetc(stdin);
        if (c == EOF)
        {
            fputs("256\n", stdout);
            return 1;
        } else {
            fprintf(stdout, "%u\n", (unsigned int) c);
        }
    
        return 0;
    }
    Kompiliert wird mit
    Code:
    gcc -o asciival asciival.c
    Das Programm liest ein Byte von stdin und gibt auf stdout den numerischen Wert des Bytes aus.

    Nicht erlaubte Mittel
    Nicht erlaubt sind sämtliche sonstigen Script-Sprachen, der Aufruf von zusätzlichen Utilities, die normalerweise nicht auf einem Unix-System zu finden sind, udgl.

    Dazu gehören unter anderem:
    perl, python, ruby, java, systemspezifische Administrations-Werkzeuge wie prtconf, cfgadm udgl.

    Viel Spaß!

    Fragen zur Challenge dürfen in diesem Thread oder per PN gestellt werden, solange dadurch keine Hinweise zur Lösung gegeben werden.
    Antworten auf Fragen die per PN gestellt werden und die von allgemeinem Interesse sind (z.B. bzgl. erlaubter Hilfsmittel) werden von mir in diesem Thread veröffentlicht.

    Weitere Informationen zum Einsenden der Lösung folgen.
    Segmentation fault (core dumped)

  2. #2
    Registered User
    Registriert seit
    May 2005
    Beiträge
    92
    Renommee
    61

    Re: [NYC09] - 04 - Crazy Scripting

    Kurze Frage: Bei den Sonderzeichen sagst du, dass inklusive Zahlen der Bereich 33-57 gemeint ist. Da gehört aber das Ausrufezeichen noch dazu "!".. Das ist die Nummer 33.

    Soll das nun mit einbezogen werden oder nicht?
    7 Bier sind auch ein Schnitzel, aber dann hat man noch nichts getrunken

    www.smikey.de

  3. #3
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    Re: [NYC09] - 04 - Crazy Scripting

    Hi,

    stimmt, das ! gehört dazu, und sollte drinnen sein. Falls es jetzt jemand weggelassen hat, zählt es aufgrund der zweideutigen Angabe nicht als Fehler.

    Auf Anfrage von alamar zu dem Partitionviewer:

    uuencode ist ein weit verbreitetes Standard-Unix-Utility und ist als Hilfsmittel zugelassen (auch uuencode-Varianten, die base64 beherrschen)

    hexdump ist zwar nicht so verbreitet wie uuencode, jedoch unter BSD und Linux gängig, und der Scriptingaufwand wird durch den Einsatz von hexdump nicht vereinfacht, das Utility ist daher zugelassen
    Segmentation fault (core dumped)

  4. #4
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    Re: [NYC09] - 04 - Crazy Scripting

    Einsenden der Lösungen

    Lösungen werden gepackaged (ZIP oder .tar.gz) und per E-Mail gesendet an:
    golf dot bravo oscar bravo bravo yankee at golf mike xray dot alpha tango

    Im E-Mail sollte noch dabeistehen, für welche Shells und Utilities die Scripte geschrieben wurden.
    Segmentation fault (core dumped)

  5. #5
    Registered User
    Registriert seit
    Mar 2001
    Beiträge
    2.020
    Renommee
    1465

    Re: [NYC09] - 04 - Crazy Scripting

    OffTopic:
    lol ..... rock oscar golf enter rock space tango hawk alpha tango ....

  6. #6
    Rodnox' Leibeigener
    Registriert seit
    Jan 2001
    Beiträge
    1.056
    Renommee
    276

    Re: [NYC09] - 04 - Crazy Scripting

    Zitat Zitat von Rodnox Beitrag anzeigen
    OffTopic:
    lol ..... rock oscar golf enter rock space tango hawk alpha tango ....
    OffTopic:

    Im Natoalphabet wäre das allerdings Romeo Oscar Golf Echo Romeo space Tango Hotel Alpha Tango :-P
    'Niedergang beginnt mit dem Sieg' Günter Grass

    "Wir sind die Kegler.
    Und wir selbst sind die Kugel.
    Aber wir sind auch die Kegel, die stürzen.
    Die Kegelbahn, auf der es donnert, ist unser Herz."
    Wolfgang Borchert
    ________________________________________________
    Ich prostituier mich für Rodnox!

  7. #7
    Registered User
    Registriert seit
    Mar 2001
    Beiträge
    2.020
    Renommee
    1465

    Re: [NYC09] - 04 - Crazy Scripting

    OffTopic:
    bin ich froh das ich nie beim Bund war ...

  8. #8
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    Re: [NYC09] - 04 - Crazy Scripting

    Information zur Challenge-Auswertung

    Die Einsendungen zur Crazy-Scripting-Challenge sind ausgewertet. Detailinformationen zum Ergebnis werden erst nach Veröffentlichung des Gesamtergebnisses bekanntgegeben.

    Auswertungsmethoden

    Zur Auswertung der Passwort-Generatoren wurden mit jedem eingesendeten Passwort-Generator insgesamt 6000 Passwörter generiert (1 x 1000 + 1 x 5000). Diese Passwörter wurden jeweils mit einer Prüfsoftware auf Erfüllung aller Kriterien überprüft. Zusätzlich wurden die generierten Passwörter in Stichproben manuell überprüft, und die Passwort-Generatoren einer groben Source-Analyse unterzogen.

    Für die Auswertung der Partition-Viewer wurden jeweils insgesamt fünf verschiedene Partition-Tables mit den eingesendeten Scripts ausgewertet. Die Festplatten, von denen diese Partitiontables entnommen wurden, haben sehr unterschiedliche Größen, beinhalten unterschiedliche Dateisysteme und Betriebssysteme, unterschiedlich viele und teilweise eher ungewöhnliche Partitionen (z.B. eine ungefähr 3 Megabyte große OS/2-Bootloader-Partition).
    Die Ergebnisse wurden mit Daten verglichen, die das Referenz-Script oder fdisk/Linux ausgibt, und die manuell per Hexeditor aus Dumps der Boot-Records gelesen und nachgerechnet wurden.

    Wie geht's weiter?

    • Nach Veröffentlichung des Gesamtergebnisses der New Year's Challenge 2009 wird der/die GewinnerIn der Crazy Scripting Challenge bekanntgegeben
    • Die Referenz-Scripte werden veröffentlicht
    • Nähere Informationen zur Anzahl der Einsendungen, den Teilnehmern und den Ergebnissen werden veröffentlicht
    • Sofern die Einsender zustimmen, können auch eingesendete Scripte veröffentlich werden
    Segmentation fault (core dumped)

  9. #9
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    Re: [NYC09] - 04 - Crazy Scripting

    Auswertung der Crazy Scripting Challenge
    Zur Crazy Scripting Challenge gab es Einsendungen von 4 Teilnehmern (alamar, CryptoCrack, destructor, Xinorcimo), die jeweils für beide Teilaufgaben ihre Scripts eingesendet haben.

    Bei der Crazy Scripting Challenge konnte Xinorcimo die meisten Punkte für die Gesamtwertung der NYC 2009 holen, er ist somit der Gewinner der Crazy Scripting Challenge.

    Die öffentliche Diskussion der Crazy Scripting Challenge ist eröffnet.

    Details zum Lösungsweg, incl. Veröffentlichung der Referenz-Scripte, folgen.
    Segmentation fault (core dumped)

  10. #10
    Administrator
    Registriert seit
    Jun 2001
    Beiträge
    1.332
    Renommee
    302

    Re: [NYC09] - 04 - Crazy Scripting

    Hier ist der Ansatz, den ich für die erste Aufgabe verfolgte:

    1. Zufallsgenerator initialisieren
    2. Zahlen von 1-8 durcheinanderwürfeln
    3. 4x1 Zeichen aus allen erlaubten zufällig ermitteln und anhängen
    4. 1x1 Großbuchstabe zufällig ermitteln und anhängen
    5. 1x1 Kleinbuchstabe zufällig ermitteln und anhängen
    6. 1x1 Zahl zufällig ermitteln und anhängen
    7. 1x1 Sonderzeichen zufällig ermitteln und anhängen
    8. Analog der im Schritt 2 ermittelten Folge die Zeichenfolge verwürfeln
    9. Zeichenfolge ausgeben
    10. entfernen aller Kommentare, um es octogen nicht zu leicht zu machen


    Quellcode - Passwortgenerator in awk - nicht schön aber crazy:

    Spoiler:

    Code:
    #!/usr/bin/awk -f
    BEGIN {
        srand();
        k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"#$%&\047()*+,-./";
        for (i=0;i<8;i++) {r=int(rand()*8)+1; if (!i || !match(a,r)) a=a r; else i--;}
        for (i=0;i<4;i++) {r=int(rand()*length(k))+1; h=h substr(k,r,1);}
        r=int(rand()*26)+1; h=h substr(k,r,1);
        r=int(rand()*26)+27; h=h substr(k,r,1);
        r=int(rand()*10)+53; h=h substr(k,r,1);
        r=int(rand()*15)+63; h=h substr(k,r,1);
        for (i=1;i<9;i++) {p=p substr(h,substr(a,i,1),1);}
        print p;
    }


    Xinorcimo
    The economics of the future are somewhat different. Money doesn't exist in the 24th Century. The acquisition of wealth is no longer the driving force in our lives. We work to better ourselves and the rest of humanity.

  11. #11
    Registered User
    Registriert seit
    Mar 2001
    Beiträge
    2.020
    Renommee
    1465

    Re: [NYC09] - 04 - Crazy Scripting

    lol ... punkt 10 ist wichtig. ich weiss nicht ob octogen sich die muehe gemacht hat euch alle nochmal einzeln anzuschreiben, aber soweit ich das sehe bittet er zuerst um euer einverstaendniss die eingesandten scripte veroeffentlichen zu duerfen.

  12. #12
    Administrator
    Registriert seit
    Jun 2001
    Beiträge
    1.332
    Renommee
    302

    Re: [NYC09] - 04 - Crazy Scripting

    Der Tragödie zweiter Teil - wie zeige ich Partitionen ohne fdisk an. Ich hab auf jeglichen Schnickschnack verzichtet - auch das Prüfen der Parameter - root muss wissen, was er tut. Auch Kommentare habe ich octogen wieder mal nicht gegönnt.

    1. Lesen einer einzigen Wiki-Seite, in der der Aufbau einer Partionionstabelle beschrieben ist:
      http://de.wikipedia.org/wiki/Partitionstabelle
      .
    2. Kopieren der ersten 512 Bytes des ersten Sektors (MBR) auf die Standardausgabe - Ergebnis ist binär und wenig hilfreich
      Code:
      dd if=/dev/sda bs=512 count=1 2>/dev/null
    3. Umwandeln der binären Ausgabe mittels xxd - 64 Zeichen ab Offset 446 (0x1be) mit 16 Zeichen pro Zeile und separiert nach jedem Zeichen. So habe ich als Ergebnis eine Zeile pro Partition.
      Code:
      xxd -s 446 -l 64 -c 16 -g 1
      Das Ganze ergibt dann z.B. folgende Ausgabe:
      Code:
      00001be: 80 01 01 00 83 fe bf 8c 3f 00 00 00 0e 12 a0 00  ........?.......
      00001ce: 00 00 81 8d 82 fe ff ff 4d 12 a0 00 8a f5 7f 00  ........M.......
      00001de: 00 fe ff ff 83 fe ff ff d7 07 20 01 b5 eb 57 07  .......... ...W.
      00001ee: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    4. Um in awk mit den jeweiligen Werten in Hex rechnen zu können, jage ich den sed drüber, um die Zahlen im richtigen Format zu haben:
      Code:
      sed 's/ / 0x/g'
      Danach sieht der Spaß so aus (ohne die rote Hilfszeile!) - nicht schön aber brauchbar:
      Code:
      00001be: 0x80 0x01 0x01 0x00 0x83 0xfe 0xbf 0x8c 0x3f 0x00 0x00 0x00 0x0e 0x12 0xa0 0x00 0x 0x........?.......
      00001ce: 0x00 0x00 0x81 0x8d 0x82 0xfe 0xff 0xff 0x4d 0x12 0xa0 0x00 0x8a 0xf5 0x7f 0x00 0x 0x........M.......
      00001de: 0x00 0xfe 0xff 0xff 0x83 0xfe 0xff 0xff 0xd7 0x07 0x20 0x01 0xb5 0xeb 0x57 0x07 0x 0x.......... 0x...W.
      00001ee: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x 0x................
      $1       $2   $3   $4   $5   $6   $7   $8   $9   $10  $11  $12  $13  $14  $15  $16  $17  $piepsegal
    5. Der Rest ist die wilde Rechnerei und die fertige Ausgabe mit awk. A ist der Startsector, B die Anzahl der Sektoren, C die Anzahl Zylinder, H die Anzahl der Köpfe, S die Anzahl der Sektoren.
      Code:
      awk '
       {printf "PARTITION %d\n",y++}
       {A=strtonum($10)+strtonum($11)*256+strtonum($12)*65536+strtonum($13)*16777216}
       {B=strtonum($14)+strtonum($15)*256+strtonum($16)*65536+strtonum($17)*16777216}
       {H=strtonum($3);S=strtonum($4)%64;C=strtonum($5)+int(strtonum($4)/64)*256}
       {printf "C=%d H=%d S=%d\n",C,H,S}
       {printf "Start sector %d, %d sectors, %d MB\n",A,B,int(B/1048576)*512}
       {printf "Partition type is %d (%s)\n\n",strtonum($6),$6}
      '
      Danach siehts so z.B. aus:
      Code:
      PARTITION 0
      C=0 H=1 S=1
      Start sector 63, 10490382 sectors, 5120 MB
      Partition type is 131 (0x83)
      
      PARTITION 1
      C=653 H=0 S=1
      Start sector 10490445, 8385930 sectors, 3584 MB
      Partition type is 130 (0x82)
      
      PARTITION 2
      C=1023 H=254 S=63
      Start sector 18876375, 123202485 sectors, 59904 MB
      Partition type is 131 (0x83)
      
      PARTITION 3
      C=0 H=0 S=0
      Start sector 0, 0 sectors, 0 MB
      Partition type is 0 (0x00)

    Als Parameter für das Script muss der Gerätename der Platte angegeben werden: z.b.:
    Code:
    partview /dev/sda
    Hier nochmal das komplette Script - wozu auch immer man sowas braucht:
    Spoiler:

    Code:
    #!/bin/bash
    dd if=$1 bs=512 count=1 2>/dev/null \
     | xxd -s 446 -l 64 -c 16 -g 1 \
     | sed 's/ / 0x/g' \
     | awk '
     {printf "PARTITION %d\n",y++}
     {A=strtonum($10)+strtonum($11)*256+strtonum($12)*65536+strtonum($13)*16777216}
     {B=strtonum($14)+strtonum($15)*256+strtonum($16)*65536+strtonum($17)*16777216}
     {H=strtonum($3);S=strtonum($4)%64;C=strtonum($5)+int(strtonum($4)/64)*256}
     {printf "C=%d H=%d S=%d\n",C,H,S}
     {printf "Start sector %d, %d sectors, %d MB\n",A,B,int(B/1048576)*512}
     {printf "Partition type is %d (%s)\n\n",strtonum($6),$6}
     '


    PS: octogen hat mich zwar noch nicht angeschrieben - aber wie man sieht, hat er meine Zustimmung
    Xinorcimo
    Geändert von xinorcimo (17.02.2009 um 23:37 Uhr)
    The economics of the future are somewhat different. Money doesn't exist in the 24th Century. The acquisition of wealth is no longer the driving force in our lives. We work to better ourselves and the rest of humanity.

  13. #13
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    Re: [NYC09] - 04 - Crazy Scripting

    Danke Xinorcimo für's Posten und Kommentieren seines Beitrags, genau so war's gedacht.


    Mit der Lösung jeder der beiden Teilaufgaben konnten 5 Punkte erreicht werden.

    Xinorcimo hat insgesamt 8 Punkte erhalten - 4 für den Password-Generator und nochmal 4 für den Partition Viewer.


    Die Crazy Scripting Challenge hatte ein sehr interessantes und knappes Ergebnis.


    Die Passwort-Generatoren

    Xinorcimo's Passwort-Generator liefert immer gültige Passwörter, und ist als Einziger vollständig mit awk programmiert. Trotzdem ist bei den Tests eine einzige kleine Schwäche aufgetreten: Zwei Aufrufe des Generators in der selben Sekunde führten zum selben generierten Passwort - eine nicht gut, aber immerhin dokumentierte Schwäche von awk sind nämlich die Zufallsgenerator-Funktionen.

    alamar hatte einen Passwort-Generator eingesendet, der sich im Test überhaupt keine Schwächen geleistet hat, und damit sogar 5 Punkte für diese Teilaufgabe erhalten.

    Die Passwort-Generatoren von destructor und CryptoCrack sind über kleine, aber schwerwiegendere Fehler gestolpert.

    CryptoCrack's Generator verwendet zwar alle drei Zeichenkategorien, aber stellt nicht sicher, dass immer Zeichen aus allen Zeichenkategorien im Passwort enthalten sind - womit ungefähr 8 % der Passwörter von der Test-Software als fehlerhaft markiert wurden.

    destructor's Generator ist vom Prinzip her eigentlich eine elegante Lösung. Ein kleiner Fehler hat allerdings zu vergleichsweise großen Auswirkungen geführt. Immer, wenn ein Passwort generiert wurde, das einen Stern (*) enthält, hat die Shell diesen expandiert und in das Passwort eingefügt.
    Somit enthielten ungefähr 10% der Passwörter ein Directory-Listing des jeweiligen Verzeichnisses, und waren natürlich auch nicht mehr 8 Zeichen lang.
    Die Ursache dafür ist eine Variable im Shellscript, die nicht in Anführungszeichen eingeschlossen ist.

    Aus nur dieser Teilaufgabe alleine ging somit alamar als Sieger hervor.

    Die Partition Viewer

    Auch Xinorcimo's Partition-Viewer funktioniert bis auf einen kleinen Schönheitsfehler im Prinzip problemlos. Nur die Reihenfolge der Partitionsgrößenberechnung (int(B/1048576*512)) kostet Präzision.
    Zuerst zu multiplizieren und dann zu dividieren hätte präzisere Angaben geliefert, und die Multiplikation der 32-bit-Zahlen mit 512 nutzt den möglichen Zahlenbereich der 64-bit-Shellvariablen gängiger moderner Shells wie bash, zsh, ksh udgl. nicht aus.

    Die Partition Viewer von destructor und CryptoCrack ließen im Test keine Schwächen erkennen, dafür gab's wieder jeweils 5 Punkte.

    alamar's Partition Viewer hatte allerdings mathematische Probleme. Bei den Cylinders, Heads, Sectors - Angaben hatten sich einige Bits verirrt, und soweit ich mich erinnere, war auch irgendetwas vertauscht.

    Sieger nur dieser Teilaufgabe alleine wären somit destructor und CryptoCrack gewesen.


    ...und das Ergebnis...

    Irgendwie gefällt mir dieses Ergebnis - jeder hat irgendwo gewonnen; alamar beim Passwort-Generator, destructor und CryptoCrack beim Partition-Viewer, und Xinorcimo dank zweier guter aber nur fast perfekter Scripte die Gesamtwertung der Crazy Scripting Challenge.

    Interessanter und knapper hätte es nicht ausgehen können.
    Segmentation fault (core dumped)

  14. #14
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    sos Re: [NYC09] - 04 - Crazy Scripting

    Referenz-Scripts

    Die folgenden beiden Scripte sind die Referenz-Scripte, die als Proof-of-Concept programmiert wurden, also um festzustellen, ob die beiden gestellten Teilaufgaben mittels Shellprogrammierung überhaupt lösbar sind. Der Sourcecode des darin verwendeten Utility's "asciival" findet sich bereits weiter oben in der Aufgabenstellung zur Crazy Scripting Challenge.

    Die Referenzscripte laufen unter Korn Shell (ksh); getestet wurde mit ksh88; mit ksh93 wurde nur fallweise getestet, die Letztversion der Scripte habe ich damit nicht mehr ausprobiert, sie sollten aber auch in ksh93 laufen.

    reference-pwdgen (password generator)
    Spoiler:
    Code:
    #!/bin/ksh
    #
    #  BuHa-Security https://www.buha.info
    # ------------------------------------- 
    #  |\\  |]\\    ///CCCC\  0000   0999
    #  ||\\ || \\  //|/      0    0 9    9
    #  || \\||  \VV/ ||      0    0  99999
    #  ||  \||   YY  |\      0    0      9
    #  [|   \|   YY   \CCCC/  0000  99999
    # -------------------------------------
    #            New Year's Challenge 2009
    #
    #  UNIX/Linux - Crazy Scripting
    # =====================================
    #
    #           PASSWORD GENERATOR
    #            REFERENCE SCRIPT
    #
    #  Copyleft January 2009 by octogen
    #  No rights reserved
    #
    #           "We are all geniuses...
    #            ...up to the age of ten."
    #                      (Aldous Huxley)
    #
    # =====================================
    #
    
    # get a random number
    rnd()
    {
        val="$(dd if=/dev/urandom of=/dev/stdout bs=1 count=1 2>&- | ./asciival 2>&-)"
    
        # asciival returns 256 to indicate an error
        if [ "${val}" == 256 ]; then
            echo "Unable to read random numbers from /dev/urandom\n" >&2
            exit 1
        fi
    }
    
    # build an array of capital letters
    initcaps()
    {
        idx=0
        
        c=65
        while [ "${c}" -lt 92 ]; do
            caps[${idx}]="$(printf "\\$(printf "%o" "${c}")")"
            c=$((${c} + 1))
            idx=$((${idx} + 1))
        done
    }
    
    # build an array of lowercase letters
    initlcls()
    {
        idx=0
    
        c=97
        while [ "${c}" -lt 124 ]; do
            lcls[${idx}]="$(printf "\\$(printf "%o" "${c}")")"
            c=$((${c} + 1))
            idx=$((${idx} + 1))
        done
    }
    
    # build an array of special characters and numbers
    initscs()
    {
        idx=0
    
        c=33
        while [ "${c}" -lt 58 ]; do
            scs[${idx}]="$(printf "\\"$(printf "%o" "${c}"))"
            c=$((${c} + 1))
            idx=$((${idx} + 1))
        done
    }
    
    
    # initialize character arrays
    initcaps
    initlcls
    initscs
    
    # mark index of each character class as unset
    caps_idx=-1
    lcls_idx=-1
    scs_idx=-1
    
    # get a random index for each character class
    while [ "${caps_idx}" == -1 ] || [ "${lcls_idx}" == -1 ] || [ "${scs_idx}" == -1 ]; do
        if [ "${caps_idx}" == -1 ]; then
            rnd
            caps_idx=$((${val} % 8))
        fi
        if [ "${lcls_idx}" == -1 ]; then
            rnd
            lcls_idx=$((${val} % 8))
        fi
        if [ "${scs_idx}" == -1 ]; then
            rnd
            scs_idx=$((${val} % 8))
        fi
    
        # detect collisions and repeat index randomization
        if [ "${lcls_idx}" == "${caps_idx}" ]; then
            lcls_idx=-1
        fi
        if [ "${scs_idx}" == "${caps_idx}" ] || [ "${scs_idx}" == "${lcls_idx}" ]; then
            scs_idx=-1
        fi
    done
    
    # create a new password
    passwd=""
    idx=0
    while [ "${idx}" -lt 8 ]; do
        if [ "${idx}" == "${caps_idx}" ]; then
            rnd
            val=$((${val} % 26))
            passwd="${passwd}${caps[${val}]}"
        elif [ "${idx}" == "${lcls_idx}" ]; then
            rnd
            val=$((${val} % 26))
            passwd="${passwd}${lcls[${val}]}"
        elif [ "${idx}" == "${scs_idx}" ]; then
            rnd
            val=$((${val} % 24))
            passwd="${passwd}${scs[${val}]}"
        else
            rnd
            val=$((${val} % 3))
            case "${val}" in
                0)
                    rnd
                    val=$((${val} % 26))
                    passwd="${passwd}${caps[${val}]}"
                    ;;
                1)
                    rnd
                    val=$((${val} % 26))
                    passwd="${passwd}${lcls[${val}]}"
                    ;;
                *)
                    rnd
                    val=$((${val} % 24))
                    passwd="${passwd}${scs[${val}]}"
                    ;;
            esac
        fi
    
        idx=$((${idx} + 1))
    done
    
    echo "${passwd}"



    reference-partview (partition viewer)
    Spoiler:
    Code:
    #!/bin/ksh
    #
    #  BuHa-Security https://www.buha.info
    # ------------------------------------- 
    #  |\\  |]\\    ///CCCC\  0000   0999
    #  ||\\ || \\  //|/      0    0 9    9
    #  || \\||  \VV/ ||      0    0  99999
    #  ||  \||   YY  |\      0    0      9
    #  [|   \|   YY   \CCCC/  0000  99999
    # -------------------------------------
    #            New Year's Challenge 2009
    #
    #  UNIX/Linux - Crazy Scripting
    # =====================================
    #
    #  PARTITION VIEWER REFERENCE SCRIPT
    #
    #  Copyleft January 2009 by octogen
    #  No rights reserved.
    #  No lefts reserved as well. I hope
    #  everything was left right in this
    #  script, alright? And I guess I
    #  should have left more whisky right
    #  in that bottle before writing
    #  copyleft notices... ^Hicks
    #
    # =====================================
    #
    
    # get data from a specific address in the input file
    getval()
    {
        val=$(dd if=${infile} of=/dev/stdout bs=1 count=1 skip=$((${offset} + ${1})) 2>&- | ./asciival 2>&-)
    
        # asciival returns 256 to indicate an error
        if [ "${val}" == 256 ]; then
            echo "Failed to read data from ${infile}" >&2
            exit 1
        fi
    }
    
    getchs()
    {
        # calculate cylinders, heads, sectors
        # from the 3 bytes of input data
        heads=${chs_b0}
        sectors=$((${chs_b1} & 63))
        cyls=$((${chs_b2} + ((${chs_b1} & 192) << 2)))
    
        # sample code:
        #
        # use something like this if your shell can not
        # perform binary arithmetics like bit shifting,
        # logical and/or/xor, etc.
        #
        # if [ "${sectors}" -ge 128 ]; then
        #     sectors=$((${sectors} - 128))
        # fi
        # if [ "${sectors}" -ge 64 ]; then
        #     sectors=$((${sectors} - 64))
        # fi
        #
        # cyls=${chs_b2}
        # if [ "${chs_b1}" -ge 128 ]; then
        #     cyls=$((${cyls} + 512))
        #     if [ "${chs_b1}" -ge 192 ]; then
        #         cyls=$((${cyls} + 256))
        #     fi
        # elif [ "${chs_b1}" -ge 64 ]; then
        #     cyls=$((${cyls} + 256))
        # fi
    
    }
    
    getpart()
    {
        # calculate offset of the current partition entry
        offset=$((446 + (${part} * 16)))
    
        # read cylinders/heads/sectors bytes
        getval 1
        chs_b0=${val}
        getval 2
        chs_b1=${val}
        getval 3
        chs_b2=${val}
    
        # read partition type byte
        getval 4
        part_type=${val}
        
        # read and calculate start sector
        getval 8
        str_sect=${val}
        getval 9
        str_sect=$((${str_sect} + (${val} << 8)))
        getval 10
        str_sect=$((${str_sect} + (${val} << 16)))
        getval 11
        str_sect=$((${str_sect} + (${val} << 24)))
    
        # read and calculate number of sectors in partition
        getval 12
        p_sectors=${val}
        getval 13
        p_sectors=$((${p_sectors} + (${val} << 8)))
        getval 14
        p_sectors=$((${p_sectors} + (${val} << 16)))
        getval 15
        p_sectors=$((${p_sectors} + (${val} << 24)))
    
        # calculate partition size
        p_size=$((${p_sectors} * 512))
        p_size_mb=$((${p_size} / 1048576))
    }
    
    getparttype()
    {
        # beautify filesystem type label for some
        # well-known partition types
        case "${part_type}" in
            "0")
                part_type="${part_type} (unused)"
                ;;
            "1")
                part_type="${part_type} (FAT12)"
                ;;
            "4")
                part_type="${part_type} (FAT16 < 32 MB)"
                ;;
            "5")
                part_type="${part_type} (Extended partition)"
                ;;
            "6")
                part_type="${part_type} (FAT16 > 32 MB)"
                ;;
            "7")
                part_type="${part_type} (HPFS / NTFS)"
                ;;
            "11")
                part_type="${part_type} (FAT32)"
                ;;
            "12")
                part_type="${part_type} (FAT32 with BIOS extension)"
                ;;
            "13")
                part_type="${part_type} (FAT16 > 32 MB with BIOS extension)"
                ;;
            "15")
                part_type="${part_type} (Extended partition with BIOS extension)"
                ;;
            "130")
                part_type="${part_type} (Linux swap / Solaris)"
                ;;
            "131")
                part_type="${part_type} (Linux native)"
                ;;
            "142")
                part_type="${part_type} (Linux LVM)"
                ;;
            "165")
                part_type="${part_type} (FreeBSD)"
                ;;
            "166")
                part_type="${part_type} (OpenBSD)"
                ;;
            "169")
                part_type="${part_type} (NetBSD)"
                ;;
            *)
                part_type="${part_type} (unknown)"
                ;;
        esac
    }
    
    if [ "${1}" == "" ]; then
        echo "Syntax ${0} <filename>" >&2
        exit 1
    fi
    
    infile="${1}"
    
    if [ ! -a "${infile}" ]; then
        echo "File ${infile} not found" >&2
        exit 1
    fi
    
    part=0; while [ "${part}" -lt 4 ]; do
        getpart
        getchs
        getparttype
    
        echo "PARTITION ${part}"
        echo "    C=${cyls} H=${heads} S=${sectors}"
        echo "    Start sector ${str_sect}, ${p_sectors} sectors, ${p_size_mb} MB"
        echo "    Partiton type is ${part_type}"
        echo ""
    
        part=$((${part} + 1))
    done
    Segmentation fault (core dumped)

  15. #15
    Registered User
    Registriert seit
    Feb 2009
    Beiträge
    7
    Renommee
    10

    Re: [NYC09] - 04 - Crazy Scripting

    Glückwunsch den Gewinnern

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. [NYC09] - 07 - IT Security Quiz - Did you know?
    Von Rodnox im Forum Contest Forum
    Antworten: 20
    Letzter Beitrag: 30.01.2009, 16:41
  2. [NYC09] - 05 - RGB Farbraum Analyse
    Von Atlantis im Forum Contest Forum
    Antworten: 4
    Letzter Beitrag: 17.01.2009, 21:41
  3. Kazaa Proxyeinstellungen CRAZY?
    Von Ramuos im Forum Windows
    Antworten: 12
    Letzter Beitrag: 01.12.2003, 23:33
  4. really crazy :)
    Von DirtDevil im Forum Good Sites & Services
    Antworten: 0
    Letzter Beitrag: 30.01.2003, 13:22
  5. Crazy Gravity
    Von Blackboard im Forum Reverse Engineering
    Antworten: 17
    Letzter Beitrag: 16.08.2000, 20:00

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •