Magaz, The Greek Linux Magazine
Magaz Logo

Προηγούμενο  Περιεχόμενα

7. Πρόκληση

7.1 Προηγούμενη πρόκληση - Λύση και Hall Of Fame

Στην προηγούμενη πρόκληση ο σκοπός ήταν να βρείτε ποιος κωδικός αντιστοιχεί στο όνομα σας. Το μεγάλο πρόβλημα που είχα ήταν ότι για να υπάρξει source listing πρέπει εκτός από το compilation με το -g να είναι διαθέσιμο και το αντίστοιχο source αρχείο. Θα μπορούσα απλώς να σας το δώσω και να σας προτρέψω να μην το κοιτάξετε. Κάτι μου λέει όμως ότι πολλοί δε θα μπορούσαν να αντισταθούν στο πειρασμό ;) Για αυτό το λόγο το κυρίως αρχείο είναι απλώς ένα container που περιέχει τόσο το εκτελέσιμο challenge όσο και τον κώδικα του (στοιχειωδώς κρυπτογραφημένο με xor). Κατά την εκτέλεση τα κάνει dump σε δύο κρυφά αρχεία(".ch0src" και ".alfch0") στον τρέχοντα κατάλογο και τρέχει το ".alfch0" ή τον gdb. Τα αρχεία αυτά διαγράφονται μόλις τελειώσει το πρόγραμμα.

Το challenge αυτό καθεαυτό είναι σχετικά απλό, για αυτό και άλλαξα τον πηγαίο κώδικα ώστε να έχει ανούσια ονόματα μεταβλητών και συναρτήσεων. Αρχικά προτρέπει τον χρήστη για το όνομα και τον κωδικό (συνάρτηση "f"), και μετά παράγει δύο αριθμούς, έναν για το όνομα(συνάρτηση "f1") και έναν για τον κωδικό(συνάρτηση "f45"). Aν οι δύο αριθμοί συμπίπτουν και το μήκος το ονόματος και του κωδικού είναι μη μηδενικά τότε όλα ΟΚ!

Η συνάρτηση f1 περιέχει μια πιθανώς one-way hash function (σημ: δεν έχει αποδειχτεί ότι τέτοιες συναρτήσεις υπάρχουν) ενώ η f45 είναι σαφώς αντιστρέψιμη(υπολογιστικά πάντα). Αν και η f45 ήταν δύσκολα αντιστρέψιμη, τότε η πρόκληση θα ήταν πρακτικά άλυτη. Για όσους αρέσκονται στoυς τύπους:

Ν=f1(name)
P=f45(pass)

Εμείς γνωρίζουμε τo name, την f1(), την f45() και μπορούμε να υπολογίσουμε το Ν. Το πρόβλημα είναι να βρούμε το pass ώστε το P να είναι ίσο με το N.

Η f45() είναι:

long int f45(char *s,int l)
{
    unsigned long int h;

    h=strtoul(s,NULL,16);
    if (h!=0) {
        h^=0x55555555;
        if (h&1)
            h^=0x00badbad;
        else
            h^=0x00dabdab;
    }
    return h;
}

Η αντιστρεψιμότητα(υπολογιστική) της f45() βασίζεται στο γεγονός ότι η xor είναι συμμετρική και εδώ έχουμε μόνο xor. Επίσης με το if(h&1) {...} υπάρχει κίνδυνος να κάνουμε την f45() μη αντιστρέψιμη(μαθηματικά) αλλά οι τιμές είναι επιλεγμένες ώστε να μη συμβαίνει αυτό. Βέβαια η μαθηματική μη αντιστρεψιμότητα δεν είναι πρόβλημα, απλώς θα υπήρχαν περισσότεροι από ένας σωστοί κωδικοί για κάθε όνομα.

Επομένως η f_45() (αντίστροφη):

unsigned long f_45(unsigned long h)
{
    unsigned long r;
   
    r=h;

    if (r!=0) {
        r^=0x55555555;
        if (r&1)
            r^=0x00badbad;
        else
            r^=0x00dabdab;
    }
    
    return r;
}

Hall Of Fame

Συγχαρητήρια στους:

1. Λαμπής Μιχαήλ
2. Γιώργος Πρέκας
3. Αρχισυντάκτης (...με ανάγκασε να τον συμπεριλάβω στο hall of fame!)

Για τις δωρεάν συνδρομές ενοχλείστε τον αρχισυντάκτη :)

Ο κώδικας του προηγούμενου challenge: magaz-ch0-src.tar.bz2 (15k)

7.2 Πρόκληση #1

Αυτή τη φορά τα πράγματα είναι κάπως πιο πολύπλοκα. Το εκτελέσιμο δεν περιέχει debugging πληροφορίες. Σκοπός είναι το σύστημα να σας πει ότι το authentication έγινε με επιτυχία. Καλή εξερεύνηση...

Το εκτελέσιμο: challenge1.bz2 (6.3k)

Όσοι επιθυμούν ας μου στείλουν ένα mail εξηγώντας συνοπτικά πως λειτουργεί το πρόγραμμα και τα δεδομένα-απαντήσεις. Αν κάποιος έχει όρεξη ας φτιάξει και έναν key generator! Ως συνήθως όσοι τα καταφέρουν θα μπουν στο επόμενο Hall Of Fame!

Στείλτε σχόλια, διορθώσεις, προσθήκες στο alf82 at freemail dot gr.

Προηγούμενο  Περιεχόμενα


Valid HTML 4.01!   Valid CSS!