Translated ['src/generic-methodologies-and-resources/basic-forensic-meth

This commit is contained in:
Translator 2025-10-01 01:55:24 +00:00
parent 1fd90d6667
commit 4f03a98afa
5 changed files with 425 additions and 194 deletions

View File

@ -61,6 +61,7 @@
- [Deofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
- [Discord Cache Forensics](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md)
- [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
- [Mach O Entitlements And Ipsw Indexing](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md)
- [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
- [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
- [PNG tricks](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md)

View File

@ -1,8 +1,8 @@
# Mbinu Maalum za Programu/Aina za Faili
# Hila Maalum za Programu/Aina za Faili
{{#include ../../../banners/hacktricks-training.md}}
Hapa unaweza kupata mbinu za kuvutia kwa aina maalum za faili na/au programu:
Hapa unaweza kupata hila za kuvutia kwa aina maalum za faili na/au programu:
{{#ref}}
@ -54,4 +54,9 @@ video-and-audio-file-analysis.md
zips-tricks.md
{{#endref}}
{{#ref}}
mach-o-entitlements-and-ipsw-indexing.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,213 @@
# Mach-O Uchimbaji wa Entitlements & Kuorodhesha IPSW
{{#include ../../../banners/hacktricks-training.md}}
## Muhtasari
Kurasa hii inaelezea jinsi ya kuchimba entitlements kutoka Mach-O binaries kwa njia ya programu kwa kupitia LC_CODE_SIGNATURE na kuchambua code signing SuperBlob, na jinsi ya kupanua hili kwa firmwares za Apple IPSW kwa kuiweka (mount) na kuorodhesha yaliyomo yao kwa ajili ya utafutaji/ukilinganishaji wa forensi.
Ikiwa unahitaji ukumbusho kuhusu muundo wa Mach-O na code signing, angalia pia: macOS code signing and SuperBlob internals.
- Angalia macOS code signing details (SuperBlob, Code Directory, special slots): [macOS Code Signing](../../../macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md)
- Angalia general Mach-O structures/load commands: [Universal binaries & Mach-O Format](../../../macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)
## Entitlements in Mach-O: where they live
Entitlements zimetunzwa ndani ya data ya code signature inayorejelewa na load command ya LC_CODE_SIGNATURE na kuwekwa katika segment ya __LINKEDIT. Saini ni CS_SuperBlob iliyobeba blobs nyingi (code directory, requirements, entitlements, CMS, n.k.). The entitlements blob ni CS_GenericBlob ambayo data yake ni Apple Binary Property List (bplist00) inayofananisha funguo za entitlement na thamani.
Miundo kuu (kutoka xnu):
```c
/* mach-o/loader.h */
struct mach_header_64 {
uint32_t magic;
cpu_type_t cputype;
cpu_subtype_t cpusubtype;
uint32_t filetype;
uint32_t ncmds;
uint32_t sizeofcmds;
uint32_t flags;
uint32_t reserved;
};
struct load_command {
uint32_t cmd;
uint32_t cmdsize;
};
/* Entitlements live behind LC_CODE_SIGNATURE (cmd=0x1d) */
struct linkedit_data_command {
uint32_t cmd; /* LC_CODE_SIGNATURE */
uint32_t cmdsize; /* sizeof(struct linkedit_data_command) */
uint32_t dataoff; /* file offset of data in __LINKEDIT */
uint32_t datasize; /* file size of data in __LINKEDIT */
};
/* osfmk/kern/cs_blobs.h */
typedef struct __SC_SuperBlob {
uint32_t magic; /* CSMAGIC_EMBEDDED_SIGNATURE = 0xfade0cc0 */
uint32_t length;
uint32_t count;
CS_BlobIndex index[];
} CS_SuperBlob;
typedef struct __BlobIndex {
uint32_t type; /* e.g., CSMAGIC_EMBEDDED_ENTITLEMENTS = 0xfade7171 */
uint32_t offset; /* offset of entry */
} CS_BlobIndex;
typedef struct __SC_GenericBlob {
uint32_t magic; /* same as type when standalone */
uint32_t length;
char data[]; /* Apple Binary Plist containing entitlements */
} CS_GenericBlob;
```
Konstanti muhimu:
- LC_CODE_SIGNATURE cmd = 0x1d
- CS SuperBlob magic = 0xfade0cc0
- Entitlements blob type (CSMAGIC_EMBEDDED_ENTITLEMENTS) = 0xfade7171
- DER entitlements may be present via special slot (e.g., -7), see the macOS Code Signing page for special slots and DER entitlements notes
Kumbuka: Multi-arch (fat) binaries zina Mach-O slices nyingi. Lazima uchague slice kwa architecture unayotaka kuchunguza kisha upitie load commands zake.
## Hatua za uchimbaji (za jumla, zisizopoteza-data-kutosha)
1) Changanua Mach-O header; rudi kupitia rekodi za load_command zilizo ndani ya ncmds.
2) Tafuta LC_CODE_SIGNATURE; soma linkedit_data_command.dataoff/datasize ili ramani Code Signing SuperBlob iliyowekwa katika __LINKEDIT.
3) Thibitisha CS_SuperBlob.magic == 0xfade0cc0; pitia idadi ya entries za CS_BlobIndex.
4) Tafuta index.type == 0xfade7171 (embedded entitlements). Soma CS_GenericBlob inayokaliwa na changanua data yake kama Apple binary plist (bplist00) ili kupata entitlements za key/value.
Vidokezo vya utekelezaji:
- Code signature structures zinatumia fields za big-endian; badilisha mpangilio wa bytes unapochanganua kwenye hosts za little-endian.
- The entitlements GenericBlob data yenyewe ni binary plist (inashughulikiwa na maktaba za kawaida za plist).
- Binaries za iOS zinaweza kubeba DER entitlements; pia baadhi ya stores/slots zinaweza kutofautiana kwa platforms/versions tofauti. Angalia kwa pande zote entitlements za kawaida na DER kadri inavyohitajika.
- Kwa fat binaries, tumia fat headers (FAT_MAGIC/FAT_MAGIC_64) kupata slice na offset sahihi kabla ya kupitia Mach-O load commands.
## Muhtasari mdogo wa parsing (Python)
Ifuatayo ni muhtasari mfupi unaoonyesha mtiririko wa udhibiti wa kupata na ku-decoder entitlements. Kwa makusudi haujajumuisha ukaguzi thabiti wa bounds na msaada kamili wa fat binary kwa kifupi.
```python
import plistlib, struct
LC_CODE_SIGNATURE = 0x1d
CSMAGIC_EMBEDDED_SIGNATURE = 0xfade0cc0
CSMAGIC_EMBEDDED_ENTITLEMENTS = 0xfade7171
# all code-signing integers are big-endian per cs_blobs.h
be32 = lambda b, off: struct.unpack_from(">I", b, off)[0]
def parse_entitlements(macho_bytes):
# assume already positioned at a single-arch Mach-O slice
magic, = struct.unpack_from("<I", macho_bytes, 0)
is64 = magic in (0xfeedfacf,)
if is64:
ncmds = struct.unpack_from("<I", macho_bytes, 0x10)[0]
sizeofcmds = struct.unpack_from("<I", macho_bytes, 0x14)[0]
off = 0x20
else:
# 32-bit not shown
return None
code_sig_off = code_sig_size = None
for _ in range(ncmds):
cmd, cmdsize = struct.unpack_from("<II", macho_bytes, off)
if cmd == LC_CODE_SIGNATURE:
# struct linkedit_data_command is little-endian in file
_, _, dataoff, datasize = struct.unpack_from("<IIII", macho_bytes, off)
code_sig_off, code_sig_size = dataoff, datasize
off += cmdsize
if code_sig_off is None:
return None
blob = macho_bytes[code_sig_off: code_sig_off + code_sig_size]
if be32(blob, 0x0) != CSMAGIC_EMBEDDED_SIGNATURE:
return None
count = be32(blob, 0x8)
# iterate BlobIndex entries (8 bytes each after 12-byte header)
for i in range(count):
idx_off = 12 + i*8
btype = be32(blob, idx_off)
boff = be32(blob, idx_off+4)
if btype == CSMAGIC_EMBEDDED_ENTITLEMENTS:
# GenericBlob is big-endian header followed by bplist
glen = be32(blob, boff+4)
data = blob[boff+8: boff+glen]
return plistlib.loads(data)
return None
```
Usage tips:
- Ili kushughulikia fat binaries, kwanza soma struct fat_header/fat_arch, chagua slice ya architecture unayotaka, kisha pate subrange kwa parse_entitlements.
- Kwenye macOS unaweza kuthibitisha matokeo kwa: codesign -d --entitlements :- /path/to/binary
## Mfano za matokeo
Binaries za platform zenye ruhusa za juu mara nyingi huomba entitlements nyeti kama:
- com.apple.security.network.server = true
- com.apple.rootless.storage.early_boot_mount = true
- com.apple.private.kernel.system-override = true
- com.apple.private.pmap.load-trust-cache = ["cryptex1.boot.os", "cryptex1.boot.app", "cryptex1.safari-downlevel"]
Kutafuta hizi kwa wingi katika firmware images ni muhimu sana kwa attack surface mapping na diffing across releases/devices.
## Kupanua kwa IPSWs (mounting and indexing)
Ili kuorodhesha executables na kutoa entitlements kwa wingi bila kuhifadhi picha kamili:
- Tumia ipsw tool by @blacktop kupakua na ku-mount firmware filesystems. Mounting inategemea apfs-fuse, hivyo unaweza kupitia APFS volumes bila full extraction.
```bash
# Download latest IPSW for iPhone11,2 (iPhone XS)
ipsw download ipsw -y --device iPhone11,2 --latest
# Mount IPSW filesystem (uses underlying apfs-fuse)
ipsw mount fs <IPSW_FILE>
```
- Pitia volumes zilizowekwa (mounted) ili kupata Mach-O files (angalia magic na/au tumia file/otool), kisha changanua entitlements na imported frameworks.
- Hifadhi mtazamo uliosanifishwa katika relational database ili kuepuka ukuaji wa mstari kwa mamilioni ya IPSWs:
- executables, operating_system_versions, entitlements, frameworks
- many-to-many: executable↔OS version, executable↔entitlement, executable↔framework
Mfano wa query kuorodhesha OS versions zote zenye executable name fulani:
```sql
SELECT osv.version AS "Versions"
FROM device d
LEFT JOIN operating_system_version osv ON osv.device_id = d.id
LEFT JOIN executable_operating_system_version eosv ON eosv.operating_system_version_id = osv.id
LEFT JOIN executable e ON e.id = eosv.executable_id
WHERE e.name = "launchd";
```
Vidokezo kuhusu portability ya DB (ikiwa utaweka indexer yako mwenyewe):
- Tumia ORM/abstraction (mfano, SeaORM) ili kuweka code DB-agnostic (SQLite/PostgreSQL).
- SQLite inahitaji AUTOINCREMENT tu kwenye INTEGER PRIMARY KEY; ikiwa unataka i64 PKs katika Rust, tengeneza entities kama i32 na ubadilishe aina, SQLite huhifadhi INTEGER kama 8-byte signed ndani.
## Open-source tooling and references for entitlement hunting
- Mount/download ya firmware: https://github.com/blacktop/ipsw
- Entitlement databases and references:
- Jonathan Levins entitlement DB: https://newosxbook.com/ent.php
- entdb: https://github.com/ChiChou/entdb
- Large-scale indexer (Rust, self-hosted Web UI + OpenAPI): https://github.com/synacktiv/appledb_rs
- Apple headers for structures and constants:
- loader.h (Mach-O headers, load commands)
- cs_blobs.h (SuperBlob, GenericBlob, CodeDirectory)
For more on code signing internals (Code Directory, special slots, DER entitlements), see: [macOS Code Signing](../../../macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md)
## References
- [appledb_rs: a research support tool for Apple platforms](https://www.synacktiv.com/publications/appledbrs-un-outil-daide-a-la-recherche-sur-plateformes-apple.html)
- [synacktiv/appledb_rs](https://github.com/synacktiv/appledb_rs)
- [blacktop/ipsw](https://github.com/blacktop/ipsw)
- [Jonathan Levins entitlement DB](https://newosxbook.com/ent.php)
- [ChiChou/entdb](https://github.com/ChiChou/entdb)
- [XNU cs_blobs.h](https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/kern/cs_blobs.h)
- [XNU mach-o/loader.h](https://github.com/apple-oss-distributions/xnu/blob/main/EXTERNAL_HEADERS/mach-o/loader.h)
- [SQLite Datatypes](https://sqlite.org/datatype3.html)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,13 +2,13 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Taarifa za Msingi
Mac OS binaries kawaida huandaliwa kama **universal binaries**. **Universal binary** inaweza **kuunga mkono usanifu nyingi katika faili moja**.
Binaries za macOS kwa kawaida zimetengenezwa kama **universal binaries**. **Universal binary** inaweza **kuunga mkono architectures nyingi katika faili moja**.
Binaries hizi zinafuata **Mach-O structure** ambayo kimsingi inajumuisha:
Binaries hizi zinafuata **muundo wa Mach-O** ambao kwa msingi unajumuisha:
- Header
- Kichwa
- Load Commands
- Data
@ -16,33 +16,33 @@ Binaries hizi zinafuata **Mach-O structure** ambayo kimsingi inajumuisha:
## Fat Header
Tafuta faili kwa: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
Tafuta faili kwa kutumia: `mdfind fat.h | grep -i mach-o | grep -E "fat.h$"`
<pre class="language-c"><code class="lang-c"><strong>#define FAT_MAGIC 0xcafebabe
</strong><strong>#define FAT_CIGAM 0xbebafeca /* NXSwapLong(FAT_MAGIC) */
</strong>
struct fat_header {
<strong> uint32_t magic; /* FAT_MAGIC au FAT_MAGIC_64 */
</strong><strong> uint32_t nfat_arch; /* idadi ya structs zinazofuata */
<strong> uint32_t magic; /* FAT_MAGIC or FAT_MAGIC_64 */
</strong><strong> uint32_t nfat_arch; /* number of structs that follow */
</strong>};
struct fat_arch {
cpu_type_t cputype; /* mwelekeo wa cpu (int) */
cpu_subtype_t cpusubtype; /* mwelekeo wa mashine (int) */
uint32_t offset; /* ofisi ya faili kwa faili hii ya kitu */
uint32_t size; /* ukubwa wa faili hii ya kitu */
uint32_t align; /* usawa kama nguvu ya 2 */
cpu_type_t cputype; /* cpu specifier (int) */
cpu_subtype_t cpusubtype; /* machine specifier (int) */
uint32_t offset; /* file offset to this object file */
uint32_t size; /* size of this object file */
uint32_t align; /* alignment as a power of 2 */
};
</code></pre>
Header ina **magic** bytes ikifuatiwa na **idadi** ya **archs** faili **inayo** (`nfat_arch`) na kila arch itakuwa na `fat_arch` struct.
Kichwa kina bytes za **magic** zikifuatiwa na **idadi** ya **archs** ambayo faili **ina** (`nfat_arch`) na kila arch itakuwa na struct ya `fat_arch`.
Angalia kwa:
Angalia kwa kutumia:
<pre class="language-shell-session"><code class="lang-shell-session">% file /bin/ls
/bin/ls: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/bin/ls (kwa usanifu x86_64): Mach-O 64-bit executable x86_64
/bin/ls (kwa usanifu arm64e): Mach-O 64-bit executable arm64e
/bin/ls (for architecture x86_64): Mach-O 64-bit executable x86_64
/bin/ls (for architecture arm64e): Mach-O 64-bit executable arm64e
% otool -f -v /bin/ls
Fat headers
@ -64,15 +64,15 @@ capabilities PTR_AUTH_VERSION USERSPACE 0
</strong> align 2^14 (16384)
</code></pre>
au kwa kutumia zana ya [Mach-O View](https://sourceforge.net/projects/machoview/):
au ukitumia zana ya [Mach-O View](https://sourceforge.net/projects/machoview/):
<figure><img src="../../../images/image (1094).png" alt=""><figcaption></figcaption></figure>
Kama unavyoweza kufikiria, kawaida **universal binary** iliyoundwa kwa usanifu 2 **inaongeza ukubwa** wa moja iliyoundwa kwa usanifu 1 tu.
Kama unavyoweza kufikiri, kawaida universal binary iliyojengwa kwa architectures 2 **inafanya ukubwa kuwa mara mbili** ikilinganishwa na ile iliyojengwa kwa arch 1.
## **Mach-O Header**
Header ina taarifa za msingi kuhusu faili, kama vile magic bytes kutambua kama faili ya Mach-O na taarifa kuhusu usanifu wa lengo. Unaweza kuipata katika: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
Kichwa kina taarifa za msingi kuhusu faili, kama vile magic bytes za kuitambulisha kama faili la Mach-O na taarifa kuhusu architecture lengwa. Unaweza kuipata katika: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"`
```c
#define MH_MAGIC 0xfeedface /* the mach magic number */
#define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */
@ -101,18 +101,18 @@ uint32_t reserved; /* reserved */
```
### Aina za Faili za Mach-O
Kuna aina tofauti za faili, unaweza kuziona zikifafanuliwa katika [**kanuni ya chanzo kwa mfano hapa**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h). Aina muhimu zaidi ni:
Kuna aina mbalimbali za faili; unaweza kuziona zikiwa zimetangazwa katika [**source code for example here**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h). Muhimu zaidi ni zifuatazo:
- `MH_OBJECT`: Faili ya kitu inayoweza kuhamishwa (bidhaa za kati za uundaji, bado si executable).
- `MH_EXECUTE`: Faili zinazoweza kutekelezwa.
- `MH_FVMLIB`: Faili ya maktaba ya VM iliyowekwa.
- `MH_CORE`: Mifumo ya Kanuni
- `MH_PRELOAD`: Faili ya executable iliyopakiwa mapema (haipati tena msaada katika XNU)
- `MH_DYLIB`: Maktaba za Kijadi
- `MH_DYLINKER`: Kiunganishi Kijadi
- `MH_BUNDLE`: "Faili za Plugin". Zilizozalishwa kwa kutumia -bundle katika gcc na kupakiwa wazi na `NSBundle` au `dlopen`.
- `MH_DYSM`: Faili ya mshirika `.dSym` (faili yenye alama za kutatua matatizo).
- `MH_KEXT_BUNDLE`: Nyongeza za Kernel.
- `MH_OBJECT`: Relocatable object file (bidhaa za kati za utekelezaji wa compilation, bado si executable).
- `MH_EXECUTE`: Executable files.
- `MH_FVMLIB`: Faili la maktaba ya VM imara.
- `MH_CORE`: Dumpi za msimbo
- `MH_PRELOAD`: Preloaded executable file (haitegemewi tena katika XNU)
- `MH_DYLIB`: Maktaba za dynamic
- `MH_DYLINKER`: Kiunganishi cha dynamic
- `MH_BUNDLE`: "Faili za programu-jalizi". Zimetengenezwa kwa kutumia -bundle katika gcc na zinapakiwa waziwazi na `NSBundle` au `dlopen`.
- `MH_DYSM`: Companion `.dSym` file (faili yenye symbols kwa ajili ya debugging).
- `MH_KEXT_BUNDLE`: Upanuzi za Kernel.
```bash
# Checking the mac header of a binary
otool -arch arm64e -hv /bin/ls
@ -126,48 +126,48 @@ Au kutumia [Mach-O View](https://sourceforge.net/projects/machoview/):
## **Mach-O Flags**
Msimbo wa chanzo pia unafafanua bendera kadhaa muhimu kwa ajili ya kupakia maktaba:
Msimbo wa chanzo pia una bendera kadhaa zinazofaa kwa kupakia maktaba:
- `MH_NOUNDEFS`: Hakuna marejeo yasiyo na ufafanuzi (imeunganishwa kikamilifu)
- `MH_DYLDLINK`: Kuunganisha Dyld
- `MH_PREBOUND`: Marejeo ya dinamik yanayofungwa mapema.
- `MH_SPLIT_SEGS`: Faili inagawanya sehemu r/o na r/w.
- `MH_WEAK_DEFINES`: Binary ina alama dhaifu zilizofafanuliwa
- `MH_BINDS_TO_WEAK`: Binary inatumia alama dhaifu
- `MH_ALLOW_STACK_EXECUTION`: Fanya stack iweze kutekelezwa
- `MH_NOUNDEFS`: Hakuna marejeleo yasiyoelezwa (imeunganishwa kikamilifu)
- `MH_DYLDLINK`: Uunganishaji wa dyld
- `MH_PREBOUND`: Marejeo ya dinamik yamekwishwa awali.
- `MH_SPLIT_SEGS`: Faili hugawa segments r/o na r/w.
- `MH_WEAK_DEFINES`: Binary ina symbols zilizofafanuliwa kama weak
- `MH_BINDS_TO_WEAK`: Binary inatumia symbols za aina weak
- `MH_ALLOW_STACK_EXECUTION`: Fanya stack iwe executable
- `MH_NO_REEXPORTED_DYLIBS`: Maktaba haina amri za LC_REEXPORT
- `MH_PIE`: Mtendaji Huru wa Nafasi
- `MH_HAS_TLV_DESCRIPTORS`: Kuna sehemu yenye mabadiliko ya nyuzi za ndani
- `MH_PIE`: Position Independent Executable
- `MH_HAS_TLV_DESCRIPTORS`: Kuna sehemu yenye thread local variables
- `MH_NO_HEAP_EXECUTION`: Hakuna utekelezaji kwa kurasa za heap/data
- `MH_HAS_OBJC`: Binary ina sehemu za oBject-C
- `MH_SIM_SUPPORT`: Msaada wa simulator
- `MH_DYLIB_IN_CACHE`: Inatumika kwenye dylibs/frameworks katika cache ya maktaba ya pamoja.
- `MH_HAS_OBJC`: Binary ina oBject-C sections
- `MH_SIM_SUPPORT`: Support ya simulator
- `MH_DYLIB_IN_CACHE`: Inatumiwa kwa dylibs/frameworks kwenye shared library cache.
## **Mach-O Load commands**
Muundo wa **faili katika kumbukumbu** umeelezwa hapa, ukifafanua **mahali pa jedwali la alama**, muktadha wa nyuzi kuu wakati wa kuanza utekelezaji, na **maktaba zinazohitajika**. Maagizo yanatolewa kwa mzigo wa dinamik **(dyld)** kuhusu mchakato wa kupakia binary katika kumbukumbu.
Mpangilio wa **faili katika kumbukumbu** umefafanuliwa hapa, ukielezea kwa undani **eneo la symbol table**, muktadha wa thread kuu wakati wa kuanza utekelezaji, na **maktaba za pamoja** zinazohitajika. Maelekezo hutolewa kwa dynamic loader **(dyld)** kuhusu mchakato wa kupakia binary kwenye kumbukumbu.
Inatumia muundo wa **load_command**, uliofafanuliwa katika **`loader.h`**:
Hili linatumia muundo wa **load_command**, uliotajwa na kufafanuliwa katika **`loader.h`**:
```objectivec
struct load_command {
uint32_t cmd; /* type of load command */
uint32_t cmdsize; /* total size of command in bytes */
};
```
Kuna aina **aina 50 tofauti za amri za kupakia** ambazo mfumo unashughulikia kwa njia tofauti. Aina za kawaida ni: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB`, na `LC_CODE_SIGNATURE`.
Kuna karibu **50 different types of load commands** ambazo mfumo huzishughulikia kwa njia tofauti. Za kawaida zaidi ni: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB`, na `LC_CODE_SIGNATURE`.
### **LC_SEGMENT/LC_SEGMENT_64**
> [!TIP]
> Kimsingi, aina hii ya Amri ya Kupakia inaelezea **jinsi ya kupakia \_\_TEXT** (kanuni inayotekelezeka) **na \_\_DATA** (data kwa ajili ya mchakato) **sehemu** kulingana na **offsets zilizoonyeshwa katika sehemu ya Data** wakati binary inatekelezwa.
> Kwa msingi, aina hii ya Load Command inaelezea **jinsi ya kupakia the \_\_TEXT** (msimbo unaotekelezwa) **na \_\_DATA** (data kwa ajili ya mchakato) **segments** kulingana na **offsets zilizotajwa katika Data section** wakati binary inapoendeshwa.
Amri hizi **zinaelezea sehemu** ambazo **zinapangwa** katika **nafasi ya kumbukumbu ya virtual** ya mchakato wakati inatekelezwa.
Amri hizi **zinaelezea segments** ambazo **zina ramanishwa** ndani ya **virtual memory space** ya mchakato wakati inapoendeshwa.
Kuna **aina tofauti** za sehemu, kama vile **\_\_TEXT** sehemu, ambayo ina kanuni inayotekelezeka ya programu, na **\_\_DATA** sehemu, ambayo ina data inayotumiwa na mchakato. **Sehemu hizi ziko katika sehemu ya data** ya faili la Mach-O.
Kuna **aina tofauti** za segments, kama segment ya **\_\_TEXT**, ambayo inashikilia msimbo unaotekelezwa wa programu, na segment ya **\_\_DATA**, ambayo ina data inayotumiwa na mchakato. Segments hizi **ziko katika data section** ya faili ya Mach-O.
**Kila sehemu** inaweza kugawanywa zaidi katika **sehemu nyingi**. **Muundo wa amri ya kupakia** una **taarifa** kuhusu **sehemu hizi** ndani ya sehemu husika.
**Kila segment** inaweza kugawanywa zaidi kuwa **sehemu nyingi (sections)**. Muundo wa **load command** una taarifa kuhusu **sections hizi** ndani ya segment husika.
Katika kichwa kwanza unapata **kichwa cha sehemu**:
Kwenye header, kwanza utapata **segment header**:
<pre class="language-c"><code class="lang-c">struct segment_command_64 { /* for 64-bit architectures */
uint32_t cmd; /* LC_SEGMENT_64 */
@ -184,11 +184,11 @@ int32_t initprot; /* initial VM protection */
};
</code></pre>
Mfano wa kichwa cha sehemu:
Mfano wa segment header:
<figure><img src="../../../images/image (1126).png" alt=""><figcaption></figcaption></figure>
Kichwa hiki kinaelezea **idadi ya sehemu ambazo vichwa vyao vinatokea baada** yake:
Header hii inaelezea the **idadi ya sections ambazo header zao zinaonekana baada yake**:
```c
struct section_64 { /* for 64-bit architectures */
char sectname[16]; /* name of this section */
@ -209,58 +209,58 @@ Mfano wa **kichwa cha sehemu**:
<figure><img src="../../../images/image (1108).png" alt=""><figcaption></figcaption></figure>
Ikiwa un **ongeza** **sehemu ya ofseti** (0x37DC) + **ofseti** ambapo **arch inaanza**, katika kesi hii `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
Ikiwa uta**ongeza** **offset ya sehemu** (0x37DC) + **offset** ambapo **arch** inaanza, katika kesi hii `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
<figure><img src="../../../images/image (701).png" alt=""><figcaption></figcaption></figure>
Pia inawezekana kupata **habari za vichwa** kutoka kwa **mistari ya amri** na:
Inawezekana pia kupata **taarifa za vichwa** kutoka kwa **mstari wa amri** kwa kutumia:
```bash
otool -lv /bin/ls
```
Sehemu za kawaida zinazopakiwa na cmd hii:
Common segments loaded by this cmd:
- **`__PAGEZERO`:** Inamwambia kernel **kuweka** **anwani sifuri** ili **haiwezi kusomwa, kuandikwa, au kutekelezwa**. Vigezo vya maxprot na minprot katika muundo vimewekwa kuwa sifuri kuonyesha kuwa hakuna **haki za kusoma-kuandika-kutekeleza kwenye ukurasa huu**.
- Usambazaji huu ni muhimu ili **kupunguza hatari za dereference ya pointer ya NULL**. Hii ni kwa sababu XNU inatekeleza ukurasa sifuri mgumu ambao unahakikisha ukurasa wa kwanza (tu wa kwanza) wa kumbukumbu haupatikani (isipokuwa katika i386). Binafsi inaweza kutimiza mahitaji haya kwa kutengeneza kidogo \_\_PAGEZERO (kwa kutumia `-pagezero_size`) kufunika 4k za kwanza na kuwa na kumbukumbu ya 32bit iliyobaki inapatikana katika hali ya mtumiaji na kernel.
- **`__TEXT`**: Inashikilia **kanuni** **zinazotekelezwa** zikiwa na ruhusa za **kusoma** na **kutekeleza** (hakuna ya kuandika)**.** Sehemu za kawaida za segment hii:
- `__text`: Kanuni ya binary iliyokusanywa
- `__const`: Takwimu za kudumu (kusoma tu)
- **`__PAGEZERO`:** Inaelekeza kernel ili **map** anwani sifuri ili **haiwezi kusomwa, kuandikwa, au kutekelezwa**. Vigezo maxprot na minprot katika muundo vimewekwa kuwa sifuri kuonyesha kuwa **hakuna haki za kusoma-kuandika-kutekeleza kwenye ukurasa huu**.
- Ugawaji huu ni muhimu kupunguza udhaifu wa **NULL pointer dereference vulnerabilities**. Hii ni kwa sababu XNU inatekeleza hard page zero inayohakikisha ukurasa wa kwanza (tu wa kwanza) wa kumbukumbu haupatikani (isipokuwa katika i386). Binary inaweza kutimiza mahitaji haya kwa kuunda kidogo `__PAGEZERO` (kwa kutumia `-pagezero_size`) ili kufunika 4k ya kwanza na kufanya sehemu iliyobaki ya kumbukumbu ya 32bit iwe inapatikana kwa mode ya user na kernel.
- **`__TEXT`**: Ina **executable** code yenye ruhusa za **read** na **execute** (bila writable). Sehemu za kawaida za segment hii:
- `__text`: Compiled binary code
- `__const`: Constant data (read only)
- `__[c/u/os_log]string`: C, Unicode au os logs string constants
- `__stubs` na `__stubs_helper`: Zina ushirika wakati wa mchakato wa upakiaji wa maktaba ya dynamic
- `__unwind_info`: Takwimu za kuondoa stack.
- Kumbuka kwamba maudhui haya yote yameandikwa lakini pia yamewekwa kama yanayotekelezwa (kuunda chaguzi zaidi za unyakuzi wa sehemu ambazo hazihitaji ruhusa hii, kama sehemu za maandiko).
- **`__DATA`**: Inashikilia data ambayo ni **inasomwa** na **inaandikwa** (hakuna inayotekelezwa)**.**
- `__got:` Meza ya Uhamisho wa Kimataifa
- `__nl_symbol_ptr`: Pointer ya alama isiyo lazi (bind wakati wa upakiaji)
- `__la_symbol_ptr`: Pointer ya alama ya lazi (bind wakati wa matumizi)
- `__const`: Inapaswa kuwa data ya kusoma tu (siyo kweli)
- `__cfstring`: Mifumo ya CoreFoundation
- `__data`: Vigezo vya kimataifa (ambavyo vimeanzishwa)
- `__bss`: Vigezo vya kudumu (ambavyo havijaanzishwa)
- `__objc_*` (\_\_objc_classlist, \_\_objc_protolist, nk): Taarifa inayotumiwa na wakati wa Objective-C
- **`__DATA_CONST`**: \_\_DATA.\_\_const haikuhakikishiwa kuwa ya kudumu (ruhusa za kuandika), wala pointers nyingine na GOT. Sehemu hii inafanya `__const`, baadhi ya waanzilishi na meza ya GOT (mara tu inapohakikishwa) **kuwa ya kusoma tu** kwa kutumia `mprotect`.
- **`__LINKEDIT`**: Inashikilia taarifa kwa linker (dyld) kama vile, alama, maandiko, na entries za meza ya uhamisho. Ni chombo cha jumla kwa maudhui ambayo hayapo katika `__TEXT` au `__DATA` na maudhui yake yanaelezewa katika amri nyingine za upakiaji.
- taarifa za dyld: Rebase, Non-lazy/lazy/weak binding opcodes na taarifa za usafirishaji
- Kazi za kuanza: Meza ya anwani za kuanza za kazi
- Data Katika Kanuni: Visiwa vya data katika \_\_text
- Meza ya Alama: Alama katika binary
- Meza ya Alama ya Kando: Pointer/stub symbols
- Meza ya Mwandiko
- Saini ya Kanuni
- **`__OBJC`**: Inashikilia taarifa inayotumiwa na wakati wa Objective-C. Ingawa taarifa hii inaweza pia kupatikana katika segment ya \_\_DATA, ndani ya sehemu mbalimbali za \_\_objc\_\*.
- **`__RESTRICT`**: Sehemu isiyo na maudhui yenye sehemu moja inayoitwa **`__restrict`** (pia tupu) ambayo inahakikisha kwamba wakati wa kuendesha binary, itapuuzilia mbali mabadiliko ya mazingira ya DYLD.
- `__stubs` and `__stubs_helper`: Zinahusiana wakati wa mchakato wa kupakia dynamic libraries
- `__unwind_info`: Stack unwind data.
- Kumbuka kwamba yaliyomo yote haya yamesainiwa lakini pia yamewekwa kama executable (hii inatoa chaguzi zaidi za exploitation ya sehemu ambazo hazihitaji lazima ruhusa hii, kama sehemu zilizotengwa kwa string).
- **`__DATA`**: Inayo data inayoweza kusomwa na kuandikwa (bila executable).
- `__got:` Global Offset Table
- `__nl_symbol_ptr`: Non lazy (bind at load) symbol pointer
- `__la_symbol_ptr`: Lazy (bind on use) symbol pointer
- `__const`: Inapaswa kuwa read-only data (sio kweli)
- `__cfstring`: CoreFoundation strings
- `__data`: Global variables (ambazo zimetanguliwa)
- `__bss`: Static variables (ambazo hazijatanguliwa)
- `__objc_*` (__objc_classlist, __objc_protolist, etc): Taarifa zinazotumika na Objective-C runtime
- **`__DATA_CONST`**: __DATA.__const si lazima iwe konstanti (ina ruhusa ya kuandika), wala pointers nyingine na GOT. Sehemu hii hufanya `__const`, baadhi ya initializers na jedwali la GOT (mara limekataliwa) kuwa read-only kwa kutumia `mprotect`.
- **`__LINKEDIT`**: Ina taarifa kwa linker (dyld) kama symbol, string, na viingizo vya jedwali la relocation. Ni kontena ya jumla kwa vitu ambavyo sio ndani ya `__TEXT` au `__DATA` na yaliyomo yake yameelezewa katika load commands nyingine.
- dyld information: Rebase, Non-lazy/lazy/weak binding opcodes na export info
- Functions starts: Jedwali la anuani za kuanza za functions
- Data In Code: Visiwa vya data ndani ya `__text`
- SYmbol Table: Symbols katika binary
- Indirect Symbol Table: Pointer/stub symbols
- String Table
- Code Signature
- **`__OBJC`**: Inabeba taarifa zinazotumika na Objective-C runtime. Ingawa taarifa hizi zinaweza kupatikana pia ndani ya segment ya `__DATA`, ndani ya sehemu mbalimbali za `__objc_*`.
- **`__RESTRICT`**: Segment isiyo na yaliyomo yenye sehemu moja iitwayo **`__restrict`** (pia tupu) ambayo inahakikisha kwamba wakati binary inapotekelezwa, itapuuzia mazingira ya DYLD.
Kama ilivyokuwa inawezekana kuona katika kanuni, **sehemu pia zinaunga mkono bendera** (ingawa hazitumiki sana):
Kama ilivyoweza kuonekana kwenye msimbo, **segments pia zinaunga mkono flags** (ingawa hazitumiki sana):
- `SG_HIGHVM`: Core tu (haijatumiwa)
- `SG_FVMLIB`: Haijatumiwa
- `SG_NORELOC`: Sehemu haina uhamisho
- `SG_PROTECTED_VERSION_1`: Usimbuaji. Inatumika kwa mfano na Finder kusimbua sehemu ya maandiko `__TEXT`.
- `SG_HIGHVM`: Kwa Core pekee (haitumiki)
- `SG_FVMLIB`: Haitumiki
- `SG_NORELOC`: Segment haina relocation
- `SG_PROTECTED_VERSION_1`: Encryption. Imetumika kwa mfano na Finder ku-encrypt segment ya `__TEXT`.
### **`LC_UNIXTHREAD/LC_MAIN`**
**`LC_MAIN`** ina kiingilio katika **sifa ya entryoff.** Wakati wa upakiaji, **dyld** kwa urahisi **inaongeza** thamani hii kwenye (katika kumbukumbu) **msingi wa binary**, kisha **inaenda** kwenye maagizo haya kuanza kutekeleza kanuni ya binary.
**`LC_MAIN`** ina entrypoint katika attribute ya **entryoff.** Wakati wa kupakia, **dyld** kwa urahisi **huongeza** thamani hii kwa (in-memory) **base of the binary**, kisha **huruka** kwa maagizo haya kuanza utekelezaji wa code ya binary.
**`LC_UNIXTHREAD`** ina thamani ambazo register lazima iwe nazo wakati wa kuanzisha thread kuu. Hii tayari imeondolewa lakini **`dyld`** bado inaitumia. Inawezekana kuona thamani za register zilizowekwa na hii kwa:
**`LC_UNIXTHREAD`** ina thamani ambazo rejista lazima ziwe nazo wakati wa kuanzisha main thread. Hii tayari ilifutwa lakini **`dyld`** bado inaitumia. Inawezekana kuona values za rejista zilizoamshwa na hii kwa:
```bash
otool -l /usr/lib/dyld
[...]
@ -286,34 +286,39 @@ cpsr 0x00000000
```
### **`LC_CODE_SIGNATURE`**
Inashikilia taarifa kuhusu **sahihi ya msimbo wa faili ya Macho-O**. Inashikilia tu **offset** inayopointia **signature blob**. Hii kwa kawaida iko mwishoni mwa faili.\
Hata hivyo, unaweza kupata taarifa fulani kuhusu sehemu hii katika [**hiki blogu**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) na hii [**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4).
{{#ref}}
../../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md
{{#endref}}
Inabeba taarifa kuhusu **code signature of the Macho-O file**. Inajumuisha tu **offset** inayo **onyesha** kwenye **signature blob**. Hii kwa kawaida iko mwishoni kabisa wa faili.\
Hata hivyo, unaweza kupata baadhi ya taarifa kuhusu sehemu hii katika [**this blog post**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) na hii [**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4).
### **`LC_ENCRYPTION_INFO[_64]`**
Msaada wa usimbaji wa binary. Hata hivyo, bila shaka, ikiwa mshambuliaji atafanikiwa kuathiri mchakato, ataweza kutoa kumbukumbu bila usimbaji.
Inasaidia binary encryption. Hata hivyo, bila shaka, ikiwa mshambuliaji ataweza kuingilia mchakato, atakuwa na uwezo wa dump memory bila encryption.
### **`LC_LOAD_DYLINKER`**
Inashikilia **njia ya executable ya dynamic linker** inayopanga maktaba za pamoja katika nafasi ya anwani ya mchakato. **Thamani kila wakati imewekwa kwenye `/usr/lib/dyld`**. Ni muhimu kutambua kwamba katika macOS, uhamasishaji wa dylib unafanyika katika **mode ya mtumiaji**, si katika mode ya kernel.
Inahifadhi **path to the dynamic linker executable** inayofanya mapping ya shared libraries ndani ya process address space. Thamani imewekwa daima kuwa `/usr/lib/dyld`. Ni muhimu kutambua kwamba kwenye macOS, dylib mapping hufanyika katika **user mode**, si katika kernel mode.
### **`LC_IDENT`**
Imepitwa na wakati lakini wakati imewekwa ili kuunda dumps wakati wa panic, dump ya Mach-O core inaundwa na toleo la kernel linawekwa katika amri ya `LC_IDENT`.
Zimetumika zamani, lakini pale zinapofanyiwa configure ili kuzalisha dumps wakati wa panic, Mach-O core dump huundwa na toleo la kernel huwekwa katika amri ya `LC_IDENT`.
### **`LC_UUID`**
UUID ya nasibu. Ni muhimu kwa chochote moja kwa moja lakini XNU inahifadhi pamoja na taarifa nyingine za mchakato. Inaweza kutumika katika ripoti za ajali.
UUID ya nasibu. Haifaidiki kwa kitu kwa njia ya moja kwa moja lakini XNU huwaicache pamoja na taarifa nyingine za mchakato. Inaweza kutumika katika crash reports.
### **`LC_DYLD_ENVIRONMENT`**
Inaruhusu kuashiria mabadiliko ya mazingira kwa dyld kabla ya mchakato kutekelezwa. Hii inaweza kuwa hatari sana kwani inaweza kuruhusu kutekeleza msimbo usio na mpangilio ndani ya mchakato hivyo amri hii ya kupakia inatumika tu katika ujenzi wa dyld na `#define SUPPORT_LC_DYLD_ENVIRONMENT` na inazidisha mchakato tu kwa mabadiliko ya aina `DYLD_..._PATH` yanayoelezea njia za kupakia.
Inaruhusu kuonyesha environment variables kwa dyld kabla mchakato haujatekelezwa. Hii inaweza kuwa hatari sana kwani inaweza kuruhusu kutekelezwa kwa arbitrary code ndani ya mchakato, hivyo load command hii inatumika tu katika dyld build yenye `#define SUPPORT_LC_DYLD_ENVIRONMENT` na inaweka vikwazo zaidi kwa ku-processing tu variable za aina `DYLD_..._PATH` zinazoainisha load paths.
### **`LC_LOAD_DYLIB`**
Amri hii ya kupakia inaelezea utegemezi wa **maktaba** **dynamiki** ambayo **inaelekeza** **loader** (dyld) **kupakia na kuunganisha maktaba hiyo**. Kuna amri ya kupakia `LC_LOAD_DYLIB` **kwa kila maktaba** ambayo binary ya Mach-O inahitaji.
Load command hii inaelezea utegemezi wa **dynamic** **library** ambao **inaamrisha** **loader** (dyld) ili kupakia na kuunganisha ile library. Kuna load command ya `LC_LOAD_DYLIB` **kwa kila library** ambayo Mach-O binary inahitaji.
- Amri hii ya kupakia ni muundo wa aina **`dylib_command`** (ambayo ina muundo wa dylib, unaelezea maktaba halisi ya kutegemea):
- Load command hii ni muundo wa aina **`dylib_command`** (ambayo ina struct dylib, inayoelezea dynamic library inayotegemewa):
```objectivec
struct dylib_command {
uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */
@ -330,7 +335,7 @@ uint32_t compatibility_version; /* library's compatibility vers number*/
```
![](<../../../images/image (486).png>)
Unaweza pia kupata habari hii kutoka kwa cli kwa:
Unaweza pia kupata taarifa hii kutoka kwa cli kwa:
```bash
otool -L /bin/ls
/bin/ls:
@ -338,55 +343,55 @@ otool -L /bin/ls
/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)
```
Baadhi ya maktaba zinazohusiana na malware ni:
Baadhi ya maktaba zinazoweza kuhusiana na malware ni:
- **DiskArbitration**: Kufuata diski za USB
- **AVFoundation:** Kukamata sauti na video
- **DiskArbitration**: Kufuatilia draivu za USB
- **AVFoundation:** Kukamata audio na video
- **CoreWLAN**: Skana za Wifi.
> [!NOTE]
> Mach-O binary inaweza kuwa na moja au **zaidi** ya **constructors**, ambazo zita **tekelezwa** **kabla** ya anwani iliyoainishwa katika **LC_MAIN**.\
> Offsets za constructors yoyote zinashikiliwa katika sehemu ya **\_\_mod_init_func** ya segment ya **\_\_DATA_CONST**.
> [!TIP]
> A Mach-O binary can contain one or **more** **constructors**, that will be **executed** **before** the address specified in **LC_MAIN**.\
> The offsets of any constructors are held in the **\_\_mod_init_func** section of the **\_\_DATA_CONST** segment.
## **Data ya Mach-O**
## **Mach-O Data**
Katika msingi wa faili kuna eneo la data, ambalo linajumuisha segment kadhaa kama ilivyoainishwa katika eneo la amri za kupakia. **Aina mbalimbali za sehemu za data zinaweza kuhifadhiwa ndani ya kila segment**, huku kila sehemu **ikiweka msimbo au data** maalum kwa aina fulani.
Katikati ya faili kunapatikana eneo la data, ambalo limeundwa na segmenti kadhaa kama ilivyoainishwa katika load-commands region. **Aina mbalimbali za data sections zinaweza kuwekwa ndani ya kila segmenti**, ambapo kila section **inahifadhi code au data** maalum kwa aina yake.
> [!TIP]
> Data kimsingi ni sehemu inayoshikilia **taarifa** zote zinazopakiwa na amri za kupakia **LC_SEGMENTS_64**
> The data is basically the part containing all the **information** that is loaded by the load commands **LC_SEGMENTS_64**
![https://www.oreilly.com/api/v2/epubs/9781785883378/files/graphics/B05055_02_38.jpg](<../../../images/image (507) (3).png>)
Hii inajumuisha:
- **Jedwali la kazi:** Ambalo linashikilia taarifa kuhusu kazi za programu.
- **Jedwali la alama**: Ambalo lina taarifa kuhusu kazi za nje zinazotumiwa na binary
- Pia inaweza kuwa na kazi za ndani, majina ya mabadiliko na zaidi.
- **Function table:** Inayohifadhi taarifa kuhusu kazi za programu.
- **Symbol table**: Inayo taarifa kuhusu external functions zinazotumika na binary
- Inaweza pia kujumuisha internal functions, majina ya variables na mengine mengi.
Ili kuangalia unaweza kutumia zana ya [**Mach-O View**](https://sourceforge.net/projects/machoview/):
To check it you could use the [**Mach-O View**](https://sourceforge.net/projects/machoview/) tool:
<figure><img src="../../../images/image (1120).png" alt=""><figcaption></figcaption></figure>
Au kutoka kwa cli:
Or from the cli:
```bash
size -m /bin/ls
```
## Sehemu za Kawaida za Objetive-C
## Sehemu za kawaida za Objetive-C
Katika segmenti ya `__TEXT` (r-x):
Katika `__TEXT` segment (r-x):
- `__objc_classname`: Majina ya darasa (nyuzi)
- `__objc_methname`: Majina ya mbinu (nyuzi)
- `__objc_methtype`: Aina za mbinu (nyuzi)
- `__objc_classname`: Majina ya madarasa (strings)
- `__objc_methname`: Majina ya mbinu (strings)
- `__objc_methtype`: Aina za mbinu (strings)
Katika segmenti ya `__DATA` (rw-):
Katika `__DATA` segment (rw-):
- `__objc_classlist`: Viashiria kwa madarasa yote ya Objetive-C
- `__objc_nlclslist`: Viashiria kwa madarasa ya Objective-C yasiyo na uvivu
- `__objc_catlist`: Kiashiria kwa Kategoria
- `__objc_nlcatlist`: Kiashiria kwa Kategoria zisizo na uvivu
- `__objc_protolist`: Orodha ya protokali
- `__objc_const`: Takwimu za kudumu
- `__objc_classlist`: Vielekezi kwa madarasa yote ya Objetive-C
- `__objc_nlclslist`: Vielekezi kwa madarasa ya Non-Lazy Objetive-C
- `__objc_catlist`: Kielekezo kwa Categories
- `__objc_nlcatlist`: Kielekezo kwa Non-Lazy Categories
- `__objc_protolist`: Orodha ya Protocols
- `__objc_const`: Data ya konstanti
- `__objc_imageinfo`, `__objc_selrefs`, `objc__protorefs`...
## Swift

View File

@ -2,14 +2,19 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Taarifa Msingi
Mach-o binaries zina amri ya kupakia inayoitwa **`LC_CODE_SIGNATURE`** ambayo inaonyesha **offset** na **size** ya saini ndani ya binary. Kwa kweli, kwa kutumia zana ya GUI MachOView, inawezekana kupata mwishoni mwa binary sehemu inayoitwa **Code Signature** yenye taarifa hii:
{{#ref}}
../../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/mach-o-entitlements-and-ipsw-indexing.md
{{#endref}}
Mach-o binaries zina load command inayoitwa **`LC_CODE_SIGNATURE`** ambayo inaonyesha **offset** na **size** ya signatures ndani ya binary. Kwa kutumia zana ya GUI MachOView, inawezekana kupata mwishoni mwa binary sehemu inayoitwa **Code Signature** yenye taarifa hizi:
<figure><img src="../../../images/image (1) (1) (1) (1).png" alt="" width="431"><figcaption></figcaption></figure>
Kichwa cha kichawi cha Code Signature ni **`0xFADE0CC0`**. Kisha una taarifa kama vile urefu na idadi ya blobs za superBlob zinazozishikilia.\
Inawezekana kupata taarifa hii katika [source code here](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276):
The magic header of the Code Signature is **`0xFADE0CC0`**. Then you have information such as the length and the number of blobs of the superBlob that contains them.\
It's possible to find this information in the [source code here](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L276):
```c
/*
* Structure of an embedded-signature SuperBlob
@ -38,14 +43,14 @@ char data[];
} CS_GenericBlob
__attribute__ ((aligned(1)));
```
Blobs za kawaida zinazopatikana ni Directory ya Kanuni, Mahitaji na Haki na Syntax ya Ujumbe wa Kijadi (CMS).\
Zaidi ya hayo, kumbuka jinsi data iliyowekwa kwenye blobs inavyowekwa kwa **Big Endian.**
Blob za kawaida zinazojumuishwa ni Code Directory, Requirements na Entitlements na Cryptographic Message Syntax (CMS).\
Zaidi ya hayo, angalia jinsi data iliyoko ndani ya blobs imekodwa kwa **Big Endian.**
Zaidi ya hayo, saini zinaweza kutengwa kutoka kwa binaries na kuhifadhiwa katika `/var/db/DetachedSignatures` (inayotumiwa na iOS).
Zaidi ya hayo, saini zinaweza kuachwa (detached) kutoka kwa binaries na kuhifadhiwa katika `/var/db/DetachedSignatures` (inayotumika na iOS).
## Blob ya Directory ya Kanuni
## Code Directory Blob
Inawezekana kupata tangazo la [Blob ya Directory ya Kanuni katika msimbo](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L104):
Inawezekana kupata tamko la [Code Directory Blob in the code](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L104):
```c
typedef struct __CodeDirectory {
uint32_t magic; /* magic number (CSMAGIC_CODEDIRECTORY) */
@ -101,12 +106,12 @@ char end_withLinkage[0];
} CS_CodeDirectory
__attribute__ ((aligned(1)));
```
Kumbuka kwamba kuna toleo tofauti za hii struct ambapo za zamani zinaweza kuwa na taarifa chache.
Kumbuka kwamba kuna matoleo tofauti ya struct hii ambapo zile za zamani zinaweza kuwa zina taarifa chache.
## Signing Code Pages
## Kusaini Kurasa za Code
Kuhesabu hash ya binary kamili kutakuwa na ufanisi mdogo na hata kutokuwa na maana ikiwa inapo load tu sehemu yake kwenye kumbukumbu. Kwa hivyo, saini ya msimbo kwa kweli ni hash ya hashes ambapo kila ukurasa wa binary unahesabiwa hash kivyake.\
Kwa kweli, katika **Code Directory** ya awali unaweza kuona kwamba **ukubwa wa ukurasa umeainishwa** katika moja ya maeneo yake. Zaidi ya hayo, ikiwa ukubwa wa binary si kipande cha ukubwa wa ukurasa, eneo la **CodeLimit** linaeleza ambapo mwisho wa saini uko.
Hashing the full binary ingekuwa isiyofaa na hata isiyo na maana ikiwa binary inapakiawa kwenye memory kwa sehemu tu. Therefore, the code signature is actually a hash of hashes where each binary page is hashed individually.\
Kwa kweli, katika **Code Directory** code ya awali unaweza kuona kwamba **page size is specified** katika moja ya fields zake. Zaidi ya hayo, ikiwa ukubwa wa binary sio mara kamili ya ukubwa wa page, field **CodeLimit** inaonyesha ni wapi mwisho wa signature.
```bash
# Get all hashes of /bin/ps
codesign -d -vvvvvv /bin/ps
@ -142,27 +147,27 @@ dd if=$BINARY of=/tmp/`basename $BINARY`.page.$i bs=$PAGESIZE skip=$i count=1
done
openssl sha256 /tmp/*.page.*
```
## Entitlements Blob
## Blob ya Entitlements
Kumbuka kwamba programu zinaweza pia kuwa na **entitlement blob** ambapo haki zote zinafafanuliwa. Zaidi ya hayo, baadhi ya binaries za iOS zinaweza kuwa na haki zao maalum katika sloti maalum -7 (badala ya katika sloti maalum -5 za haki).
Kumbuka kwamba programu zinaweza pia kuwa na **entitlement blob** ambapo entitlements zote zimefafanuliwa. Zaidi ya hayo, baadhi ya binaries za iOS zinaweza kuwa na entitlements zao maalum katika special slot -7 (badala ya katika -5 entitlements special slot).
## Special Slots
## Slots Maalum
Programu za MacOS hazina kila kitu wanachohitaji kutekeleza ndani ya binary lakini pia zinatumia **vyanzo vya nje** (kawaida ndani ya **bundle** za programu). Hivyo, kuna baadhi ya sloti ndani ya binary ambazo zitakuwa na hash za baadhi ya vyanzo vya nje vya kuvutia ili kuangalia kwamba havijabadilishwa.
Programu za MacOS hazina kila kitu wanachohitaji ili zitekelezwe ndani ya binary; pia zinatumia **external resources** (kwa kawaida ndani ya programu **bundle**). Kwa hiyo, kuna baadhi ya slots ndani ya binary zitakazokuwa na hashes za baadhi ya external resources za kuvutia ili kuangalia hazijabadilishwa.
Kwa kweli, inawezekana kuona katika muundo wa Code Directory parameter inayoitwa **`nSpecialSlots`** ikionyesha idadi ya sloti maalum. Hakuna sloti maalum 0 na zile za kawaida zaidi (kutoka -1 hadi -6 ni):
Kwa kweli, inawezekana kuona katika Code Directory structs paramita iitwayo **`nSpecialSlots`** inayoonyesha idadi ya slots maalum. Hakuna special slot 0 na za kawaida zaidi (kutoka -1 hadi -6) ni:
- Hash ya `info.plist` (au ile ndani ya `__TEXT.__info__plist`).
- Hash ya Mahitaji
- Hash ya Resource Directory (hash ya faili ya `_CodeSignature/CodeResources` ndani ya bundle).
- Maalum kwa programu (isiyotumika)
- Hash ya haki
- Saini za msimbo wa DMG pekee
- Haki za DER
- Hash ya Requirements
- Hash ya Resource Directory (hash ya faili `_CodeSignature/CodeResources` ndani ya bundle).
- Maalum kwa programu (haijatumika)
- Hash ya entitlements
- DMG code signatures tu
- DER Entitlements
## Code Signing Flags
## Bendera za Code Signing
Kila mchakato una bitmask inayohusiana inayojulikana kama `status` ambayo inaanzishwa na kernel na baadhi yao zinaweza kubadilishwa na **saini ya msimbo**. Bendera hizi ambazo zinaweza kujumuishwa katika saini ya msimbo zina [fafanuliwa katika msimbo](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36):
Kila mchakato una bitmask inayojulikana kama `status` ambayo huanzishwa na kernel, na baadhi ya bendera hizo zinaweza kueuzwa na **code signature**. Bendera hizi ambazo zinaweza kujumuishwa katika code signing zimetajwa [defined in the code](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/osfmk/kern/cs_blobs.h#L36):
```c
/* code signing attributes of a process */
#define CS_VALID 0x00000001 /* dynamically valid */
@ -207,15 +212,15 @@ CS_RESTRICT | CS_ENFORCEMENT | CS_REQUIRE_LV | CS_RUNTIME | CS_LINKER_SIGNED)
#define CS_ENTITLEMENT_FLAGS (CS_GET_TASK_ALLOW | CS_INSTALLER | CS_DATAVAULT_CONTROLLER | CS_NVRAM_UNRESTRICTED)
```
Kumbuka kwamba kazi [**exec_mach_imgact**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_exec.c#L1420) inaweza pia kuongeza bendera `CS_EXEC_*` kwa njia ya kidinamik wakati wa kuanza utekelezaji.
Kumbuka kuwa kazi ya [**exec_mach_imgact**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_exec.c#L1420) inaweza pia kuongeza bendera `CS_EXEC_*` kwa wakati wa kuanza utekelezaji.
## Mahitaji ya Saini ya Kanuni
## Mahitaji ya Saini ya Msimbo
Kila programu ina **mahitaji** ambayo lazima **yatimizwe** ili iweze kutekelezwa. Ikiwa **programu ina mahitaji ambayo hayajatimizwa na programu**, haitatekelezwa (kama imebadilishwa).
Kila programu huhifadhi baadhi ya **mahitaji** ambayo lazima iyatimize ili iweze kutekelezwa. Ikiwa **mahitaji yaliyomo kwenye programu hayajatimizwa**, haitatekelezwa (inawezekana imebadilishwa).
Mahitaji ya binary hutumia **sarufi maalum** ambayo ni mtiririko wa **maelezo** na yanakodishwa kama blobs kwa kutumia `0xfade0c00` kama uchawi ambao **hash yake inahifadhiwa katika sloti maalum ya kanuni**.
Mahitaji ya binary hutumia **sarufi maalum** ambayo ni mfululizo wa **mielezo** na yamefichwa kama blobs zikitumia `0xfade0c00` kama magic ambapo **hash yake imehifadhiwa kwenye slot maalum ya code**.
Mahitaji ya binary yanaweza kuonekana kwa kukimbia:
Mahitaji ya binary yanaweza kuonekana kwa kuendesha:
```bash
codesign -d -r- /bin/ls
Executable=/bin/ls
@ -225,10 +230,10 @@ codesign -d -r- /Applications/Signal.app/
Executable=/Applications/Signal.app/Contents/MacOS/Signal
designated => identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR
```
> [!NOTE]
> Kumbuka jinsi saini hizi zinaweza kuangalia mambo kama taarifa za uthibitisho, TeamID, IDs, ruhusa na data nyingine nyingi.
> [!TIP]
> Angalia jinsi saini hizi zinaweza kukagua vitu kama taarifa za cheti, TeamID, IDs, entitlements na data nyingine nyingi.
Zaidi ya hayo, inawezekana kuzalisha baadhi ya mahitaji yaliyokusanywa kwa kutumia zana ya `csreq`:
Aidha, inawezekana kuunda baadhi ya mahitaji yaliyokompailiwa kwa kutumia chombo `csreq`:
```bash
# Generate compiled requirements
csreq -b /tmp/output.csreq -r='identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR'
@ -240,55 +245,57 @@ od -A x -t x1 /tmp/output.csreq
0000020 00 00 00 21 6f 72 67 2e 77 68 69 73 70 65 72 73
[...]
```
#### **Kuangalia Uhalali**
Inawezekana kupata taarifa hizi na kuunda au kubadilisha requirements kwa kutumia baadhi ya API kutoka `Security.framework` kama:
- **`Sec[Static]CodeCheckValidity`**: Angalia uhalali wa SecCodeRef kwa Kihitaji.
- **`SecRequirementEvaluate`**: Thibitisha hitaji katika muktadha wa cheti.
- **`SecTaskValidateForRequirement`**: Thibitisha SecTask inayokimbia dhidi ya hitaji la `CFString`.
#### **Kukagua Uhalali**
#### **Kuunda na Kusimamia Mahitaji ya Nambari**
- **`Sec[Static]CodeCheckValidity`**: Angalia uhalali wa SecCodeRef kulingana na Requirement.
- **`SecRequirementEvaluate`**: Thibitisha Requirement katika muktadha wa cheti.
- **`SecTaskValidateForRequirement`**: Thibitisha SecTask inayotumika dhidi ya Requirement ya `CFString`.
- **`SecRequirementCreateWithData`:** Inaunda `SecRequirementRef` kutoka kwa data ya binary inayowakilisha hitaji.
- **`SecRequirementCreateWithString`:** Inaunda `SecRequirementRef` kutoka kwa usemi wa maandiko wa hitaji.
#### **Kuunda na Kusimamia Code Requirements**
- **`SecRequirementCreateWithData`:** Inatengeneza `SecRequirementRef` kutoka data ya binary inayowakilisha requirement.
- **`SecRequirementCreateWithString`:** Inatengeneza `SecRequirementRef` kutoka kwa mfuatano wa string wa requirement.
- **`SecRequirementCopy[Data/String]`**: Inapata uwakilishi wa data ya binary wa `SecRequirementRef`.
- **`SecRequirementCreateGroup`**: Unda hitaji la uanachama wa kundi la programu.
- **`SecRequirementCreateGroup`**: Unda requirement kwa uanachama wa app-group
#### **Kupata Taarifa za Kusaini Nambari**
#### **Kupata Taarifa za Code Signing**
- **`SecStaticCodeCreateWithPath`**: Inaanzisha kipande cha `SecStaticCodeRef` kutoka kwa njia ya mfumo wa faili kwa ajili ya kukagua saini za nambari.
- **`SecCodeCopySigningInformation`**: Inapata taarifa za kusaini kutoka kwa `SecCodeRef` au `SecStaticCodeRef`.
- **`SecStaticCodeCreateWithPath`**: Huanzisha `SecStaticCodeRef` kutoka kwenye path ya file system kwa kuchunguza code signatures.
- **`SecCodeCopySigningInformation`**: Inapata taarifa za saini kutoka `SecCodeRef` au `SecStaticCodeRef`.
#### **Kubadilisha Mahitaji ya Nambari**
#### **Kurekebisha Code Requirements**
- **`SecCodeSignerCreate`**: Inaunda kipande cha `SecCodeSignerRef` kwa ajili ya kufanya operesheni za kusaini nambari.
- **`SecCodeSignerSetRequirement`**: Inaweka hitaji jipya kwa ajili ya kusaini nambari wakati wa kusaini.
- **`SecCodeSignerAddSignature`**: Inaongeza saini kwa nambari inayosainiwa na saini iliyotolewa.
- **`SecCodeSignerCreate`**: Inatengeneza `SecCodeSignerRef` kwa ajili ya kufanya operesheni za code signing.
- **`SecCodeSignerSetRequirement`**: Inaweka requirement mpya kwa code signer atakayetekeleza wakati wa kusaini.
- **`SecCodeSignerAddSignature`**: Inaongeza signature kwa code inayosainiwa na signer uliotajwa.
#### **Kuthibitisha Nambari kwa Mahitaji**
#### **Kukagua Msimbo kwa Requirements**
- **`SecStaticCodeCheckValidity`**: Inathibitisha kipande cha nambari ya static dhidi ya mahitaji yaliyotolewa.
- **`SecStaticCodeCheckValidity`**: Inathibitisha static code object dhidi ya requirements zilizotajwa.
#### **APIs za Ziada za Faida**
#### **API Nyingine Zinazofaa**
- **`SecCodeCopy[Internal/Designated]Requirement`: Pata SecRequirementRef kutoka SecCodeRef**
- **`SecCodeCopyGuestWithAttributes`**: Inaunda `SecCodeRef` inayowakilisha kipande cha nambari kulingana na sifa maalum, muhimu kwa sandboxing.
- **`SecCodeCopyPath`**: Inapata njia ya mfumo wa faili inayohusiana na `SecCodeRef`.
- **`SecCodeCopySigningIdentifier`**: Inapata kitambulisho cha kusaini (mfano, Kitambulisho cha Timu) kutoka kwa `SecCodeRef`.
- **`SecCodeGetTypeID`**: Inarudisha kitambulisho cha aina kwa ajili ya vitu vya `SecCodeRef`.
- **`SecRequirementGetTypeID`**: Inapata CFTypeID ya `SecRequirementRef`.
- **`SecCodeCopy[Internal/Designated]Requirement`: Get SecRequirementRef from SecCodeRef**
- **`SecCodeCopyGuestWithAttributes`**: Inatengeneza `SecCodeRef` inayowakilisha kitu cha code kulingana na attributes maalum, inayofaa kwa sandboxing.
- **`SecCodeCopyPath`**: Inapata path ya file system inayohusiana na `SecCodeRef`.
- **`SecCodeCopySigningIdentifier`**: Inapata signing identifier (mf. Team ID) kutoka `SecCodeRef`.
- **`SecCodeGetTypeID`**: Inarudisha type identifier kwa vitu vya `SecCodeRef`.
- **`SecRequirementGetTypeID`**: Inapata CFTypeID ya `SecRequirementRef`
#### **Bendera na Misingi ya Kusaini Nambari**
#### **Code Signing Flags and Constants**
- **`kSecCSDefaultFlags`**: Bendera za kawaida zinazotumika katika kazi nyingi za Security.framework kwa ajili ya operesheni za kusaini nambari.
- **`kSecCSSigningInformation`**: Bendera inayotumika kuashiria kwamba taarifa za kusaini zinapaswa kupatikana.
- **`kSecCSDefaultFlags`**: Bendera za default zinazotumika katika kazi nyingi za Security.framework kwa operesheni za code signing.
- **`kSecCSSigningInformation`**: Bendera inayotumika kuonyesha kwamba taarifa za saini zinapaswa kupatikana.
## Utekelezaji wa Saini ya Nambari
## Utekelezaji wa Code Signature
**kernel** ndiye anayechunguza **saini ya nambari** kabla ya kuruhusu nambari ya programu kutekelezwa. Aidha, njia moja ya kuweza kuandika na kutekeleza nambari mpya katika kumbukumbu ni kutumia JIT ikiwa `mprotect` inaitwa na bendera ya `MAP_JIT`. Kumbuka kwamba programu inahitaji ruhusa maalum ili iweze kufanya hivi.
Kernel ndio inayokagua saini ya msimbo kabla ya kuruhusu msimbo wa app utekelezwe. Zaidi ya hayo, njia moja ya kuandika na kutekeleza msimbo mpya katika memory ni kutumia mabaya JIT ikiwa `mprotect` inaitwa na bendera ya `MAP_JIT`. Kumbuka kwamba application inahitaji entitlement maalum ili kufanya hivi.
## `cs_blobs` & `cs_blob`
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) muundo unashikilia taarifa kuhusu ruhusa ya mchakato unaokimbia juu yake. `csb_platform_binary` pia inaarifu ikiwa programu ni binary ya jukwaa (ambayo inakaguliwa katika nyakati tofauti na OS ili kutekeleza mitambo ya usalama kama kulinda haki za SEND kwa bandari za kazi za mchakato haya).
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) struct ina taarifa kuhusu entitlement za mchakato unaoendesha juu yake. `csb_platform_binary` pia inaonyesha kama application ni platform binary (ambayo inakaguliwa kwa nyakati tofauti na OS ili kutekeleza taratibu za usalama kama kulinda haki za SEND kwa task ports za michakato hii).
```c
struct cs_blob {
struct cs_blob *csb_next;
@ -347,7 +354,7 @@ bool csb_csm_managed;
#endif
};
```
## Marejeo
## Marejeleo
- [**\*OS Internals Volume III**](https://newosxbook.com/home.html)