Обмен технологиями

Статический поиск местоположения вызова функции динамической ссылки iOS

2024-07-11

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

Статический поиск местоположения вызова функции динамической ссылки iOS

Формат исполняемого файла mach-O — это двоичный формат файла, используемый в операционных системах Apple macOS и iOS.

При некоторых проверках безопасности iOS может возникнуть необходимость получить конкретное местоположение вызова функции, что может помочь пользователям более точно обнаружить уязвимости.
Теперь возьмем в качестве примера функцию NSLog и статически найдем конкретное место вызова функции динамической ссылки в macho.

Цель

Найдите конкретное место, где вызывается функция NSLog в мачо приложения.

Идеи

Весь процесс поиска представляет собой процесс анализа мачо-файлов и преобразования двоичных данных в соответствующие структуры данных.
Используются несколько частей мачо:
Струнный стол
Таблица символов
Динамическая таблица символов
Раздел64(ТЕКСТ,заглушки)
Раздел64(ТЕКСТ,текст)

Конкретные шаги

1. Сначала найдите расположение символов Талбе и таблицы строк в файле мачо.

Найдите LC_SYMTAB в командах загрузки, вы можете определить смещение и размер StringTable, а также найти смещение и таблицу количества символов:

Смещение таблицы символов — 0x18c478.
Количество символов: 0x9a2d.
Смещение таблицы строк равно 0x2273b0.
Размер таблицы строк: 0x108d58.

Поскольку длина данных каждого символа составляет 16 байт, что равно 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-го байта,
0x2273b0 49003 = 0x23331B, который является начальным адресом _NSLog.

3. По 49003 (0xBF6B) на шаге 2 можно искать соответствующий символ в таблице символов.

В MachOView вы можете видеть, что адрес 0x00224988 соответствует _NSLog.

Как найти соответствующие данные таблицы символов по индексу 49003?
Известно на шаге 1:
Начальный адрес таблицы символов — 0x18c478.
Конечный адрес таблицы символов — 0x226748.
У этого мачо размер данных одной таблицы символов равен 0x10.

Значение первых четырех байтов 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