Σε αυτό το άρθρο, εγώ θα προσπαθήσω να δείξω πώς να κερδίσει ένα προηγμένο crackme που χρησιμοποιεί έναν ενδιαφέροντα τρόπο για να υπολογίσει το μήκος και πρόκειται για την παραγωγή εξαιρέσεις που πρέπει να αντιμετωπιστούν, προκειμένου να επιστρέψει τις τιμές στους καταχωρητές 32-bit, όπως EAX μητρώο, το κλειδί να κερδίσει ένα crackme είναι βαθιά ανάλυση μέσω τι κάνει κάτω από την κουκούλα, ιδίως όταν πρόκειται για τη χρήση μεικτών μεθόδων για να μπερδεύουν, να σταματήσει ή να επιβραδύνει τον αναστροφέα.
Αυτό Crackme λήφθηκε από ένα πολύ δημοφιλές δικτυακό τόπο πρόκληση που δεν θα αναφέρω, έχω επεξεργαστεί τις χορδές τυπωμένο στη διεπαφή στη μνήμη να μην εντοπίσουν την ιστοσελίδα. Ήμουν επίσης το 16ο άτομο για να επικυρώσει (ποσοστό επικύρωσης 1%).
Ας ξεκινήσουμε από το άνοιγμα της CrackMe και να δούμε τι είναι περίμεναν από εμάς να κάνουμε!
Μας ζητάει ευγενικά να πληκτρολογήσετε ένα πέρασμα ή να το σπάσουμε υποθέτω.
Ανοίξτε το μυαλό σας και να συνεχίσουμε. Τώρα θα πρέπει να ρίξουμε μια γρήγορη ματιά σε ό, τι ρουτίνες είναι ακριβώς που ασχολούνται με την είσοδο του χρήστη. Ας περάσουμε Ασυλία και ρίξουμε μια γρήγορη ματιά.
Μπορείτε να δείτε ότι κέρδισε την είσοδο του χρήστη, στη συνέχεια, καλώντας μια διεύθυνση που καθορίζεται από τον καταχωρητή EBX μετά ότι είναι να αποφασιστεί εάν η εκτύπωση την επιτυχία ή την αποτυχία μήνυμα. Είμαστε τώρα ενδιαφέρονται για το τι συμβαίνει αμέσως μετά από να πάρει την είσοδο του χρήστη, χρησιμοποιώντας scanf οπότε ας δούμε τι κρατά EBX και βήμα σε αυτή την κλήση.
EBX δεν μας πηγαίνει μακρύτερα, αλλά ακριβώς κάτω από αυτόν τον κώδικα λίγο. Οι οδηγίες που θα μας οδηγήσει EBX να είναι αυτοί υπεύθυνοι για τον έλεγχο της εισόδου του χρήστη και να αποφασίσει αν είναι σωστό ή όχι. Η αρμόδια ρουτίνα είναι λίγο καιρό και είναι χωρισμένο σε 4 κύρια μέρη, κάθε μέρος τελειώνει με μια JE (Πήδημα Αν Equal) διδασκαλίας. Οπότε ας φροντίσει κάθε τμήμα μόνο του:
Μέρος 1ο - Έλεγχος του μήκους:
Εδώ είναι οι οδηγίες:
Μπορούμε να δούμε ότι DEADBABE θα προστεθεί στο 227A65DD που θα κάνει ESI κρατώντας τη διεύθυνση μνήμης που ορίζει τον χρήστη-εισόδου, τότε η επόμενη εντολή θα προσπαθήσει να ρυθμίσετε το CarryFlag που έχει ήδη οριστεί, την επόμενη εντολή που μπορεί να προσελκύσει την προσοχή σας είναι σε αντιμετώπιση 00CC109D αυτή είναι η διεύθυνση που θα υπολογίσει πραγματικότητα το μήκος συμβολοσειράς εισόδου. Πώς μπορώ να το ξέρω; Θα σας εξηγήσω.
Μπορείτε να δείτε ότι η τιμή 400 κινείται προς ECX, μπορείτε επίσης να παρατηρήσει ότι 227A69D9 κινείται προς EDI τότε EBX προστίθεται σε αυτό, το αποτέλεσμα θα αποθηκευτεί στο EDI για σίγουρος. Πριν από την εντολή ADD έχουμε μια πολύ σημαντική οδηγία που να είναι SALC, αυτή η εντολή θα Ορίστε την τιμή AL έως FF, αν το ΤΣ έχει οριστεί ή 00 εάν διαγραφεί το ΤΣ. Σε περίπτωση CF μας βρίσκεται, οπότε η αξία του AL θα είναι FF, η τιμή αυτή είναι πολύ σημαντική, διότι η εντολή SCASB θα προσπαθήσει να βρει όλα τα bytes που δεν ταιριάζουν AL ξεκινώντας ES: [(Ε) DI]. Επιπλέον, εδώ έχουμε την εντολή REPE που accompaigned με την εντολή SCASB γι 'αυτό θα προσπαθήσουν να χρησιμοποιήσουν το ECX εγγραφείτε για να καθορίσετε μια αναζήτηση «σειρά», μπορείτε να δείτε καθαρά ότι ECX μητρώο ορίστηκε σε 400.
Τώρα, πηγαίνετε και να ελέγξετε τι EDI κρατάει μετά την εντολή ADD θα δείτε ότι κρατάει την αξία 00CC2497. Ακολουθήστε αυτήν την τιμή σε χωματερή και θα βρεθείτε μπροστά σε μια δέσμη των «FF», θα δείτε τώρα ότι ECX κρατά την τιμή 400, αυτό σημαίνει ότι η σειρά αναζήτησης θα πάει στο μηδέν, με άλλα λόγια και στη θεωρία, η αναζήτηση θα τερματιστεί όταν ECX θα κρατήσει την τιμή 00000000, οι οποίες μας κάνουν να καταλάβουμε ότι η εντολή θα ψάξει για την πρώτη τιμή που είναι διαφορετική από την «FF» από 00CC2497 μέχρι (00CC2497 - 400) = 00CC2097 και αν δεν βρέθηκαν διαφορετικές τιμές από FF ECX θα απλά κρατήστε 00000000. Όταν μετά 00CC2097 στη χωματερή θα βρείτε αυτό που ακολουθεί:
Εδώ, η διδασκαλία REPE SCASB θα σταματήσει στην τελευταία τόνισε NULL byte σε μπλε «00», διότι είναι διαφορετικό από το «FF» εδώ ECX θα κρατήσει το μήκος από 00.012.097 έως ότου η τιμή πριν από το null byte. Στην περίπτωσή μου εδώ (είσοδος 123456) ECX θα κρατήσει την τιμή 9, γιατί θα πρέπει να αρχίσει την καταμέτρηση από το 0 τότε 1 και στη συνέχεια 2 μέχρι να φτάσει 9 μέσα φθάνοντας 000120A0.
Τώρα που γνωρίζουμε πώς το μήκος υπολογίζεται ότι πρέπει να καταλάβω τι χρειάζεται αυτό το μήκος crackme. Σε αυτή τη φάση, δεν με νοιάζει αν ο αύξων είναι σωστό ή όχι, γιατί απλά θέλετε να πάρετε μέσα από την πρώτη προϋπόθεση σε ένα σωστό τρόπο. Μπορείτε να δείτε τα τελευταία δύο γραμμές που θα αφαιρέσουμε από 0F ECX τότε Μετάβαση αν ZF = 1 ή όχι άλμα εάν ZF = 0, με άλλα λόγια, αν η ECX = 00000000 μετά την
αφαίρεση της ZF θα οριστεί αν όχι θα παραμένουν στα ίδια επίπεδα 0. Έτσι, βασικά μετά την ECX διδασκαλίας REPE SCASB πρέπει να κατέχουν 0F που ισούται με 15 στο δεκαδικό. Γι 'αυτό και το μόνο που χρειάζεται να εισάγετε ένα αλφαριθμητικό με μήκος 12 χαρακτήρων και θα πρέπει να ληφθούν άλμα
Μέρος 2ο - Πρώτη 4 bytes της σημαίας:
Όπως ελήφθη η υπό όρους άλμα θα πέφτουν απευθείας στην δεύτερη εντολή που είναι Lods DWORD PTR DS: [ΕΣΥ], αυτή η εντολή θα φορτώσει τα βασικά DWORD DS: [ESI] αξία σε EAX εγγραφείτε αυτήν την τιμή θα πρέπει να είναι οι πρώτοι 4 χαρακτήρες που γράψαμε στην σημαία μας σε δεκαδική και μετατρέπεται σε μικρό endian, ώστε αν τα πρώτα 4 χαρακτήρες που έχετε εισάγει ήταν 1234, τότε θα πρέπει να κρατήσει EAX μετά από αυτή την εντολή 34.333.231. Μετά βλέπουμε ότι ένα DWORD κινείται σε EDX τότε EAX είναι XORed με αυτό , αυτό είναι σχεδόν η ίδια υπόθεση που κωδικοποιούνται σε CrackMe # 3 σε Hackathon Challenge. Η σωστή τιμή EAX μετά διαδικασίαχογ με EDX πρέπει να 1608030E έτσι το πρώτο DWORD της σημαίας μας είναι 1608030E XORed με EDX. Ποια θα σας δώσει αυτήν την τιμή: XOR 1608030E, 5A643059 = 4C6C3357 απλώς θα πρέπει να το μετατρέψετε σε big endian και θα έχουμε τα πρώτα 4 bytes της σημαίας: 57336C4C που είναι «W3lL» σε ASCII.
Τώρα απλά πληκτρολογήστε W3lL και πληκτρολογήστε 8 τυχαίους χαρακτήρες μετά από αυτό και θα δείτε ότι ZF
θα καθοριστεί μετά την συγκρίνουν και το άλμα θα πρέπει να ληφθούν.
3ο μέρος - Δεύτερη 4-bytes της σημαίας (SEH):
Έτσι, βασικά, όταν η εντολή PUSH EBX σε 00CC10C6 εκτελείται θα δείξει την τρέχουσα SE Handler που σημαίνει τις οδηγίες που θα ασχοληθεί με μια εξαίρεση, η εξαίρεση εδώ ενεργοποιείται από το «INT 1» διδασκαλία και τη ροή εκτέλεσης μεταφέρεται αμέσως σε 00CC1530 , μετά την επιστροφή της εξαίρεσης θα handeled και η ροή εκτέλεσης θα συνεχιστεί κανονικά. Το μόνο πράγμα που χρειάζεται να κάνετε είναι να ορίσετε ένα breakpoint στην εντολή μετά το «INT 1» διδασκαλίας
επειδή η ΕΣΚ θα αυξηθεί κατά 2 και θα παραλείψετε ότι η διδασκαλία. Μετά θα επιστρέψουμε από τις ρουτίνες χειρισμού εξαιρέσεων θα δούμε ότι EAX θα κρατήσει μια τιμή επιστροφής που προστίθεται στην προηγούμενη τιμή που είχε στην κατοχή του EAX.
Τώρα, ας εργαστούν για να βρουν ότι ο Θεός καταραμένο δεύτερο μέρος της σημαίας επικύρωσης. Προσποιηθείτε ότι δεν είπα ότι η τιμή επιστροφής αποθηκεύεται στο EAX δεν προστίθεται στην προηγούμενη τιμή της, έτσι και εδώ μπορείτε να δείτε μόνο μετά από να περπατήσει πάνω από το «INT 1» ότι η αξία των EAX θα αλλάξει. Πρέπει λοιπόν να καταλάβουμε αν η EAX κατέχει μια διεύθυνση που έχουν μετακινηθεί, προστίθεται ή αφαιρείται αυτό. Για να το κάνει, ας επαναληφθεί Crackme μας μέσα σε ένα πρόγραμμα εντοπισμού σφαλμάτων για σίγουρος. Τώρα θα μπούμε σε αυτή την είσοδο, για παράδειγμα: η W3lL11119876
DWORD που θα πρέπει να αντιμετωπίζονται σε αυτό το μέρος είναι 31313131 (111 σε ASCII) οπότε ας βήμα πέρα από τη διδασκαλία LODSD και θα δείτε ότι EAX είναι γεμάτη τώρα με 31.313.131. Όπως είπα και προηγουμένως, θα πρέπει να ορίσετε ένα bp σε 00CC10DD στη συνέχεια βγείτε χρησιμοποιώντας <shift + F8> αλλά δεν θέλουμε να το κάνουμε αυτό τώρα, διότι αυτό θα κάνει την αξία της αλλαγής EAX και θα πρέπει να καταλάβω τι αριθμητική πράξη γίνεται όταν η τιμή που επιστρέφεται από διακοπή θα Μεταφέρθηκε, προστεθούν, να αφαιρεθούν,
πολλαπλασιάζεται με την τρέχουσα αξία του EAX. Έτσι, εδώ τι έχω κάνει είναι ότι πήγα και επιμελήθηκε την αξία του EAX λίγο πριν την εκτέλεση της διακοπής στην τιμή NULL, EAX = 00000000 Γι 'αυτό δεν θα πρέπει να ωμή βία κάθε αριθμητική πράξη αν είναι μια ADD έτσι EAX θα κρατήσει μια τιμή, αν είναι μια EAX πολλαπλασιασμού θα εξακολουθούν να κατέχουν 0, διαίρεση είτε 0 είτε μια εξαίρεση ... κλπ
Έτσι, μετά την εκτέλεση της διακοπής συνειδητοποίησα ότι EAX κρατά την τιμή 21486553, ας συγκεκαλυμμένη αυτό σε μεγάλο endian και σε ASCII αιτία είναι εκτυπώσιμη =) ... θα έχουμε επιτέλους 53654821 = SEH!
Αν θέλετε να είστε πιο σίγουροι εάν η λειτουργία είναι μια προσθήκη απλά πηγαίνετε και να αλλάξετε EAX σε 00000001 και θα πάρετε 21486554 το οποίο είναι σε μεγάλο endian + ASCII: teh! .
Εντάξει έτσι τώρα, μετά ξέραμε ποια είναι η τιμή που επιστρέφεται από τη διακοπή πρέπει να γνωρίζουμε ποια είναι η σωστή τιμή που EAX πρέπει να κατέχουν πριν από την εντολή XOR. Αυτό είναι απλό, βλέπουμε ότι EAX συγκρίνεται με 18D386D7 αφού XORed και είναι XORed με 495F4265, έτσι ακριβώς πριν από την XOR και αμέσως μετά «INT 1» EAX θα πρέπει να κατέχουν: 518CC4B2 (διαδικασίαχογ 18D386D7 με 495F4265). Οκέι τώρα βρήκαμε τι αξία EAX πρέπει να κατέχουν αμέσως μετά την «INT 1» διδασκαλίας και ξέρουμε ότι μετά τη διακοπή 21486553 προστίθεται στο EAX μητρώο. Sooo η σωστή τιμή EAX κατόπιν εντολής LODSD είναι 518CC4B2 - 21.486.553 = 30445F5F int big endian 5F5F4430 και σε ASCII: __ D0. Έτσι τώρα οι 8 πρώτοι χαρακτήρες της σημαίας είναι W3lL__D0. Ας προσπαθήσουμε για την επανάληψη της crackme και να τεθεί αυτό σειριακό: W3lL__D09876. Με το πάτημα σκέψης οδηγίες μέχρι το άλμα εάν ίση σε αυτό το μέρος (μην ξεχάσετε το bp), θα δείτε ότι η ZF θα τεθεί και το άλμα θα πρέπει να ληφθούν μόνο και μόνο επειδή η σύγκριση πήγε αλήθεια και αυτά τα 4 bytes είναι οι σωστές .
4ο μέρος - Τα τελευταία 4 bytes της σημαίας (VEH):
Εδώ είναι οι οδηγίες:
Τέλος, αυτή ήταν μια πραγματικά ΚΑΛΗ crackme που έχω πραγματικά απολαμβάνουν την ανακάλυψη και ρωγμές επειδή χρησιμοποιεί πολλούς χειριστές να ασχοληθεί με τις εξαιρέσεις στη συνέχεια επιστρέφουν κάποιες αξίες που θα πρέπει να προστεθούν και χρησιμοποιεί επίσης μια πολύ ενδιαφέρουσα μέθοδο για να ελέγξετε το μήκος.
- See more at: http://translate.googleusercontent.com/translate_c?depth=1&hl=en&rurl=translate.google.com&sandbox=0&sl=auto&tl=el&u=http://www.breakthesecurity.com/2013/06/beating-sehveh-based-crack-me-through.html&usg=ALkJrhgKISe6zuDuasZXbkt-gHbTmSCRIw#more
Αυτό Crackme λήφθηκε από ένα πολύ δημοφιλές δικτυακό τόπο πρόκληση που δεν θα αναφέρω, έχω επεξεργαστεί τις χορδές τυπωμένο στη διεπαφή στη μνήμη να μην εντοπίσουν την ιστοσελίδα. Ήμουν επίσης το 16ο άτομο για να επικυρώσει (ποσοστό επικύρωσης 1%).
Ας ξεκινήσουμε από το άνοιγμα της CrackMe και να δούμε τι είναι περίμεναν από εμάς να κάνουμε!
Μας ζητάει ευγενικά να πληκτρολογήσετε ένα πέρασμα ή να το σπάσουμε υποθέτω.
Ανοίξτε το μυαλό σας και να συνεχίσουμε. Τώρα θα πρέπει να ρίξουμε μια γρήγορη ματιά σε ό, τι ρουτίνες είναι ακριβώς που ασχολούνται με την είσοδο του χρήστη. Ας περάσουμε Ασυλία και ρίξουμε μια γρήγορη ματιά.
Μπορείτε να δείτε ότι κέρδισε την είσοδο του χρήστη, στη συνέχεια, καλώντας μια διεύθυνση που καθορίζεται από τον καταχωρητή EBX μετά ότι είναι να αποφασιστεί εάν η εκτύπωση την επιτυχία ή την αποτυχία μήνυμα. Είμαστε τώρα ενδιαφέρονται για το τι συμβαίνει αμέσως μετά από να πάρει την είσοδο του χρήστη, χρησιμοποιώντας scanf οπότε ας δούμε τι κρατά EBX και βήμα σε αυτή την κλήση.
EBX δεν μας πηγαίνει μακρύτερα, αλλά ακριβώς κάτω από αυτόν τον κώδικα λίγο. Οι οδηγίες που θα μας οδηγήσει EBX να είναι αυτοί υπεύθυνοι για τον έλεγχο της εισόδου του χρήστη και να αποφασίσει αν είναι σωστό ή όχι. Η αρμόδια ρουτίνα είναι λίγο καιρό και είναι χωρισμένο σε 4 κύρια μέρη, κάθε μέρος τελειώνει με μια JE (Πήδημα Αν Equal) διδασκαλίας. Οπότε ας φροντίσει κάθε τμήμα μόνο του:
Μέρος 1ο - Έλεγχος του μήκους:
Εδώ είναι οι οδηγίες:
Μπορούμε να δούμε ότι DEADBABE θα προστεθεί στο 227A65DD που θα κάνει ESI κρατώντας τη διεύθυνση μνήμης που ορίζει τον χρήστη-εισόδου, τότε η επόμενη εντολή θα προσπαθήσει να ρυθμίσετε το CarryFlag που έχει ήδη οριστεί, την επόμενη εντολή που μπορεί να προσελκύσει την προσοχή σας είναι σε αντιμετώπιση 00CC109D αυτή είναι η διεύθυνση που θα υπολογίσει πραγματικότητα το μήκος συμβολοσειράς εισόδου. Πώς μπορώ να το ξέρω; Θα σας εξηγήσω.
Μπορείτε να δείτε ότι η τιμή 400 κινείται προς ECX, μπορείτε επίσης να παρατηρήσει ότι 227A69D9 κινείται προς EDI τότε EBX προστίθεται σε αυτό, το αποτέλεσμα θα αποθηκευτεί στο EDI για σίγουρος. Πριν από την εντολή ADD έχουμε μια πολύ σημαντική οδηγία που να είναι SALC, αυτή η εντολή θα Ορίστε την τιμή AL έως FF, αν το ΤΣ έχει οριστεί ή 00 εάν διαγραφεί το ΤΣ. Σε περίπτωση CF μας βρίσκεται, οπότε η αξία του AL θα είναι FF, η τιμή αυτή είναι πολύ σημαντική, διότι η εντολή SCASB θα προσπαθήσει να βρει όλα τα bytes που δεν ταιριάζουν AL ξεκινώντας ES: [(Ε) DI]. Επιπλέον, εδώ έχουμε την εντολή REPE που accompaigned με την εντολή SCASB γι 'αυτό θα προσπαθήσουν να χρησιμοποιήσουν το ECX εγγραφείτε για να καθορίσετε μια αναζήτηση «σειρά», μπορείτε να δείτε καθαρά ότι ECX μητρώο ορίστηκε σε 400.
Τώρα, πηγαίνετε και να ελέγξετε τι EDI κρατάει μετά την εντολή ADD θα δείτε ότι κρατάει την αξία 00CC2497. Ακολουθήστε αυτήν την τιμή σε χωματερή και θα βρεθείτε μπροστά σε μια δέσμη των «FF», θα δείτε τώρα ότι ECX κρατά την τιμή 400, αυτό σημαίνει ότι η σειρά αναζήτησης θα πάει στο μηδέν, με άλλα λόγια και στη θεωρία, η αναζήτηση θα τερματιστεί όταν ECX θα κρατήσει την τιμή 00000000, οι οποίες μας κάνουν να καταλάβουμε ότι η εντολή θα ψάξει για την πρώτη τιμή που είναι διαφορετική από την «FF» από 00CC2497 μέχρι (00CC2497 - 400) = 00CC2097 και αν δεν βρέθηκαν διαφορετικές τιμές από FF ECX θα απλά κρατήστε 00000000. Όταν μετά 00CC2097 στη χωματερή θα βρείτε αυτό που ακολουθεί:
Εδώ, η διδασκαλία REPE SCASB θα σταματήσει στην τελευταία τόνισε NULL byte σε μπλε «00», διότι είναι διαφορετικό από το «FF» εδώ ECX θα κρατήσει το μήκος από 00.012.097 έως ότου η τιμή πριν από το null byte. Στην περίπτωσή μου εδώ (είσοδος 123456) ECX θα κρατήσει την τιμή 9, γιατί θα πρέπει να αρχίσει την καταμέτρηση από το 0 τότε 1 και στη συνέχεια 2 μέχρι να φτάσει 9 μέσα φθάνοντας 000120A0.
Τώρα που γνωρίζουμε πώς το μήκος υπολογίζεται ότι πρέπει να καταλάβω τι χρειάζεται αυτό το μήκος crackme. Σε αυτή τη φάση, δεν με νοιάζει αν ο αύξων είναι σωστό ή όχι, γιατί απλά θέλετε να πάρετε μέσα από την πρώτη προϋπόθεση σε ένα σωστό τρόπο. Μπορείτε να δείτε τα τελευταία δύο γραμμές που θα αφαιρέσουμε από 0F ECX τότε Μετάβαση αν ZF = 1 ή όχι άλμα εάν ZF = 0, με άλλα λόγια, αν η ECX = 00000000 μετά την
αφαίρεση της ZF θα οριστεί αν όχι θα παραμένουν στα ίδια επίπεδα 0. Έτσι, βασικά μετά την ECX διδασκαλίας REPE SCASB πρέπει να κατέχουν 0F που ισούται με 15 στο δεκαδικό. Γι 'αυτό και το μόνο που χρειάζεται να εισάγετε ένα αλφαριθμητικό με μήκος 12 χαρακτήρων και θα πρέπει να ληφθούν άλμα
Όπως ελήφθη η υπό όρους άλμα θα πέφτουν απευθείας στην δεύτερη εντολή που είναι Lods DWORD PTR DS: [ΕΣΥ], αυτή η εντολή θα φορτώσει τα βασικά DWORD DS: [ESI] αξία σε EAX εγγραφείτε αυτήν την τιμή θα πρέπει να είναι οι πρώτοι 4 χαρακτήρες που γράψαμε στην σημαία μας σε δεκαδική και μετατρέπεται σε μικρό endian, ώστε αν τα πρώτα 4 χαρακτήρες που έχετε εισάγει ήταν 1234, τότε θα πρέπει να κρατήσει EAX μετά από αυτή την εντολή 34.333.231. Μετά βλέπουμε ότι ένα DWORD κινείται σε EDX τότε EAX είναι XORed με αυτό , αυτό είναι σχεδόν η ίδια υπόθεση που κωδικοποιούνται σε CrackMe # 3 σε Hackathon Challenge. Η σωστή τιμή EAX μετά διαδικασίαχογ με EDX πρέπει να 1608030E έτσι το πρώτο DWORD της σημαίας μας είναι 1608030E XORed με EDX. Ποια θα σας δώσει αυτήν την τιμή: XOR 1608030E, 5A643059 = 4C6C3357 απλώς θα πρέπει να το μετατρέψετε σε big endian και θα έχουμε τα πρώτα 4 bytes της σημαίας: 57336C4C που είναι «W3lL» σε ASCII.
Τώρα απλά πληκτρολογήστε W3lL και πληκτρολογήστε 8 τυχαίους χαρακτήρες μετά από αυτό και θα δείτε ότι ZF
θα καθοριστεί μετά την συγκρίνουν και το άλμα θα πρέπει να ληφθούν.
3ο μέρος - Δεύτερη 4-bytes της σημαίας (SEH):
Τα 2 πρώτα μέρη ήταν διασκεδαστικό, τώρα περισσότερο. Ας δούμε τις οδηγίες:
Όπως και το τελευταίο μέρος, θα πέφτουν απευθείας στην δεύτερη εντολή που θα κινηθεί DWORD από τη μνήμη στο μητρώο EBX, μετά από αυτό το substruction του 1000 θα πρέπει να γίνει για να EBX που θα μεταφέρει τώρα 00CC1530. Αυτή η διεύθυνση είναι η νέα adresse του χειριστή εξαίρεση, η οποία θα τεθεί σε λίγο, EBX θα βγει τότε η νέα χειρισμού εξαιρέσεων θα δημιουργηθούν εντελώς όταν κινείται ESP σε DWORD PTR FS: [0]. Μετά από αυτό το δεύτερο 4 bytes της εισαγωγής από το χρήστη θα πρέπει να τοποθετούνται σε EAX
εγγραφείτε σε λίγο endian μορφή, στη συνέχεια, μια τιμή που θα XOR EAX κινείται σε EBX.
Εδώ όπου η TRAP είναι: η «INT 1» διδασκαλίας.
Μπορούμε να δούμε εδώ ότι όταν θα βήμα πέρα από αυτή την εντολή, χρησιμοποιώντας «F8» το ΕΣΚ μόνο θα κατέχει άμεσα το adresse 00CC10DF, οπότε δεν χρειάζεται να το βήμα πάνω από αυτές τις οδηγίες, αλλά ας τρέχει κανονικά το crackme όπως εκτελέστηκε έξω από ένα πρόγραμμα εντοπισμού σφαλμάτων
Μπορούμε να δούμε εδώ ότι όταν θα βήμα πέρα από αυτή την εντολή, χρησιμοποιώντας «F8» το ΕΣΚ μόνο θα κατέχει άμεσα το adresse 00CC10DF, οπότε δεν χρειάζεται να το βήμα πάνω από αυτές τις οδηγίες, αλλά ας τρέχει κανονικά το crackme όπως εκτελέστηκε έξω από ένα πρόγραμμα εντοπισμού σφαλμάτων
. Βασικά η εντολή INT 01 ονομάζεται single-βήμα διάλειμμα θα τρέξει μετά από κάθε εντολή, εάν η TrapFlag έχει ρυθμιστεί. Παρ 'όλα αυτά, εδώ είναι δυνατή η άμεση επίκληση μέσα στον κώδικα και η TF έχει εκκαθαριστεί η οποία θα δημιουργήσει μια εξαίρεση και δεν πάτησε ποτέ το TF. Επιτρέψτε μου να σας εξηγήσω τι ακριβώς συμβαίνει όταν η «INT 1» περνά μέσα στην κανονική εκτέλεση και όχι με ενιαία εντατικοποίηση μέσα από αυτό, να έχετε κατά νου ότι αυτή η εντολή INT θα δημιουργήσει μια εξαίρεση που θα handeled από το SEH
νεοσυσταθείσα. Βασικά όταν θα προκαλέσει αυτό το διακόψει ο επεξεργαστής θα πάει στην 1η θέση στο διάνυσμα διακοπής πίνακα που ξεκινά στη μνήμη 0x00 θέση και καταλήγει στο 0x3ff απλώς και μόνο επειδή οι διακοπές μπορεί να πάρει έναν αριθμό που είναι μεταξύ 0 και 255. Μετά από αυτό η IP θα είναι αποθηκευτεί και η CS, αυτό ουσιαστικά θα αποθηκεύσει 4 bytes (IP = 2 bytes και CS = 2 bytes), πριν από την διακοπή θα παραδώσει πίσω τη ροή της εκτέλεσης του προγράμματος κανονικά θα επιστρέψει χρησιμοποιώντας ένα «IRET»
διδασκαλίας. Εδώ το σημαντικό ρόλο που η CS: IP και όλα ΣΗΜΑΙΕΣ αποκαθίστανται και πάλι.
Έτσι, βασικά, όταν η εντολή PUSH EBX σε 00CC10C6 εκτελείται θα δείξει την τρέχουσα SE Handler που σημαίνει τις οδηγίες που θα ασχοληθεί με μια εξαίρεση, η εξαίρεση εδώ ενεργοποιείται από το «INT 1» διδασκαλία και τη ροή εκτέλεσης μεταφέρεται αμέσως σε 00CC1530 , μετά την επιστροφή της εξαίρεσης θα handeled και η ροή εκτέλεσης θα συνεχιστεί κανονικά. Το μόνο πράγμα που χρειάζεται να κάνετε είναι να ορίσετε ένα breakpoint στην εντολή μετά το «INT 1» διδασκαλίας
επειδή η ΕΣΚ θα αυξηθεί κατά 2 και θα παραλείψετε ότι η διδασκαλία. Μετά θα επιστρέψουμε από τις ρουτίνες χειρισμού εξαιρέσεων θα δούμε ότι EAX θα κρατήσει μια τιμή επιστροφής που προστίθεται στην προηγούμενη τιμή που είχε στην κατοχή του EAX.
Τώρα, ας εργαστούν για να βρουν ότι ο Θεός καταραμένο δεύτερο μέρος της σημαίας επικύρωσης. Προσποιηθείτε ότι δεν είπα ότι η τιμή επιστροφής αποθηκεύεται στο EAX δεν προστίθεται στην προηγούμενη τιμή της, έτσι και εδώ μπορείτε να δείτε μόνο μετά από να περπατήσει πάνω από το «INT 1» ότι η αξία των EAX θα αλλάξει. Πρέπει λοιπόν να καταλάβουμε αν η EAX κατέχει μια διεύθυνση που έχουν μετακινηθεί, προστίθεται ή αφαιρείται αυτό. Για να το κάνει, ας επαναληφθεί Crackme μας μέσα σε ένα πρόγραμμα εντοπισμού σφαλμάτων για σίγουρος. Τώρα θα μπούμε σε αυτή την είσοδο, για παράδειγμα: η W3lL11119876
DWORD που θα πρέπει να αντιμετωπίζονται σε αυτό το μέρος είναι 31313131 (111 σε ASCII) οπότε ας βήμα πέρα από τη διδασκαλία LODSD και θα δείτε ότι EAX είναι γεμάτη τώρα με 31.313.131. Όπως είπα και προηγουμένως, θα πρέπει να ορίσετε ένα bp σε 00CC10DD στη συνέχεια βγείτε χρησιμοποιώντας <shift + F8> αλλά δεν θέλουμε να το κάνουμε αυτό τώρα, διότι αυτό θα κάνει την αξία της αλλαγής EAX και θα πρέπει να καταλάβω τι αριθμητική πράξη γίνεται όταν η τιμή που επιστρέφεται από διακοπή θα Μεταφέρθηκε, προστεθούν, να αφαιρεθούν,
πολλαπλασιάζεται με την τρέχουσα αξία του EAX. Έτσι, εδώ τι έχω κάνει είναι ότι πήγα και επιμελήθηκε την αξία του EAX λίγο πριν την εκτέλεση της διακοπής στην τιμή NULL, EAX = 00000000 Γι 'αυτό δεν θα πρέπει να ωμή βία κάθε αριθμητική πράξη αν είναι μια ADD έτσι EAX θα κρατήσει μια τιμή, αν είναι μια EAX πολλαπλασιασμού θα εξακολουθούν να κατέχουν 0, διαίρεση είτε 0 είτε μια εξαίρεση ... κλπ
Έτσι, μετά την εκτέλεση της διακοπής συνειδητοποίησα ότι EAX κρατά την τιμή 21486553, ας συγκεκαλυμμένη αυτό σε μεγάλο endian και σε ASCII αιτία είναι εκτυπώσιμη =) ... θα έχουμε επιτέλους 53654821 = SEH!
Αν θέλετε να είστε πιο σίγουροι εάν η λειτουργία είναι μια προσθήκη απλά πηγαίνετε και να αλλάξετε EAX σε 00000001 και θα πάρετε 21486554 το οποίο είναι σε μεγάλο endian + ASCII: teh! .
Εντάξει έτσι τώρα, μετά ξέραμε ποια είναι η τιμή που επιστρέφεται από τη διακοπή πρέπει να γνωρίζουμε ποια είναι η σωστή τιμή που EAX πρέπει να κατέχουν πριν από την εντολή XOR. Αυτό είναι απλό, βλέπουμε ότι EAX συγκρίνεται με 18D386D7 αφού XORed και είναι XORed με 495F4265, έτσι ακριβώς πριν από την XOR και αμέσως μετά «INT 1» EAX θα πρέπει να κατέχουν: 518CC4B2 (διαδικασίαχογ 18D386D7 με 495F4265). Οκέι τώρα βρήκαμε τι αξία EAX πρέπει να κατέχουν αμέσως μετά την «INT 1» διδασκαλίας και ξέρουμε ότι μετά τη διακοπή 21486553 προστίθεται στο EAX μητρώο. Sooo η σωστή τιμή EAX κατόπιν εντολής LODSD είναι 518CC4B2 - 21.486.553 = 30445F5F int big endian 5F5F4430 και σε ASCII: __ D0. Έτσι τώρα οι 8 πρώτοι χαρακτήρες της σημαίας είναι W3lL__D0. Ας προσπαθήσουμε για την επανάληψη της crackme και να τεθεί αυτό σειριακό: W3lL__D09876. Με το πάτημα σκέψης οδηγίες μέχρι το άλμα εάν ίση σε αυτό το μέρος (μην ξεχάσετε το bp), θα δείτε ότι η ZF θα τεθεί και το άλμα θα πρέπει να ληφθούν μόνο και μόνο επειδή η σύγκριση πήγε αλήθεια και αυτά τα 4 bytes είναι οι σωστές .
4ο μέρος - Τα τελευταία 4 bytes της σημαίας (VEH):
Εδώ είναι οι οδηγίες:
Μπορούμε να δούμε από μια γενική άποψη ότι οι παρούσες οδηγίες οικοδόμηση μιας vectored Εξαίρεση Handler (VEH), η οποία θα ασχοληθεί με εξαίρεση την εκτέλεση μιας ρουτίνας παρόντες στη διδασκαλία επισήμανε από EBX, σπρώχνοντας ένα δεύτερο μη μηδενικό επιχείρημα δείχνει ότι η νΕΗ εισάγεται στο πολύ επικεφαλής της λίστας, τότε είναι Αφαιρέθηκε μετά την εκτέλεση μια δέσμη οδηγιών που θα ελέγχει πώς η τελευταία DWORD της εισαγωγής από το χρήστη είναι σωστή, οι οδηγίες αυτές περιέχουν μια εξαίρεση σε adresse
00CC110A.
Αλλά πρώτα τι είναι η κατευθυνόμενη Handler εξαίρεσης. Σύμφωνα με MSDN:
- Vectored Χειρισμός Εξαίρεση είναι νέα, όπως των Windows XP.
- Όλες οι πληροφορίες σχετικά με VEH αποθηκεύονται στο σωρό.
- Vectored χειριστές εξαίρεση τα ρητώς προστέθηκε με τον κωδικό σας, και όχι ως
υποπροϊόν της δηλώσεις try / catch.
- Οι χειριστές δεν συνδέονται με μια συγκεκριμένη λειτουργία ούτε έδεσαν σε ένα πλαίσιο στοίβας.
Έτσι, βασικά για να βεβαιωθείτε ότι μια excpetion είναι trigerred και dealed με πρέπει να θέσουμε ένα breakpoint στην πρώτη εντολή που εκτελείται από την νΕΗ το οποίο θα είναι το μητρώο EBX έσπρωξε adresse σίγουρα. Κατά την εκτέλεση του κώδικα θα δούμε ότι το τελευταίο DWORD φορτώνεται σε λίγο endian μορφή και πάλι στον καταχωρητή EAX, τότε η τιμή κινείται προς EBX ποια είναι η αξία που θα χρησιμοποιήσουμε για διαδικασίαχογ. Αλλά ακριβώς μετά από αυτό έχουμε μια MOV διδασκαλίας το οποίο θα κινηθεί EBX στην τρέχουσα DWORD στο
θέση μνήμης επισήμανε με ΕΒΡ, ενώ η διακοπή στην εν λόγω οδηγία, θα δείτε ότι η ΕΒΡ κρατά την τιμή 00000001 έτσι μια εξαίρεση θα πρέπει να ενεργοποιείται το ότι είναι αδύνατο να μετακινηθούν EBX σε αυτήν τη θέση. Αν βάλετε ένα bp για την έσπρωξε EBX στη στοίβα, θα δείτε ότι η ροή εκτέλεσης θα πρέπει να λαμβάνονται από τις οδηγίες στο 00CC1960 (έσπρωξε EBX ως arg να δημιουργήσετε το νΕΗ). Αυτές οι ρουτίνες θα χειριστεί την εξαίρεση αυτή και να επιστρέψει επίσης μια τιμή EAX μητρώο, το οποίο θα προστεθεί ως
συνέβη στο προηγούμενο μέρος του ελέγχου της σημαίας.
Γι 'αυτό και θα πρέπει να καταλάβω τι είναι η προστιθέμενη αξία και πάλι, το μόνο που χρειάζεται να κάνετε είναι να αλλάξετε την τιμή του EAX μητρώο μετά την εντολή LODSD σε 00000000 συνέχεια θα τοποθετούνται σε ένα σημείο διακοπής 00CC110D και πατήστε το πλήκτρο «F9» γι' αυτό μην παραλείψετε ότι η οδηγία, όπως συνέβη την τελευταία φορά. Τώρα το μόνο που έχουμε να κάνουμε είναι να δούμε τι κρατάει EAX: να κρατάει D9150F32. Έτσι, μετά τον χειρισμό της εξαίρεσης, αυτή η τιμή (D9150F32) θα προστεθεί στο μητρώο EAX, τώρα πρέπει να καταλάβω τι πρέπει να είναι η σωστή τιμή EAX λίγο μετά το χειρισμό εξαίρεση σημαίνει: (D9150F32 + LastFlagDwordLittleEndian)
Θα πρέπει ακριβώς να XOR 8E7632F3 με EBX, και θα έχετε αυτήν την τιμή: FA3654A0. Έτσι, η σωστή τελευταίο DWORD της σημαίας στο μικρό endian θα πρέπει να είναι:
FA3654A0 - D9150F32 = 2121456E -> Big Endian = 6E452121 -> ASCII = nE!
Έτσι, τα τελευταία 4 χαρακτήρες της σημαίας είναι: nE! ...
5 - Η ενοποίηση των 3 μέρη:
Έτσι, η πλήρης σημαία για να επικυρώσετε την πρόκληση είναι: W3lL__D0nE! Τώρα απλά προσπαθούν να παρέχουν τη σημαία στην Crackme και θα δείτε ότι:
Τέλος, αυτή ήταν μια πραγματικά ΚΑΛΗ crackme που έχω πραγματικά απολαμβάνουν την ανακάλυψη και ρωγμές επειδή χρησιμοποιεί πολλούς χειριστές να ασχοληθεί με τις εξαιρέσεις στη συνέχεια επιστρέφουν κάποιες αξίες που θα πρέπει να προστεθούν και χρησιμοποιεί επίσης μια πολύ ενδιαφέρουσα μέθοδο για να ελέγξετε το μήκος.
- See more at: http://translate.googleusercontent.com/translate_c?depth=1&hl=en&rurl=translate.google.com&sandbox=0&sl=auto&tl=el&u=http://www.breakthesecurity.com/2013/06/beating-sehveh-based-crack-me-through.html&usg=ALkJrhgKISe6zuDuasZXbkt-gHbTmSCRIw#more
0 σχόλια:
Δημοσίευση σχολίου