Το προφίλ μας στο Google Plus
8

Τεχνικές anti-virtualization!

Τα δικά μας προγράμματα έχουν αξιοπρέπεια. Έχουν ένα επίπεδο, βρε αδερφέ! Όταν εκτελούνται σε πραγματικά συστήματα, λειτουργούν κανονικά. Αντίθετα, όταν αντιλαμβάνονται ότι βρίσκονται μέσα σε κάποιο εικονικό περιβάλλον, αρνούνται πεισματικά να ξεκινήσουν. Αναρωτιέστε πώς μπορεί να γίνει κάτι τέτοιο; Στο παρόν άρθρο θα μελετήσουμε τη λογική και τις τεχνικές υλοποίησης μιας τέτοιας δικλείδας ασφάλειας...

Τεχνικές anti-virtualization!

Η τεχνολογία των εικονικών μηχανών χαίρει ιδιαίτερης εκτίμησης από αναλυτές malware, pen-testers, network engineers, προγραμματιστές κ.ά. Μέσα σε ένα εικονικό σύστημα μπορεί κανείς να διεξάγει κρίσιμα πειράματα, χωρίς να θέτει σε κίνδυνο τον πραγματικό υπολογιστή του. Για παράδειγμα, αν θέλει κανείς να τσεκάρει τη συμπεριφορά μιας εφαρμογής ώστε να διαπιστώσει το αν λειτουργεί κακόβουλα ή όχι, τότε μπορεί --για να μην πούμε ότι επιβάλλεται-- να την τρέξει σε ένα εικονικό σύστημα. Αν προκληθεί ζημιά, θα περιορίζεται στο εικονικό σύστημα και θα διορθώνεται πανεύκολα, με τη βοήθεια κάποιου snapshot. Βέβαια, ο συγκεκριμένος τρόπος εργασίας δεν οδηγεί πάντα σε ασφαλή συμπεράσματα. Ένα κακόβουλο πρόγραμμα ενδέχεται να αντιληφθεί ότι λειτουργεί εντός εικονικού περιβάλλοντος και να επιλέξει να κρύψει την επικίνδυνη συμπεριφορά του! Αυτού του είδους η ευφυΐα είναι αρκετά επικίνδυνη όταν την έχει κάποιο malware, αλλά υπάρχουν και περιπτώσεις στις οποίες μπορεί να αποδειχθεί χρήσιμη -- ακόμα και σωτήρια! Για παράδειγμα, σκεφτείτε το σενάριο κατά το οποίο θέλουμε να προστατέψουμε ένα πρόγραμμα από τη μη εξουσιοδοτημένη τροποποίηση (cracking). Σε αυτή την περίπτωση, δεν θα θέλουμε να εκτελείται μέσα σε εικονικά συστήματα. Βλέπετε, όσοι ασχολούνται με το Reverse Engineering συνηθίζουν να εργάζονται σε virtual machines, ώστε να αποφεύγουν τις παγίδες και να ξεπερνούν τα διάφορα anti-debugging tricks.

Στο παρόν άρθρο θα εξετάσουμε τις τεχνικές με τις οποίες μπορεί να εξασφαλίσει κανείς ότι το πρόγραμμά του θα αρνείται να λειτουργήσει όποτε αντιλαμβάνεται ότι εκτελείται μέσα σε μία εικονική μηχανή. Σε γενικές γραμμές, κάτι τέτοιο επιτυγχάνεται με την προσθήκη του κατάλληλου κώδικα, πριν ακόμα κι από το main initialization του προγράμματος. Ο κώδικας που θα εξετάσουμε στο άρθρο θα ελέγχει, με διάφορους τρόπους, για το αν βρισκόμαστε σε πραγματικό σύστημα ή σε εικονική μηχανή. Στη δεύτερη περίπτωση, ένα φιλικό μήνυμα θα ενημερώνει το χρήστη ότι διαπιστώθηκε λειτουργία εντός virtual machine και το πρόγραμμα θα τερματίζεται. Όπως αντιλαμβάνεστε, το μήνυμα θα είναι φιλικό, μιας και πρόκειται για κώδικα που γράψαμε εμείς και προορίζεται για τις ανάγκες του άρθρου. Στην πραγματικότητα, θα μπορούσε να είναι κι ένα σκέτο "FATAL EXIT" ;)

Διαβάστε ολόκληρο το άρθρο στο deltaHacker 030 (τεύχος Μαρτίου 2014).

Το μηνιαίο περιοδικό deltaHacker είναι αποκλειστικά ψηφιακό (PDF). Μάθετε για τις απίστευτες τιμές των συνδρομών και κάντε τώρα την παραγγελία σας από τη σχετική φόρμα. Προσοχή: Για την πρόσβαση στα επεισόδια του deltaCast απαιτείται, πλέον, ενεργή συνδρομή στο περιοδικό.

Μοιράσου το:

Google DiGG ReddIt LinkedIn Microsoft Live del.icio.us StumbleUpon RSS PDF Print

8 Responses to “Τεχνικές anti-virtualization!”

  1. sc0rpion | 22/05/2014 at 15:04

    Πολυ ωραιο το αρθρο φιλε Γιωργο και με πολλα παραδειγματα.
    Ομως στο τελος εμεινα με πολλα ερωτηματικα, γραφεις οτι η κρυπτογραφηση ενος προγραμματος δυσκολευει την δουλεια ενος αναλυτη.

    Μπορεις να γινεις πιο συγκεκριμενος? Τι εννοεις? Χρηση exececutable packer?
    Συμπιεση ενος executable μεσα σε ενα αλλο executable που τρεχει στην μνημη το πρωτο?

    Επισης, στην αρχη του αρθρου υποστηριζεις οτι πολλοι θα διαμαρτυρηθουμε οτι ενας ελεγχος οσο περπλοκος και να ειναι καταληγει παντα σε ενα "if statement" και μπορει ευκολα να προσπεραστει, κατι που κατα την γνωμη μου ειναι σωστο.

    Δεν ειδα κατι στο αρθρο που να καταρρίπτει το παραπανω.

  2. george.aravidis | 22/05/2014 at 18:58

    Πράγματι αγαπητέ Sc0rpion, αν κανείς καταφέρει να προσπεράσει όλα τα AntiDisassembling & AntiDebugging tricks, θα διαπιστώσει ότι πάντα ένας έλεγχος καταλήγει σε ένα if statement. Έτσι δεν είναι ;; Τουλάχιστον τις περισσότερες φορές !

    Βέβαια, ξεπερνώντας κανείς όλα τα εμπόδια και αποδομώντας το κρυπτογραφικό περίβλημα του εκτελέσιμου, μπορεί να καταλήξει πάλι σε ένα κρυπτογραφημένο κομμάτι κώδικα, το οποίο να αποτελείται απο "άγνωστες" εντολές asm" και έτσι ο αναλυτής να μην είναι σε θέση "ακόμα" να καταλάβει τι ακριβώς γίνεται.

    Στο άρθρο δεν παρουσιάστηκε βέβαια σε λεπτομερές επίπεδο κάτι που να καταρρίπτει τον παραπάνω ισχυρισμό (ότι πάντα καταλήγουμε σε ένα if statement), γιατί σε μια τέτοια περίπτωση θα έπρεπε να ανοιχθεί ένα άλλο μεγάλο κεφάλαιο, που αξίζει και αρμόζει να το αντιμετωπίσουμε ως σενάριο σε ένα ξεχωριστό άρθρο.

    Στο παρόν άρθρο παρουσιάσαμε μονάχα τους λογικούς τρόπους με τους οποίους μπορεί κανείς να διαπιστώσει ότι βρίσκεται μέσα σε μια εικονική μηχανή, κάνοντας ειδικότερη μνεία για το VMware.

    Στην αναφορά μου περί κρυπτογράφησης του exe αρχείου, πράγματι εννοώ την διαδικασία με την χρήση ενός executable Packer (όχι executable compressor).
    Μπορείς βέβαια να γράψει κανείς και τον δικό του packer, αρκεί να γνωρίζει την αρχιτεκτονική των εκτελέσιμων αρχείων! Για παράδειγμα, υπάρχει μια θαυμάσια αναφορά στο link : http://www.stonedcoder.org/~kd/lib/61-267-1-PB.pdf

    Εγκυκλοπαιδικά και προς κάλυψη και της δικής σου απορίας, να αναφέρουμε ότι υπάρχουν πλέον τρόποι, ώστε κανείς να σηκώσει ένα exe αρχείο στο ring0, που εκεί πιο δύσκολα μπορεί κάποιος να φθάσει σε επίπεδο Debugger, εν αντιθέση με το ring3.

    ~George

    • sc0rpion | 22/05/2014 at 20:27

      Ευχαριστω για την απαντηση.

      Εχω ηδη αναπτυξει εναν δικο μου executable packer σε delphi, απλως δεν θυμαμαι να εβλεπα αγνωστες εντολες assembly οταν εβαζα το παραγομενο executable στον disassembler. Αν ειναι θα του ριξω παλι μια ματια ;)

  3. george.aravidis | 22/05/2014 at 20:40

    Τις "άγνωστες εντολές" θα τις έβλεπες αν είχες φροντίσει ο packer σου, να προβλέπει μια τέτοια συμπεριφορά, να κρυπτογραφεί extra δηλαδή ένα οποιοδήποτε layer της επιθυμίας σου, στο exe σου.

    Και λέγοντας άγνωστες εντολές, να είχες φροντίσει να περνάει το runtime μέσα απο ένα είδους custom interpreter ο οποίος θα τις μεταφράζει ξανά σε native instructions.

  4. sc0rpion | 22/05/2014 at 21:45

    Η αληθεια ειναι οτι δεν το εχω κοιταξει καθολου αυτο το θεμα.

    Μηπως μπορεις να μου προτείνεις καποιον open-source packer που ξερεις ο οποιος να υλοποιει αυτη την αμυνα για να το καταλαβω καλυτερα και να το δοκιμασω και μονος μου?

  5. themelisx | 22/05/2014 at 22:24

    Να συμπληρώσω στην κουβέντα σας οτι αυτό το IF που λέτε, μπορεί να είναι τόσο καλά κρυμμένο, τόσο βαθιά στον κώδικα, που θα πρέπει να περάσεις από 40 κύματα για να το βρεις. Και ας πούμε οτι το βρήκες και είναι στην θέση π.χ. 8001B0E. οκ, βάζεις brakepoint, αλλάζεις το flag για να περάσει το "IF" και αφού έχεις γευτεί την χαρά της επιτυχίας οτι "έσπασες" τον Patcher, ξανατρέχεις το πρόγραμμα και βλέπεις οτι δεν σταματάει στο break point. Για τον πολύ απλό λόγο οτι το "IF" πήγε αλλού. Σε τυχαίες θέσεις μνήμης ανά εκτέλεση. Και ξανά από την αρχή. Και ας υποθέσουμε οτι τελικά βρήκες ξανά το byte που πρέπει να αλλάξεις. Το ψάχνεις μέσα στο εκτελέσιμο και δεν είναι πουθενά. Γιατί? Γιατί το εκτελέσιμο είναι κρυπτογραφημένο. Και ας υποθέσουμε έφτιαξες ένα προγραμματάκι που αποκρυπτογραφεί το εν λόγω κομμάτι, και το ξανακρυπτογραφεί (λέμε τώρα...). Και μετά το "πειραγμένο" εκτελέσιμο crashάρει! Γιατί? Γιατί παραβίασες την αρτιότητά του. Αντε να βρεις λοιπόν το επόμενο "IF" ... αν υπάρχει... γιατί πολύ απλά θα μπορούσε να χρησιμοποιηθεί η "αρτιότητα" ως κλειδί απόκρυπτογράφησης του επόμενου encryptio layer ... και πάει λέγοντας.

    Φίλε sc0rpion, κάνε υπομονή, θα γραφτούν άρθρα στα επόμενα τεύχη που θα σου καλύψουν όλες τις απορίες... και θα σου δημιουργήσουν νέες, δυσκολότερες :)

    Μείνε συντονισμένος ...

    • sc0rpion | 23/05/2014 at 00:52

      Συμφωνω απολυτως με αυτα που λες themelisx, απλως μου εκαναν εντυπωση οι "αγνωστες εντολες" assembly που ανεφερε ο George γιατι δεν τις εχω δει προσωπικα και θα ηθελα.

      Και ναι! θα ηθελα πολυ ενα αρθρο που να εμβαθυνει περισσοτερο σε αυτα τα θεματα γιατι με ενδιαφερει πολυ.

      Καλη συνεχεια :)

  6. george.aravidis | 23/05/2014 at 01:09

    Sc0rpion, οι "άγνωστες" εντολές οι οποίες αναφέρω, δεν είναι παρα κρυπτογραφημένος κώδικας, ο οποίος για να εκτελεστεί (runtime) θα πρέπει να περάσει απο μια "εικονική μηχανή" ή interpreter αν θέλεις!

    Συνεπώς, θέλοντας και μη, κατα το Disassembling ή το Debugging θα βλέπεις opcodes τα οποία στην πραγματικότητα δεν υπάρχουν έως ότου περάσουν μέσα απο τον Interpreter και εφόσον μπορέσεις και περάσεις το "στρωμένο" ναρκοπέδιο :)

    Για τον λόγο αυτό, θα πρέπει ο packer σου, να κάνει inject όλο το απαραίτητο υπόβαθρο για κάτι τέτοιο !!

    Αυτή η ανάλυση βέβαια είναι ένα πολύ μεγάλο κεφάλαιο απο μόνο του και ίσως δεν
    μπορεί δυστυχώς να καλυφθεί τόσο εκτενώς απο το παρόν βήμα.

    Συμφωνώ και εγώ με όσα προανέφερε ο ThemelisX (aka Jef) !! :)

    Υπομονή λοιπόν ! Θα γραφούν εκτενή άρθρα για πολλά απο αυτά τα θέματα !!

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Google Site-Search

Πρόσφατα

  • Tabber

Σχόλια

  • orestis46 στο Το δικό σας εργαστήριο με το VirtualBox

    1) Δεν γίνεται να δώσουμε στο VM την φυσική κάρτα eth0 απευθείας για να έχει την ίδια MAC...

    Ημερομηνία: 22/10/2014

  • subZraw στο Το δικό σας εργαστήριο με το VirtualBox

    Γεια κι από εδώ :) 1) Η ιδέα με το virtualization είναι ότι τα VMs δεν πρέπει να βλέπουν...

    Ημερομηνία: 21/10/2014

  • sip03ds στο Το δικό σας εργαστήριο με το VirtualBox

    Γειά χαρά, έχω μια απορία σχετικά με το bridge networking (libvirt - που χρησιμοποιεί το virtualbox -- ή...

    Ημερομηνία: 19/10/2014

  • stathisb στο Το Kali με WiFi, στο PenTest Lab

    Παρακαλώ αν μπορεί κάποιος ας βοηθήσει στο σχετικό topic http://deltahacker.gr/topic/%CF%80%CF%81%CF%8C%CE%B2%CE%BB%CE%B7%CE%BC%CE%B1-%CE%BC%CE%B5-%CF%84%CE%BF-install-%CF%84%CE%BF%CF%85-kali-linux-%CF%83%CE%B5-virtualbox/#post-12359

    Ημερομηνία: 09/10/2014

  • Cr0wTom στο Να Άννα ένας ανανάς!

    Χαίρομαι που το διαλευκαναμε :D Όσο αναφορά το ερώτημα σου για την αγορα, σου λεω οτι στο 99% των...

    Ημερομηνία: 08/10/2014

Άρθρα

Θέματα

Αρχείο