Κοινή χρήση τεχνολογίας

Στατική αναζήτηση για την τοποθεσία κλήσης της λειτουργίας δυναμικής σύνδεσης iOS

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Στατική αναζήτηση για την τοποθεσία κλήσης της λειτουργίας δυναμικής σύνδεσης iOS

Η μορφή εκτελέσιμου αρχείου mach-O είναι μια δυαδική μορφή αρχείου που χρησιμοποιείται στα λειτουργικά συστήματα macOS και iOS της Apple.

Σε ορισμένες σαρώσεις ασφαλείας iOS, μπορεί να χρειαστεί να λάβετε τη συγκεκριμένη θέση κλήσης μιας συνάρτησης, η οποία μπορεί να καθοδηγήσει τους χρήστες στον ακριβέστερο εντοπισμό των τρωτών σημείων.
Πάρτε τώρα ως παράδειγμα τη συνάρτηση NSLog και αναζητήστε στατικά τη συγκεκριμένη θέση κλήσης της συνάρτησης δυναμικής σύνδεσης σε macho.

Στόχος

Αναζητήστε τη συγκεκριμένη τοποθεσία όπου καλείται η συνάρτηση NSLog στην εφαρμογή macho.

Ιδέες

Η όλη διαδικασία αναζήτησης είναι μια διαδικασία ανάλυσης αρχείων macho και ανάλυσης δυαδικών δεδομένων σε κατάλληλες δομές δεδομένων.
Χρησιμοποιούνται πολλαπλά μέρη του macho:
Τραπέζι χορδών
Πίνακας συμβόλων
Δυναμικός πίνακας συμβόλων
Ενότητα 64(ΚΕΙΜΕΝΟ,στελέχη)
Ενότητα 64(ΚΕΙΜΕΝΟ,κείμενο)

Συγκεκριμένα βήματα

1. Βρείτε πρώτα τη θέση του Symbol Talbe και του String Table στο αρχείο macho.

Βρείτε το LC_SYMTAB στις εντολές φόρτωσης, μπορείτε να προσδιορίσετε τη μετατόπιση και το μέγεθος του StringTable και μπορείτε επίσης να βρείτε τη μετατόπιση και τον αριθμό του πίνακα συμβόλων:

Η μετατόπιση του πίνακα συμβόλων είναι 0x18c478
Ο αριθμός των συμβόλων είναι 0x9a2d
Η μετατόπιση του πίνακα συμβολοσειρών είναι 0x2273b0
Το μέγεθος του πίνακα συμβολοσειρών είναι 0x108d58

Επειδή κάθε μήκος δεδομένων συμβόλου είναι 16 byte, που είναι 0x10,

Άρα το μέγεθος του πίνακα συμβόλων είναι 0x9a2d*0x10 = 0x9A2D0
Η αρχική διεύθυνση του Πίνακα συμβόλων είναι 0x18c478
Η τελική διεύθυνση είναι 0x18c478 0x9A2D0 = 0x226748

Η αρχική διεύθυνση του πίνακα συμβολοσειρών είναι 0x2273b0
Η τελική διεύθυνση είναι 0x2273b0 0x108d58 = 0x330108
Επειδή το μήκος της συμβολοσειράς δεν είναι σταθερό, το μήκος κάθε τμήματος δεδομένων στον πίνακα συμβολοσειρών δεν είναι σταθερό.
Όταν διαβάζετε δεδομένα πίνακα συμβολοσειρών σε δυαδικό σύστημα, μπορείτε να χρησιμοποιήσετε το 'x00' ως οριοθέτη συμβολοσειράς.

2. Διασχίστε τον πίνακα συμβολοσειρών και βρείτε _NSLog

Μπορείτε πρώτα να διαβάσετε τα δεδομένα του πίνακα συμβολοσειρών σε macho και να χρησιμοποιήσετε το 'x00' ως διαχωριστικό για να δημιουργήσετε έναν πίνακα συμβολοσειρών.
Διασχίστε τον πίνακα συμβολοσειρών και προσδιορίστε εάν κάθε τμήμα δεδομένων είναι ίσο με "_NSLog".

Το _NSLog βρέθηκε στο 0x23331b και ο κωδικός μηχανήματος "5F4E534C6F6700" είναι η συμβολοσειρά "_NSLogn".

49003 (0xBF6B σε δεκαεξαδικό) είναι ο αριθμός ευρετηρίου της τρέχουσας συμβολοσειράς, ο οποίος προσδιορίζεται προσωρινά ως strTab_index = 49003.
Ο αριθμός ευρετηρίου 49003 υπολογίζεται από την αρχική διεύθυνση 0x2273b0 του πίνακα συμβολοσειρών, το 49003ο byte,
0x2273b0 49003 = 0x23331B, που τυχαίνει να είναι η αρχική διεύθυνση του _NSLog.

3. Σύμφωνα με το 49003 (0xBF6B) στο βήμα 2, μπορείτε να αναζητήσετε το αντίστοιχο σύμβολο στον Πίνακα συμβόλων

Στο MachOView, μπορείτε να δείτε ότι η διεύθυνση 0x00224988 αντιστοιχεί στο _NSLog.

Πώς να βρείτε δεδομένα πίνακα συμβόλων που ταιριάζουν μέσω του αριθμού ευρετηρίου 49003;
Γνωστό στο βήμα 1:
Η αρχική διεύθυνση του πίνακα συμβόλων είναι 0x18c478,
Η τελική διεύθυνση του πίνακα συμβόλων είναι 0x226748.
Σε αυτό το macho, το μέγεθος δεδομένων ενός μεμονωμένου πίνακα συμβόλων είναι 0x10.

Η τιμή των πρώτων τεσσάρων byte του 38993ου τμήματος δεδομένων στον Πίνακα συμβόλων είναι 0xBF6B, που είναι 49003.
Είναι ο ίδιος με τον αριθμό ευρετηρίου της συμβολοσειράς _NSLog στον πίνακα συμβολοσειρών, επομένως αυτά τα δεδομένα αντιστοιχούν στο "_NSLog":

38993 είναι ο αριθμός ευρετηρίου των τρεχόντων δεδομένων στον Πίνακα συμβόλων, προσωρινά symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 είναι ακριβώς η διεύθυνση των τρεχόντων δεδομένων.

4. Βρείτε δεδομένα με βάση το symTab_index στον πίνακα δυναμικών συμβόλων

Η θέση των Έμμεσων Συμβόλων μπορεί να προσδιοριστεί στο LC_DYSYMTAB στις εντολές φόρτωσης στο Macho:

Διεύθυνση έναρξης: 0x226748, υπάρχουν 794 τεμάχια δεδομένων και το μέγεθος κάθε τμήματος δεδομένων είναι 0x4.
Διασχίστε κάθε κομμάτι δεδομένων σε Έμμεσα Σύμβολα Το 111ο κομμάτι δεδομένων αποθηκεύει 38993.
Επομένως, αυτά τα δεδομένα αντιστοιχούν στο "_NSLog", ορίστε dySymTab_index = 111
0x226748 111*0x4 = 0x226904