325 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# macOS Universal binaries & Mach-O Format
{{#
```c
#define MH_MAGIC 0xfeedface /* the mach magic number */
#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
struct mach_header {
uint32_t magic; /* mach magic number identifier */
cpu_type_t cputype; /* cpu specifier (e.g. I386) */
cpu_subtype_t cpusubtype; /* machine specifier */
uint32_t filetype; /* type of file (usage and alignment for the file) */
uint32_t ncmds; /* number of load commands */
uint32_t sizeofcmds; /* the size of all the load commands */
uint32_t flags; /* flags */
};
#define MH_MAGIC_64 0xfeedfacf /* the 64-bit mach magic number */
#define MH_CIGAM_64 0xcffaedfe /* NXSwapInt(MH_MAGIC_64) */
struct mach_header_64 {
uint32_t magic; /* mach magic number identifier */
int32_t cputype; /* cpu specifier */
int32_t cpusubtype; /* machine specifier */
uint32_t filetype; /* type of file */
uint32_t ncmds; /* number of load commands */
uint32_t sizeofcmds; /* the size of all the load commands */
uint32_t flags; /* flags */
uint32_t reserved; /* reserved */
};
```
### Mach-O Τύποι Αρχείων
Υπάρχουν διάφοροι τύποι αρχείων, μπορείτε να τους βρείτε καθορισμένους στον [**πηγαίο κώδικα για παράδειγμα εδώ**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h). Οι πιο σημαντικοί είναι:
- `MH_OBJECT`: Μεταθέσιμο αρχείο αντικειμένου (ενδιάμεσα προϊόντα της μεταγλώττισης, όχι εκτελέσιμα ακόμα).
- `MH_EXECUTE`: Εκτελέσιμα αρχεία.
- `MH_FVMLIB`: Στατικό αρχείο βιβλιοθήκης VM.
- `MH_CORE`: Εκφορτώσεις Κώδικα
- `MH_PRELOAD`: Προφορτωμένο εκτελέσιμο αρχείο (δεν υποστηρίζεται πλέον στο XNU)
- `MH_DYLIB`: Δυναμικές Βιβλιοθήκες
- `MH_DYLINKER`: Δυναμικός Συνδέτης
- `MH_BUNDLE`: "Αρχεία Plugin". Δημιουργούνται χρησιμοποιώντας -bundle στο gcc και φορτώνονται ρητά από το `NSBundle` ή το `dlopen`.
- `MH_DYSM`: Συνοδευτικό αρχείο `.dSym` (αρχείο με σύμβολα για αποσφαλμάτωση).
- `MH_KEXT_BUNDLE`: Επεκτάσεις Πυρήνα.
```bash
# Checking the mac header of a binary
otool -arch arm64e -hv /bin/ls
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 E USR00 EXECUTE 19 1728 NOUNDEFS DYLDLINK TWOLEVEL PIE
```
Ή χρησιμοποιώντας [Mach-O View](https://sourceforge.net/projects/machoview/):
<figure><img src="../../../images/image (1133).png" alt=""><figcaption></figcaption></figure>
## **Σημαίες Mach-O**
Ο πηγαίος κώδικας ορίζει επίσης αρκετές σημαίες χρήσιμες για τη φόρτωση βιβλιοθηκών:
- `MH_NOUNDEFS`: Χωρίς μη καθορισμένες αναφορές (πλήρως συνδεδεμένο)
- `MH_DYLDLINK`: Σύνδεση Dyld
- `MH_PREBOUND`: Δυναμικές αναφορές προδεσμευμένες.
- `MH_SPLIT_SEGS`: Το αρχείο διαχωρίζει τα τμήματα r/o και r/w.
- `MH_WEAK_DEFINES`: Το δυαδικό έχει αδύνατα καθορισμένα σύμβολα
- `MH_BINDS_TO_WEAK`: Το δυαδικό χρησιμοποιεί αδύνατα σύμβολα
- `MH_ALLOW_STACK_EXECUTION`: Κάνει τη στοίβα εκτελέσιμη
- `MH_NO_REEXPORTED_DYLIBS`: Η βιβλιοθήκη δεν έχει εντολές LC_REEXPORT
- `MH_PIE`: Εκτελέσιμο ανεξάρτητης θέσης
- `MH_HAS_TLV_DESCRIPTORS`: Υπάρχει τμήμα με τοπικές μεταβλητές νήματος
- `MH_NO_HEAP_EXECUTION`: Καμία εκτέλεση για σελίδες heap/data
- `MH_HAS_OBJC`: Το δυαδικό έχει τμήματα oBject-C
- `MH_SIM_SUPPORT`: Υποστήριξη προσομοιωτή
- `MH_DYLIB_IN_CACHE`: Χρησιμοποιείται σε dylibs/frameworks στην κοινή βιβλιοθήκη cache.
## **Εντολές φόρτωσης Mach-O**
Η **διάταξη του αρχείου στη μνήμη** καθορίζεται εδώ, περιγράφοντας την **τοποθεσία του πίνακα συμβόλων**, το πλαίσιο του κύριου νήματος κατά την εκκίνηση εκτέλεσης και τις απαιτούμενες **κοινές βιβλιοθήκες**. Δίνονται οδηγίες στον δυναμικό φορτωτή **(dyld)** για τη διαδικασία φόρτωσης του δυαδικού στη μνήμη.
Χρησιμοποιεί τη δομή **load_command**, που ορίζεται στο αναφερόμενο **`loader.h`**:
```objectivec
struct load_command {
uint32_t cmd; /* type of load command */
uint32_t cmdsize; /* total size of command in bytes */
};
```
Υπάρχουν περίπου **50 διαφορετικοί τύποι εντολών φόρτωσης** που το σύστημα χειρίζεται διαφορετικά. Οι πιο κοινοί είναι: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB` και `LC_CODE_SIGNATURE`.
### **LC_SEGMENT/LC_SEGMENT_64**
> [!TIP]
> Βασικά, αυτός ο τύπος Εντολής Φόρτωσης καθορίζει **πώς να φορτώσει το \_\_TEXT** (εκτελέσιμο κώδικα) **και το \_\_DATA** (δεδομένα για τη διαδικασία) **τμήματα** σύμφωνα με τους **offsets που υποδεικνύονται στην ενότητα Δεδομένων** όταν εκτελείται το δυαδικό.
Αυτές οι εντολές **καθορίζουν τμήματα** που είναι **χαρτογραφημένα** στο **εικονικό χώρο μνήμης** μιας διαδικασίας όταν εκτελείται.
Υπάρχουν **διαφορετικοί τύποι** τμημάτων, όπως το **\_\_TEXT** τμήμα, το οποίο περιέχει τον εκτελέσιμο κώδικα ενός προγράμματος, και το **\_\_DATA** τμήμα, το οποίο περιέχει δεδομένα που χρησιμοποιούνται από τη διαδικασία. Αυτά τα **τμήματα βρίσκονται στην ενότητα δεδομένων** του αρχείου Mach-O.
**Κάθε τμήμα** μπορεί να **διαιρεθεί** περαιτέρω σε πολλαπλές **ενότητες**. Η **δομή εντολής φόρτωσης** περιέχει **πληροφορίες** σχετικά με **αυτές τις ενότητες** εντός του αντίστοιχου τμήματος.
Στην κεφαλίδα πρώτα βρίσκετε την **κεφαλίδα τμήματος**:
<pre class="language-c"><code class="lang-c">struct segment_command_64 { /* for 64-bit architectures */
uint32_t cmd; /* LC_SEGMENT_64 */
uint32_t cmdsize; /* includes sizeof section_64 structs */
char segname[16]; /* segment name */
uint64_t vmaddr; /* memory address of this segment */
uint64_t vmsize; /* memory size of this segment */
uint64_t fileoff; /* file offset of this segment */
uint64_t filesize; /* amount to map from the file */
int32_t maxprot; /* maximum VM protection */
int32_t initprot; /* initial VM protection */
<strong> uint32_t nsects; /* number of sections in segment */
</strong> uint32_t flags; /* flags */
};
</code></pre>
Παράδειγμα κεφαλίδας τμήματος:
<figure><img src="../../../images/image (1126).png" alt=""><figcaption></figcaption></figure>
Αυτή η κεφαλίδα καθορίζει τον **αριθμό των ενοτήτων των οποίων οι κεφαλίδες εμφανίζονται μετά** από αυτήν:
```c
struct section_64 { /* for 64-bit architectures */
char sectname[16]; /* name of this section */
char segname[16]; /* segment this section goes in */
uint64_t addr; /* memory address of this section */
uint64_t size; /* size in bytes of this section */
uint32_t offset; /* file offset of this section */
uint32_t align; /* section alignment (power of 2) */
uint32_t reloff; /* file offset of relocation entries */
uint32_t nreloc; /* number of relocation entries */
uint32_t flags; /* flags (section type and attributes)*/
uint32_t reserved1; /* reserved (for offset or index) */
uint32_t reserved2; /* reserved (for count or sizeof) */
uint32_t reserved3; /* reserved */
};
```
Παράδειγμα **επικεφαλίδας ενότητας**:
<figure><img src="../../../images/image (1108).png" alt=""><figcaption></figcaption></figure>
Αν **προσθέσετε** την **εκτροπή ενότητας** (0x37DC) + την **εκτροπή** όπου **ξεκινά η αρχιτεκτονική**, σε αυτή την περίπτωση `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
<figure><img src="../../../images/image (701).png" alt=""><figcaption></figcaption></figure>
Είναι επίσης δυνατό να αποκτήσετε **πληροφορίες επικεφαλίδων** από τη **γραμμή εντολών** με:
```bash
otool -lv /bin/ls
```
Κοινά τμήματα που φορτώνονται από αυτή την εντολή:
- **`__PAGEZERO`:** Δίνει εντολή στον πυρήνα να **χαρτογραφήσει** τη **διεύθυνση μηδέν** έτσι ώστε να **μην μπορεί να διαβαστεί, να γραφτεί ή να εκτελεστεί**. Οι μεταβλητές maxprot και minprot στη δομή είναι ρυθμισμένες σε μηδέν για να υποδείξουν ότι δεν υπάρχουν **δικαιώματα ανάγνωσης-γραφής-εκτέλεσης σε αυτή τη σελίδα**.
- Αυτή η κατανομή είναι σημαντική για να **μειώσει τις ευπάθειες αποδόμησης δείκτη NULL**. Αυτό συμβαίνει επειδή το XNU επιβάλλει μια σκληρή σελίδα μηδέν που διασφαλίζει ότι η πρώτη σελίδα (μόνο η πρώτη) της μνήμης είναι μη προσβάσιμη (εκτός από το i386). Ένα δυαδικό αρχείο θα μπορούσε να πληροί αυτές τις απαιτήσεις δημιουργώντας μια μικρή \_\_PAGEZERO (χρησιμοποιώντας το `-pagezero_size`) για να καλύψει τα πρώτα 4k και να έχει την υπόλοιπη μνήμη 32bit προσβάσιμη τόσο σε λειτουργία χρήστη όσο και σε λειτουργία πυρήνα.
- **`__TEXT`**: Περιέχει **εκτελέσιμο** **κώδικα** με **δικαιώματα ανάγνωσης** και **εκτέλεσης** (όχι εγγράψιμα)**.** Κοινές ενότητες αυτού του τμήματος:
- `__text`: Συμπιεσμένος δυαδικός κώδικας
- `__const`: Σταθερά δεδομένα (μόνο ανάγνωση)
- `__[c/u/os_log]string`: Σταθερές συμβολοσειρές C, Unicode ή os logs
- `__stubs` και `__stubs_helper`: Συμμετέχουν κατά τη διαδικασία φόρτωσης δυναμικής βιβλιοθήκης
- `__unwind_info`: Δεδομένα αποδόμησης στοίβας.
- Σημειώστε ότι όλο αυτό το περιεχόμενο είναι υπογεγραμμένο αλλά και επισημασμένο ως εκτελέσιμο (δημιουργώντας περισσότερες επιλογές για εκμετάλλευση τμημάτων που δεν χρειάζονται απαραίτητα αυτό το προνόμιο, όπως οι τμήματα που είναι αφιερωμένα σε συμβολοσειρές).
- **`__DATA`**: Περιέχει δεδομένα που είναι **αναγνώσιμα** και **γραφόμενα** (όχι εκτελέσιμα)**.**
- `__got:` Παγκόσμιος Πίνακας Μεταθέσεων
- `__nl_symbol_ptr`: Μη τεμπέλης (δεσμευμένος κατά τη φόρτωση) δείκτης συμβόλου
- `__la_symbol_ptr`: Τεμπέλης (δεσμευμένος κατά τη χρήση) δείκτης συμβόλου
- `__const`: Θα έπρεπε να είναι δεδομένα μόνο ανάγνωσης (όχι πραγματικά)
- `__cfstring`: Συμβολοσειρές CoreFoundation
- `__data`: Παγκόσμιες μεταβλητές (που έχουν αρχικοποιηθεί)
- `__bss`: Στατικές μεταβλητές (που δεν έχουν αρχικοποιηθεί)
- `__objc_*` (\_\_objc_classlist, \_\_objc_protolist, κ.λπ.): Πληροφορίες που χρησιμοποιούνται από το Objective-C runtime
- **`__DATA_CONST`**: \_\_DATA.\_\_const δεν εγγυάται ότι είναι σταθερό (δικαιώματα εγγραφής), ούτε είναι άλλοι δείκτες και ο GOT. Αυτή η ενότητα καθιστά το `__const`, κάποιους αρχικοποιητές και τον πίνακα GOT (μόλις επιλυθεί) **μόνο ανάγνωσης** χρησιμοποιώντας το `mprotect`.
- **`__LINKEDIT`**: Περιέχει πληροφορίες για τον συνδέτη (dyld) όπως, συμβόλων, συμβολοσειρών και καταχωρήσεων πίνακα μεταθέσεων. Είναι ένας γενικός κάδος για περιεχόμενα που δεν βρίσκονται ούτε στο `__TEXT` ούτε στο `__DATA` και το περιεχόμενό του περιγράφεται σε άλλες εντολές φόρτωσης.
- πληροφορίες dyld: Επαναφορά, Μη τεμπέλης/τεμπέλης/ασθενής κωδικοί δέσμευσης και πληροφορίες εξαγωγής
- Λειτουργίες εκκίνησης: Πίνακας διευθύνσεων εκκίνησης λειτουργιών
- Δεδομένα στον Κώδικα: Νησίδες δεδομένων στο \_\_text
- Πίνακας Συμβόλων: Συμβολα σε δυαδικό
- Πίνακας Έμμεσων Συμβόλων: Δείκτες/συμβολα στήριξης
- Πίνακας Συμβολοσειρών
- Υπογραφή Κώδικα
- **`__OBJC`**: Περιέχει πληροφορίες που χρησιμοποιούνται από το Objective-C runtime. Αν και αυτές οι πληροφορίες μπορεί επίσης να βρεθούν στο τμήμα \_\_DATA, μέσα σε διάφορες ενότητες \_\_objc\_\*.
- **`__RESTRICT`**: Ένα τμήμα χωρίς περιεχόμενο με μια μόνο ενότητα που ονομάζεται **`__restrict`** (επίσης κενή) που διασφαλίζει ότι κατά την εκτέλεση του δυαδικού αρχείου, θα αγνοήσει τις μεταβλητές περιβάλλοντος DYLD.
Όπως ήταν δυνατόν να δούμε στον κώδικα, **τα τμήματα υποστηρίζουν επίσης σημαίες** (αν και δεν χρησιμοποιούνται πολύ):
- `SG_HIGHVM`: Μόνο πυρήνας (δεν χρησιμοποιείται)
- `SG_FVMLIB`: Δεν χρησιμοποιείται
- `SG_NORELOC`: Το τμήμα δεν έχει μεταθέσεις
- `SG_PROTECTED_VERSION_1`: Κρυπτογράφηση. Χρησιμοποιείται για παράδειγμα από τον Finder για να κρυπτογραφήσει το τμήμα `__TEXT`.
### **`LC_UNIXTHREAD/LC_MAIN`**
**`LC_MAIN`** περιέχει το σημείο εισόδου στην **ιδιότητα entryoff.** Κατά τη διάρκεια της φόρτωσης, το **dyld** απλά **προσθέτει** αυτή την τιμή στη (στη μνήμη) **βάση του δυαδικού αρχείου**, στη συνέχεια **πηδά** σε αυτή την εντολή για να ξεκινήσει την εκτέλεση του κώδικα του δυαδικού αρχείου.
**`LC_UNIXTHREAD`** περιέχει τις τιμές που πρέπει να έχει ο καταχωρητής κατά την εκκίνηση του κύριου νήματος. Αυτό έχει ήδη αποσυρθεί αλλά το **`dyld`** εξακολουθεί να το χρησιμοποιεί. Είναι δυνατόν να δει κανείς τις τιμές των καταχωρητών που ορίζονται από αυτό με:
```bash
otool -l /usr/lib/dyld
[...]
Load command 13
cmd LC_UNIXTHREAD
cmdsize 288
flavor ARM_THREAD_STATE64
count ARM_THREAD_STATE64_COUNT
x0 0x0000000000000000 x1 0x0000000000000000 x2 0x0000000000000000
x3 0x0000000000000000 x4 0x0000000000000000 x5 0x0000000000000000
x6 0x0000000000000000 x7 0x0000000000000000 x8 0x0000000000000000
x9 0x0000000000000000 x10 0x0000000000000000 x11 0x0000000000000000
x12 0x0000000000000000 x13 0x0000000000000000 x14 0x0000000000000000
x15 0x0000000000000000 x16 0x0000000000000000 x17 0x0000000000000000
x18 0x0000000000000000 x19 0x0000000000000000 x20 0x0000000000000000
x21 0x0000000000000000 x22 0x0000000000000000 x23 0x0000000000000000
x24 0x0000000000000000 x25 0x0000000000000000 x26 0x0000000000000000
x27 0x0000000000000000 x28 0x0000000000000000 fp 0x0000000000000000
lr 0x0000000000000000 sp 0x0000000000000000 pc 0x0000000000004b70
cpsr 0x00000000
[...]
```
### **`LC_CODE_SIGNATURE`**
Περιέχει πληροφορίες σχετικά με την **υπογραφή κώδικα του αρχείου Macho-O**. Περιέχει μόνο μια **μετατόπιση** που **δείχνει** στο **blob υπογραφής**. Αυτό είναι συνήθως στο τέλος του αρχείου.\
Ωστόσο, μπορείτε να βρείτε κάποιες πληροφορίες σχετικά με αυτή την ενότητα σε [**αυτή την ανάρτηση στο blog**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) και σε αυτό το [**gist**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4).
### **`LC_ENCRYPTION_INFO[_64]`**
Υποστήριξη για κρυπτογράφηση δυαδικών αρχείων. Ωστόσο, φυσικά, αν ένας επιτιθέμενος καταφέρει να παραβιάσει τη διαδικασία, θα μπορεί να εκφορτώσει τη μνήμη χωρίς κρυπτογράφηση.
### **`LC_LOAD_DYLINKER`**
Περιέχει την **διαδρομή προς το εκτελέσιμο αρχείο του δυναμικού συνδέτη** που χαρτογραφεί τις κοινές βιβλιοθήκες στον χώρο διευθύνσεων της διαδικασίας. Η **τιμή είναι πάντα ρυθμισμένη σε `/usr/lib/dyld`**. Είναι σημαντικό να σημειωθεί ότι στο macOS, η χαρτογράφηση dylib συμβαίνει σε **λειτουργία χρήστη**, όχι σε λειτουργία πυρήνα.
### **`LC_IDENT`**
Απαρχαιωμένο αλλά όταν ρυθμίζεται για να δημιουργεί εκφορτώσεις σε πανικό, δημιουργείται μια πυρήνα Mach-O και η έκδοση του πυρήνα ρυθμίζεται στην εντολή `LC_IDENT`.
### **`LC_UUID`**
Τυχαίο UUID. Είναι χρήσιμο για οτιδήποτε άμεσα αλλά το XNU το αποθηκεύει με τις υπόλοιπες πληροφορίες της διαδικασίας. Μπορεί να χρησιμοποιηθεί σε αναφορές σφαλμάτων.
### **`LC_DYLD_ENVIRONMENT`**
Επιτρέπει την ένδειξη μεταβλητών περιβάλλοντος στο dyld πριν εκτελεστεί η διαδικασία. Αυτό μπορεί να είναι πολύ επικίνδυνο καθώς μπορεί να επιτρέψει την εκτέλεση αυθαίρετου κώδικα μέσα στη διαδικασία, οπότε αυτή η εντολή φόρτωσης χρησιμοποιείται μόνο σε dyld που έχει κατασκευαστεί με `#define SUPPORT_LC_DYLD_ENVIRONMENT` και περιορίζει περαιτέρω την επεξεργασία μόνο σε μεταβλητές της μορφής `DYLD_..._PATH` που καθορίζουν διαδρομές φόρτωσης.
### **`LC_LOAD_DYLIB`**
Αυτή η εντολή φόρτωσης περιγράφει μια **δυναμική** **εξάρτηση βιβλιοθήκης** που **δίνει οδηγίες** στον **φορτωτή** (dyld) να **φορτώσει και να συνδέσει την εν λόγω βιβλιοθήκη**. Υπάρχει μια εντολή φόρτωσης `LC_LOAD_DYLIB` **για κάθε βιβλιοθήκη** που απαιτεί το δυαδικό Mach-O.
- Αυτή η εντολή φόρτωσης είναι μια δομή τύπου **`dylib_command`** (η οποία περιέχει μια δομή dylib, περιγράφοντας την πραγματική εξαρτώμενη δυναμική βιβλιοθήκη):
```objectivec
struct dylib_command {
uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */
uint32_t cmdsize; /* includes pathname string */
struct dylib dylib; /* the library identification */
};
struct dylib {
union lc_str name; /* library's path name */
uint32_t timestamp; /* library's build time stamp */
uint32_t current_version; /* library's current version number */
uint32_t compatibility_version; /* library's compatibility vers number*/
};
```
![](<../../../images/image (486).png>)
Μπορείτε επίσης να αποκτήσετε αυτές τις πληροφορίες από το cli με:
```bash
otool -L /bin/ls
/bin/ls:
/usr/lib/libutil.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.0.0)
```
Ορισμένες πιθανές βιβλιοθήκες που σχετίζονται με κακόβουλο λογισμικό είναι:
- **DiskArbitration**: Παρακολούθηση USB drives
- **AVFoundation:** Καταγραφή ήχου και βίντεο
- **CoreWLAN**: Σαρώσεις Wifi.
> [!NOTE]
> Ένα Mach-O δυαδικό μπορεί να περιέχει έναν ή **περισσότερους** **κατασκευαστές**, που θα **εκτελούνται** **πριν** από τη διεύθυνση που καθορίζεται στο **LC_MAIN**.\
> Οι μετατοπίσεις οποιωνδήποτε κατασκευαστών κρατούνται στην ενότητα **\_\_mod_init_func** του τμήματος **\_\_DATA_CONST**.
## **Δεδομένα Mach-O**
Στον πυρήνα του αρχείου βρίσκεται η περιοχή δεδομένων, η οποία αποτελείται από αρκετά τμήματα όπως ορίζονται στην περιοχή εντολών φόρτωσης. **Μια ποικιλία τμημάτων δεδομένων μπορεί να φιλοξενηθεί μέσα σε κάθε τμήμα**, με κάθε τμήμα **να περιέχει κώδικα ή δεδομένα** συγκεκριμένα για έναν τύπο.
> [!TIP]
> Τα δεδομένα είναι βασικά το μέρος που περιέχει όλες τις **πληροφορίες** που φορτώνονται από τις εντολές φόρτωσης **LC_SEGMENTS_64**
![https://www.oreilly.com/api/v2/epubs/9781785883378/files/graphics/B05055_02_38.jpg](<../../../images/image (507) (3).png>)
Αυτό περιλαμβάνει:
- **Πίνακας συναρτήσεων:** Ο οποίος περιέχει πληροφορίες σχετικά με τις συναρτήσεις του προγράμματος.
- **Πίνακας συμβόλων**: Ο οποίος περιέχει πληροφορίες σχετικά με τη εξωτερική συνάρτηση που χρησιμοποιείται από το δυαδικό
- Μπορεί επίσης να περιέχει εσωτερικές συναρτήσεις, ονόματα μεταβλητών καθώς και περισσότερα.
Για να το ελέγξετε μπορείτε να χρησιμοποιήσετε το [**Mach-O View**](https://sourceforge.net/projects/machoview/) εργαλείο:
<figure><img src="../../../images/image (1120).png" alt=""><figcaption></figcaption></figure>
Ή από το cli:
```bash
size -m /bin/ls
```
## Objetive-C Κοινές Ενότητες
Στο `__TEXT` τμήμα (r-x):
- `__objc_classname`: Ονόματα κλάσεων (αλφαριθμητικά)
- `__objc_methname`: Ονόματα μεθόδων (αλφαριθμητικά)
- `__objc_methtype`: Τύποι μεθόδων (αλφαριθμητικά)
Στο `__DATA` τμήμα (rw-):
- `__objc_classlist`: Δείκτες σε όλες τις κλάσεις Objetive-C
- `__objc_nlclslist`: Δείκτες σε μη-τεμπέλικες κλάσεις Objective-C
- `__objc_catlist`: Δείκτης σε Κατηγορίες
- `__objc_nlcatlist`: Δείκτης σε μη-τεμπέλικες Κατηγορίες
- `__objc_protolist`: Λίστα πρωτοκόλλων
- `__objc_const`: Σταθερά δεδομένα
- `__objc_imageinfo`, `__objc_selrefs`, `objc__protorefs`...
## Swift
- `_swift_typeref`, `_swift3_capture`, `_swift3_assocty`, `_swift3_types, _swift3_proto`, `_swift3_fieldmd`, `_swift3_builtin`, `_swift3_reflstr`
{{#include ../../../banners/hacktricks-training.md}}