Condivisione della tecnologia

Ricerca statica per la posizione di chiamata della funzione di collegamento dinamico iOS

2024-07-11

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

Ricerca statica per la posizione di chiamata della funzione di collegamento dinamico iOS

Il formato file eseguibile mach-O è un formato file binario utilizzato sui sistemi operativi Apple macOS e iOS.

In alcune scansioni di sicurezza iOS, potrebbe essere necessario ottenere la posizione specifica della chiamata di una funzione, che può guidare gli utenti a individuare con maggiore precisione le vulnerabilità.
Ora prendiamo come esempio la funzione NSLog e cerchiamo staticamente la posizione di chiamata specifica della funzione di collegamento dinamico in macho.

Bersaglio

Cerca la posizione specifica in cui viene chiamata la funzione NSLog nell'applicazione macho.

Idee

L'intero processo di ricerca è un processo di analisi di file macho e di analisi dei dati binari in strutture dati appropriate.
Vengono utilizzate più parti di macho:
Tabella delle stringhe
Tabella dei simboli
Tabella dei simboli dinamici
Sezione64(TESTO,mozziconi)
Sezione64(TESTO,testo)

Passaggi specifici

1. Per prima cosa trova la posizione di Symbol Talbe e String Table nel file macho.

Trova LC_SYMTAB in Load Commands, puoi determinare l'offset e la dimensione di StringTable e puoi anche trovare l'offset e il numero della tabella dei simboli:

L'offset della tabella dei simboli è 0x18c478
Il numero di simboli è 0x9a2d
L'offset della tabella stringhe è 0x2273b0
La dimensione della tabella delle stringhe è 0x108d58

Poiché la lunghezza dei dati di ciascun simbolo è di 16 byte, ovvero 0x10,

Quindi la dimensione della tabella dei simboli è 0x9a2d*0x10 = 0x9A2D0
L'indirizzo iniziale della tabella dei simboli è 0x18c478
L'indirizzo finale è 0x18c478 0x9A2D0 = 0x226748

L'indirizzo iniziale di String Table è 0x2273b0
L'indirizzo finale è 0x2273b0 0x108d58 = 0x330108
Poiché la lunghezza della stringa non è fissa, la lunghezza di ogni dato nella tabella delle stringhe non è fissa.
Quando si leggono i dati della tabella stringhe in formato binario, è possibile utilizzare "x00" come delimitatore di stringa.

2. Attraversare la tabella delle stringhe e trovare _NSLog

Puoi prima leggere i dati della tabella delle stringhe in macho e utilizzare "x00" come separatore per generare un array di stringhe.
Attraversare l'array di stringhe e determinare se ogni dato è uguale a "_NSLog".

_NSLog è stato trovato in 0x23331b e il codice macchina "5F4E534C6F6700" è la stringa "_NSLogn".

49003 (0xBF6B in esadecimale) è il numero di indice della stringa corrente, che viene provvisoriamente determinato come strTab_index = 49003.
Il numero di indice 49003 viene calcolato dall'indirizzo iniziale 0x2273b0 della tabella delle stringhe, il 49003esimo byte,
0x2273b0 49003 = 0x23331B, che sembra essere l'indirizzo iniziale di _NSLog.

3. Secondo 49003 (0xBF6B) nel passaggio 2 è possibile cercare il simbolo corrispondente nella SymbolTable

In MachOView puoi vedere che l'indirizzo 0x00224988 corrisponde a _NSLog.

Come trovare i dati della tabella dei simboli corrispondenti tramite il numero di indice 49003?
Noto nel passaggio 1:
L'indirizzo iniziale della tabella dei simboli è 0x18c478,
L'indirizzo finale della tabella dei simboli è 0x226748.
In questo macho, la dimensione dei dati di una singola tabella dei simboli è 0x10.

Il valore dei primi quattro byte del 38993esimo dato nella tabella dei simboli è 0xBF6B, ovvero 49003.
È uguale al numero di indice della stringa _NSLog sulla tabella delle stringhe, quindi questo dato corrisponde a "_NSLog":

38993 è il numero di indice dei dati correnti nella tabella dei simboli, provvisoriamente symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 è esattamente l'indirizzo dei dati correnti.

4. Trova i dati in base a symTab_index nella tabella dei simboli dinamici

La posizione dei simboli indiretti può essere determinata in LC_DYSYMTAB sotto Carica comandi in Macho:

Indirizzo iniziale: 0x226748, ci sono 794 dati e la dimensione di ciascun dato è 0x4.
Attraversa ogni pezzo di dati in simboli indiretti. Il 111esimo pezzo di dati memorizza 38993.
Quindi questi dati corrispondono a "_NSLog", imposta dySymTab_index = 111
0x226748 111*0x4 = 0x226904