Technologieaustausch

Statische Suche nach dem Aufrufort der iOS-Dynamic-Link-Funktion

2024-07-11

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

Statische Suche nach dem Aufrufort der iOS-Dynamic-Link-Funktion

Das ausführbare Dateiformat mach-O ist ein binäres Dateiformat, das auf den Apple-Betriebssystemen macOS und iOS verwendet wird.

Bei einigen iOS-Sicherheitsscans kann es erforderlich sein, den spezifischen Aufrufort einer Funktion zu ermitteln, was Benutzern dabei helfen kann, Schwachstellen genauer zu lokalisieren.
Nehmen Sie nun die NSLog-Funktion als Beispiel und suchen Sie statisch nach dem spezifischen Aufrufort der dynamischen Linkfunktion in Macho.

Ziel

Suchen Sie im Anwendungsmacho nach dem spezifischen Ort, an dem die NSLog-Funktion aufgerufen wird.

Ideen

Der gesamte Suchvorgang besteht aus dem Parsen von Macho-Dateien und dem Parsen von Binärdaten in geeignete Datenstrukturen.
Es werden mehrere Teile von Macho verwendet:
Zeichenfolgentabelle
Symboltabelle
Dynamische Symboltabelle
Abschnitt 64 (TEXT,Stummel)
Abschnitt 64 (TEXT,Text)

Spezifische Schritte

1. Suchen Sie zunächst den Speicherort der Symboltabelle und der Zeichenfolgentabelle in der Macho-Datei.

Suchen Sie nach LC_SYMTAB in den Ladebefehlen. Sie können den Versatz und die Größe von StringTable bestimmen. Außerdem können Sie den Versatz und die Anzahl der Symboltabellen ermitteln:

Der Symboltabellen-Offset beträgt 0x18c478
Die Anzahl der Symbole beträgt 0x9a2d
Der String-Tabellen-Offset beträgt 0x2273b0
Die Größe der Zeichenfolgentabelle beträgt 0x108d58

Da die Datenlänge jedes Symbols 16 Byte beträgt, also 0x10,

Die Größe der Symboltabelle beträgt also 0x9a2d*0x10 = 0x9A2D0
Die Startadresse der Symboltabelle ist 0x18c478
Die Endadresse ist 0x18c478 0x9A2D0 = 0x226748

Die Startadresse der String-Tabelle ist 0x2273b0
Die Endadresse ist 0x2273b0 0x108d58 = 0x330108
Da die Länge der Zeichenfolge nicht festgelegt ist, ist auch die Länge jedes Datenelements in der Zeichenfolgentabelle nicht festgelegt.
Wenn Sie String-Tabellendaten im Binärformat lesen, können Sie „x00“ als String-Trennzeichen verwenden.

2. Durchlaufen Sie die String-Tabelle und suchen Sie nach _NSLog

Sie können zunächst die String-Tabellendaten in Macho lesen und „x00“ als Trennzeichen verwenden, um ein String-Array zu generieren.
Durchlaufen Sie das String-Array und bestimmen Sie, ob jedes Datenelement gleich „_NSLog“ ist.

_NSLog wurde bei 0x23331b gefunden und der Maschinencode „5F4E534C6F6700“ ist die Zeichenfolge „_NSLogn“.

49003 (0xBF6B im Hexadezimalformat) ist die Indexnummer der aktuellen Zeichenfolge, die vorläufig als strTab_index = 49003 bestimmt wird.
Die Indexnummer 49003 wird aus der Startadresse 0x2273b0 der String-Tabelle, dem 49003. Byte, berechnet.
0x2273b0 49003 = 0x23331B, was zufällig die Startadresse von _NSLog ist.

3. Gemäß 49003 (0xBF6B) in Schritt 2 können Sie in der SymbolTable nach dem entsprechenden Symbol suchen

In MachOView können Sie sehen, dass die Adresse 0x00224988 _NSLog entspricht.

Wie finde ich passende Symboltabellendaten anhand der Indexnummer 49003?
In Schritt 1 bekannt:
Die Startadresse der Symboltabelle ist 0x18c478,
Die Endadresse der Symboltabelle ist 0x226748.
In diesem Macho beträgt die Datengröße einer einzelnen Symboltabelle 0x10.

Der Wert der ersten vier Bytes des 38993. Datenelements in der Symboltabelle ist 0xBF6B, also 49003.
Sie entspricht der Indexnummer der Zeichenfolge _NSLog in der Zeichenfolgentabelle, daher entsprechen diese Daten „_NSLog“:

38993 ist die Indexnummer der aktuellen Daten in der Symboltabelle, vorläufig symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 ist genau die Adresse der aktuellen Daten.

4. Suchen Sie Daten basierend auf symTab_index in der dynamischen Symboltabelle

Die Position indirekter Symbole kann in LC_DYSYMTAB unter Ladebefehle in Macho bestimmt werden:

Startadresse: 0x226748, es gibt 794 Datenelemente und die Größe jedes Datenelements beträgt 0x4.
Durchlaufen Sie jedes Datenelement in indirekten Symbolen. Das 111. Datenelement speichert 38993.
Diese Daten entsprechen also „_NSLog“, setzen Sie dySymTab_index = 111
0x226748 111*0x4 = 0x226904