Malware Analysis Tutorial: Εντοπισμός σφαλμάτων Ring3


Σε αυτόν τον οδηγό θα μιλήσουμε για τον εντοπισμό σφαλμάτων Ring3

Στόχοι του οδηγού:

  • Αναλύστε αποτελεσματικά ένα πρόγραμμα εντοπισμού σφαλμάτων Ring3, όπως το Immunity Debugger
  • Μπορεί να ελέγξει την εκτέλεση του προγράμματος
  • Δυνατότητα παρακολούθησης / αλλαγής κατάστασης προγράμματος (καταχωρητές, μνήμη)
  • Σχολιασμός σχολίων στο Immunity Debugger

Αυτός ο οδηγός μπορεί να χρησιμοποιηθεί ως εργαστηριακή ενότητα για:

  • Αρχιτεκτονική υπολογιστών
  • Λειτουργικά συστήματα
  • Διακριτά μαθηματικά

1. Εισαγωγή

Για να κάνετε reverse ένα κακόβουλο λογισμικό, είναι απαραίτητος ένας ποιοτικός εντοπιστής σφαλμάτων.

Υπάρχουν δύο τύποι προγράμματα εντοπισμού σφαλμάτων: εντοπισμού σφαλμάτων σε επίπεδο χρήστη (όπως OllyDbg , Immunity Debugger , και IDA Pro ), και εντοπισμού σφαλμάτων του πυρήνα (όπως WinDbg , SoftIce και  Syser).

Η διαφορά μεταξύ των εντοπιστών σφαλμάτων επιπέδου χρήστη / πυρήνα είναι ότι οι εντοπιστές σφαλμάτων του πυρήνα εκτελούνται με υψηλότερα δικαιώματα και, ως εκ τούτου, μπορούν να εντοπίσουν σφάλματα προγραμμάτων οδήγησης και συσκευών του πυρήνα, ενώ οι εντοπιστές σφαλμάτων επιπέδου χρήστη δεν μπορούν.

Είναι γνωστό ότι το σύγχρονο λειτουργικό σύστημα, όπως τα Windows βασίζεται στον επεξεργαστή (π.χ. Intel CPU) για να παρέχει μια πολυεπίπεδη συλλογή τομέων προστασίας.

Για παράδειγμα, σε μια τυπική CPU της Intel, τα προγράμματα μπορούν να εκτελεστούν σε τέσσερις λειτουργίες, από ring0 (λειτουργία πυρήνα) έως ring3 (επίπεδο χρήστη). Σε αυτήν την περίπτωση, αποκαλούμε επίσης εντοπιστές σφαλμάτων επιπέδου χρήστη “ring3 debuggers”

Μια ερώτηση που μπορεί να έχετε είναι: Δεδομένου ότι το ring0 debugger είναι πιο ισχυρό από τον ring3 debugger, γιατί να μην χρησιμοποιήσετε ring0 debuggers απευθείας;

Οι προγραμματιστές εντοπισμού σφαλμάτων Ring3 συνήθως έρχονται με ένα GUI που μπορεί να βελτιώσει σημαντικά την παραγωγικότητα ενός reverse engineer. Μόνο όταν είναι απαραίτητο, θα χρησιμοποιήσουμε τους εντοπιστές εντολών ring0 γραμμής εντολών (όπως WinDbg).

Υπάρχει όμως μια εξαίρεση, το IDA Pro εισήγαγε μια μονάδα GUI που μπορεί να χρησιμοποιηθεί στο WinDbg για τον εντοπισμό σφαλμάτων του πυρήνα. Είναι ένα ωραίο χαρακτηριστικό αλλά θα πρέπει να το πληρώσετε.

Σε αυτόν τον οδηγό, υποθέτουμε ότι θα θέλατε να χρησιμοποιήσετε εργαλεία ανοιχτού κώδικα / ελεύθερου λογισμικού. Το παρακάτω είναι ένας συνδυασμός εντοπιστών σφαλμάτων που θα χρησιμοποιήσουμε σε ολόκληρο τον οδηγό: Immunity Debugger ( IMM για συντομία) και WinDbg.

2. Σύντομη περιήγηση στο IMM

Μια σύντομη εισαγωγή στο IMM.

Εικόνα 1. Στιγμιότυπο οθόνης IMM

Όπως φαίνεται στην εικόνα 1, πάνω αριστερά, έχουμε το παράθυρο της CPU (το οποίο δείχνει την ακολουθία των οδηγιών του μηχανήματος και τα σχόλια των χρηστών), το παράθυρο Register (το οποίο μπορείτε να παρακολουθήσετε και να τροποποιήσετε τις τιμές των καταχωρητών), το παράθυρο Stack και την ένδειξη μνήμης.

Πριν προσπαθήσουμε να κάνουμε reverse την πρώτη ενότητα του Max ++, είναι χρήσιμο να μάθετε πώς να χρησιμοποιείτε τα πλήκτρα συντόμευσης στο πρόγραμμα εντοπισμού σφαλμάτων αποτελεσματικά.

Σε γενικές γραμμές, για να χρησιμοποιήσετε αποτελεσματικά ένα πρόγραμμα εντοπισμού σφαλμάτων, πρέπει να γνωρίζετε τα εξής:

 
  1. Πώς να ελέγξετε τη ροή εκτέλεσης; ( F8 – βήμα πάνω, F7 – βήμα, F9 – συνέχεια, Shift + F9 – συνέχιση και εξαίρεση)
  2. Πώς να εξετάσετε τα δεδομένα; (Στο παράθυρο Memroy: δεξί κλικ -> δυαδικό -> επεξεργασία , στο παράθυρο εγγραφής: δεξί κλικ -> επεξεργασία)
  3. Πώς να ορίσετε σημεία διακοπής; ( F2 για εναλλαγή soft-breakpoint, F4 – τρέξτε στον κέρσορα, κάντε δεξί κλικ στην εντολή -> Breakpoint -> για υλικό και σημείο πρόσβασης μνήμης )
  4. Σχολιασμός ( ; για τοποθέτηση σχολίου)

Τα περισσότερα από τα παραπάνω βρίσκονται στο μενού εντοπισμού σφαλμάτων του προγράμματος IMM, ωστόσο, είναι πάντα χρήσιμο να θυμάστε τα πλήκτρα συντόμευσης. Εξηγούμε εν συντομία μερικές από τις λειτουργίες που είναι πολύ χρήσιμες στην ανάλυση.

2.1 Έλεγχος ροής εκτέλεσης

Η διαφορά μεταξύ step over/step in είναι παρόμοια με όλα τα άλλα προγράμματα εντοπισμού σφαλμάτων.

Το βήμα στο (F7) μπαίνει στη λειτουργία μιας εντολής κλήσης. Το Step over (F8) εκτελεί ολόκληρη τη λειτουργία και στη συνέχεια σταματά στην επόμενη άμεση εντολή. Σημειώστε ότι το F8 μπορεί να μην σας αποφέρει πάντα το αποτέλεσμα που επιθυμείτε.

Το F9  χρησιμοποιείται συχνά για να συνεχίσει από ένα σημείο που έχετε σταματήσει. Σημειώστε ότι το πρόγραμμα εντοπισμού σφαλμάτων χειρίζεται αυτόματα πολλές εξαιρέσεις για εσάς. Εάν θέλετε να παρακολουθήσετε όλες τις εξαιρέσεις, θα πρέπει να χρησιμοποιήσετε το SHIFT + F9 . Αργότερα, θα δούμε ένα παράδειγμα που ο Max ++ ξαναγράφει το SEH (δομημένη εξαίρεση) για να εντοπίσει την ύπαρξη εντοπιστών σφαλμάτων. Για να παρακάμψετε αυτό το κόλπο κατά του εντοπισμού σφαλμάτων, θα χρησιμοποιήσετε το SHIFT + F9 για να ελέγξετε χειροκίνητα τον κωδικό SEH.

2.2 Χειρισμός δεδομένων

Γενικά, έχετε τρεις τύπους δεδομένων για διαχείριση: (1) καταχωρητές, (2) στοίβα (Stack) και (3) όλα τα άλλα τμήματα (κωδικός, δεδομένα και σωρός).

Για να αλλάξετε την τιμή ενός μητρώου, μπορείτε να κάνετε δεξί κλικ στο μητρώο και να επιλέξετε Επεξεργασία για να αλλάξετε την τιμή του. Σημειώστε ότι όταν ένα μητρώο περιέχει ένα δείκτη μνήμης (η διεύθυνση μιας υποδοχής μνήμης), είναι πολύ βολικό να κάνετε δεξί κλικ πάνω του και να επιλέξετε ” Follow in Dump ” ή ” Follow in Stack ” για να δείτε την αξία του.

Ο σχεδιασμός του IMM δεν σας επιτρέπει να αλλάξετε άμεσα την τιμή του μητρώου EIP στο παράθυρο Register. Ωστόσο, είναι δυνατό να αλλάξετε το EIP χρησιμοποιώντας το παράθυρο shell Python.

Στο παράθυρο Memory Dump, επιλέξτε και κάντε δεξί κλικ σε οποιαδήποτε δεδομένα και στη συνέχεια, επιλέξτε Binary-> Edit . Μπορείτε να εισαγάγετε δεδομένα εύκολα (σαν συμβολοσειρά, ή σαν δυαδικό αριθμό).

Μπορείτε να επαναφέρετε τον κωδικό (ως δεδομένα). Στο παράθυρο CPU, κάντε δεξί κλικ και επιλέξτε ” Assemble “, οπού μπορείτε να τροποποιήσετε άμεσα το τμήμα κώδικα.

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

(1) Κάντε δεξί κλικ στο παράθυρο CPU
(2) Αντιγραφή σε εκτελέσιμο
(3) Αντιγραφή όλων
(4) Κλείστε το παράθυρο διαλόγου (λίστα οδηγιών που έχουν τροποποιηθεί)
(5) Στη συνέχεια, εμφανίζεται ένα παράθυρο διαλόγου που ζητάει “αποθήκευση του αρχείου”. Επιλέξτε “ναι” και αποθηκεύστε το ως νέο εκτελέσιμο αρχείο.

2.3 Σημεία διακοπής

Τα σημεία διακοπής λογισμικού (F2). Είναι παρόμοια με τα breakpoints που διατίθενται στους εντοπιστές σφαλμάτων γλώσσας. Μπορείτε να έχετε απεριόριστα σημεία διακοπής (BP) και μπορείτε να ορίσετε συνθήκες σε ένα BP (π.χ., για να καθορίσετε ότι το BP θα πρέπει να σταματήσει το πρόγραμμα μόνο όταν η τιμή ενός μητρώου είναι ίση με έναν συγκεκριμένο αριθμό).

Τα BP εφαρμόζονται χρησιμοποιώντας την οδηγία INT 3 .

Βασικά, κάθε φορά που ορίζετε ένα σημείο διακοπής σε μια τοποθεσία, το πρόγραμμα εντοπισμού σφαλμάτων αντικαθιστά το ΠΡΩΤΟ byte αυτής της εντολής με INT 3 (εντολή ενός byte) και αποθηκεύει το παλιό byte.

Κάθε φορά που το πρόγραμμα εκτελείται σε αυτήν την τοποθεσία, δημιουργείται μια διακοπή και καλείται ο εντοπιστής σφαλμάτων να χειριστεί αυτήν την εξαίρεση.

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

Τα σημεία διακοπής Hareware μπορούν να ρυθμιστούν με δεξί κλικ στο παράθυρο CPU και στη συνέχεια, επιλέξτε Breakpoints -> Hardware, κατά την εκτέλεση .

Σημειώστε ότι υπάρχουν δύο άλλοι τύποι  availalbe ( μνήμη ανάγνωσης , πρόσβαση στη μνήμη ).

Όπως υποδηλώνει το όνομά του, τα BP επιτυγχάνονται εκμεταλλευόμενα το hardware. Σε έναν επεξεργαστή Intel, υπάρχουν τέσσερις καταχωρητές BP του hardware που καταγράφουν τη θέση των BP. Αυτό σημαίνει ότι ανά πάσα στιγμή, μπορείτε να έχετε έως και 4 BP .

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

2.4 Σχολιασμός χρήστη

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

Στο παράθυρο της CPU, πατώντας “;” σάς επιτρέπει να προσθέσετε ένα σχόλιο σε μια οδηγία και πατώντας “:” σας επιτρέπει να επισημάνετε μια τοποθεσία. Αργότερα, όταν η τοποθεσία αναφέρεται ως μεταβλητή ή συνάρτηση, θα εμφανιστεί η ετικέτα της.

Αυτό θα διευκολύνει σημαντικά τη διαδικασία της ανάλυσης.


Διαβάστε τις Τεχνολογικές Ειδήσεις από όλο τον κόσμο, με την εγκυρότητα του iGuRu.gr

Ακολουθήσετε μας στο Google News iGuRu.gr at Google news