Προηγούμενο Περιεχόμενα
Σκοπός του προηγούμενου challenge ήταν να κάνετε
authenticate. Αρχικά το πρόγραμμα διαβάζει 18 bytes από
το αρχείο "auth.key". Αυτά αποτελούν το authentication
key.
Στην όλη διαδικασία του authentication εμπλέκονται επίσης
το username, το όνομα του υπολογιστή και την έκδοση του
πυρήνα. Το πρόγραμμα βρίσκει το username με την κλήση
getpwuid(getuid()). Αυτή επιστρέφει έναν δείκτη σε struct
passwd, το πεδίο pw_name της οποίας περιέχει το login
name. Οι υπόλοιπες δύο πληροφορίες βρίσκονται με την
κλήση uname() που επιστρέφει πληροφορίες για το σύστημα
σε μια δομή struct utsname.
Τα τρία στοιχεία συνδυάζονται για να παραχθεί ένα τελικό
pass-string. Αυτό γίνεται στη συνάρτηση merge().
char *merge(char *u,char *n,char *v)
{
char u1[]="connor";
char n1[]="skynet";
char v1[]="tx2000";
int len=0;
char *r;
int i;
replace(u1,6,u);
Debug("New username: \'%s\'\n",u1);
replace(n1,6,n);
Debug("New nodename: \'%s\'\n",n1);
replace(v1,6,v);
Debug("New kver: \'%s\'\n",v1);
r=malloc(18+1);
if (r==NULL) {
fprintf(stderr,"Internal Error #923\n");
exit(1);
}
i=0;
while (i<6) {
r[i*3]=u1[i];
r[i*3+1]=n1[i];
r[i*3+2]=v1[i];
i++;
}
Debug("Final pass-phrase: \'%s\'\n",r);
return r;
}
Αρχικά τα strings u1, n1, v1 αντικαθίστανται
με τους 6 πρώτους χαρακτήρες των username, nodename και
kernel version αντίστοιχα. Αν κάποιο από τα προηγούμενα
έχει λιγότερους από 6 χαρακτήρες, αντικαθίστανται μόνο όσοι
υπάρχουν. Όλα αυτά τα κάνει η replace().
Oι χαρακτήρες των strings γράφονται σε ένα καινούργιο
string κατά στήλες. Δηλαδή, πρώτα γράφονται οι
πρώτοι χαρακτήρες των u1, n1 και v1, μετά οι δεύτεροι
κτλ. Αυτό το αναδιοργανωμένο string αποτελεί το τελικό
pass-string.
Τέλος, καλείται η do_math() με παραμέτρους το
authentication key και το pass-string, η οποία αποφασίζει
αν είναι το κλειδί είναι εντάξει. Ο έλεγχος είναι ο
ακόλουθος. Αρχικά τα δύο strings χωρίζονται σε τρεις
ομάδες των 6 bytes η κάθε μια. Κάθε ομάδα προστίθεται
byte-wise με την αντίστοιχη ομάδα του άλλου string και
έτσι παράγονται τρεις αριθμοί x, y και r. Όταν γράφω
byte-wise εννοώ ότι κατά την πρόσθεση των ομάδων
αθροίζονται όλα τα bytes των αντίστοιχων ομάδων από τα
δύο strings ένα προς ένα (τα bytes θεωρούνται
προσημασμένα):
1η Ομάδα 2η Ομάδα 3η Ομάδα
k0 k1 k2 k3 k4 k5 | k6 k7 k8 k9 k10 k11 | k12 k13 k14 k15 k16 k17
p0 p1 p2 p3 p4 p5 | p6 p7 p8 p9 p10 p11 | p12 p13 p14 p15 p16 p17
5 11 17
x=Σ(ki+pi) y=Σ(ki+pi) r=Σ(ki+pi)
i=0 i=6 i=12
Για να είναι επιτυχής ο έλεγχος θα πρέπει x^2 + y^2 = r^2
με r!=0. Οι τριάδες (x,y,r) που ικανοποιούν την
προηγούμενη σχέση ονομάζονται πυθαγόρειες τριάδες. Η πιο
απλή είναι η (3,4,5).
Εμείς γνωρίζουμε τα pi και ψάχνουμε τα ki ώστε να ισχύουν
τα παραπάνω. Αν θέσουμε ki=-pi για όλα εκτός από ένα σε
κάθε ομάδα πχ το πρώτο, τότε x=k0+p0, y=k6+p6,
r=k12+p12 => k0=x-p0 k6=y-p6, k12=r-p12. Επειδή τα
(x,y,r) πρέπει να είναι πυθαγόρεια τριάδα επιλέγουμε x=3,
y=4, r=5. Επομένως k0=3-p0, k6=4-p6, k12=5-p12. Και αυτό
ήταν!
Παρακάτω θα βρείτε άλλους δύο key generators που είναι
πιο πολύπλοκοι αλλά και πιο δημιουργικοί από αυτόν που
προτείνω.
Hall Of Fame
Συγχαρητήρια για τη λύση και τους key generators στους:
-
Γιώργος Πρέκας Challenge #1
Keygen
...Το πρόγραμμα keygen είναι ένας ολοκληρωμένος key
generator. Παρέχει περισσότερες δυνατότητες από όσες
περιμένει κανείς από ένα key generator...
-
Αντώνης Σταμπούλης Challenge
#1 Keygen
... Δουλεύει σχετικά απλά, ψάχνοντας να βρει μια
πυθαγόρεια τριάδα κοντά στην περιοχή που βρίσκονται
τα a, b και c που δημιουργούνται όταν το input string
αποτελείται από χαρακτήρες κενού (ascii 32). Μετά
προσθέτει τυχαίους αριθμούς στους χαρακτήρες του
input string έτσι ώστε να βγαίνουν τελικά τα
επιθυμητά a, b και c...
Ο δικός μου keygen και το source αρχείο του challenge #1
: Challenge #1
source
Αγαπητοί αναγνώστες,
πρόσφατα στο υπόγειο των καινούργιων κτιρίων του
περιοδικού μας ανακαλύφθηκε ένα κρυφό δωμάτιο. Μέσα σε
αυτό βρέθηκε μια tamperproof θήκη που από ότι φαίνεται
περιέχει ένα υπολογιστικό σύστημα. Το μόνο που φαίνεται
από το σύστημα είναι μια μικρή οθόνη και μια υποδοχή για
rom memory modules που περιέχουν τον προς εκτέλεση
κώδικα. Ένας από τους εργαζόμενους θυμάται πως η εταιρεία
που υπήρχε εδώ παλιότερα είχε ασχοληθεί με την υλοποίηση
ενός πρότυπου υπολογιστικού συστήματος τεχνολογίας RISC
αλλά το project εγκαταλείφθηκε λόγω έλλειψης χρημάτων.
Δυστυχώς οι προσπάθειες μας για επικοινωνία με άτομα που
πιστεύουμε πως έχουν σχέση με το εν λόγω project δεν
έχουν φέρει αποτέλεσμα. Ύστερα από διεξοδικότερη έρευνα
στο κρυφό δωμάτιο ήρθε στο φως μια δισκέτα που γράφει
πάνω "RISC-Emu v0.42rox" και από ότι φαίνεται περιέχει
και έναν emulator του επεξεργαστή. Εικάζεται πως αυτός
είχε χρησιμοποιηθεί για λόγους prototyping. Τα αρχεία που
βρέθηκαν στη δισκέτα βρίσκονται στο αρχείο: rce2-files/challenge2.tar.gz.
Η tamperproof θήκη γράφει με μεγάλα γράμματα "Προσοχή! Η
θήκη μπορεί να ανοίξει μόνο από το ίδιο το σύστημα.
Οποιαδήποτε προσπάθεια για παραβίαση θα έχει ως
αποτέλεσμα την απελευθέρωση χημικών που θα καταστρέψουν
το hardware".
Η αποστολή σας, αν την αποδεχτείτε, είναι να βρείτε έναν
τρόπο να ανοιχτεί η θήκη χωρίς να προκληθεί ζημιά στο
hardware. Από όσα ξέρουμε ως τώρα αυτό θα πρέπει να
γίνεται με την εισαγωγή ενός σωστού memory module. Η
ανταμοιβή θα είναι πλουσιοπάροχη και θα φθάνει το ύψος
των 10000 δωρεάν συνδρομών στο περιοδικό μας.
Με εκτίμηση,
Ο Πρόεδρος
Προηγούμενο
Περιεχόμενα