моя контактная информация
Почтамезофия@protonmail.com
2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Формат исполняемого файла mach-O — это двоичный формат файла, используемый в операционных системах Apple macOS и iOS.
При некоторых проверках безопасности iOS может возникнуть необходимость получить конкретное местоположение вызова функции, что может помочь пользователям более точно обнаружить уязвимости.
Теперь возьмем в качестве примера функцию NSLog и статически найдем конкретное место вызова функции динамической ссылки в macho.
Найдите конкретное место, где вызывается функция NSLog в мачо приложения.
Весь процесс поиска представляет собой процесс анализа мачо-файлов и преобразования двоичных данных в соответствующие структуры данных.
Используются несколько частей мачо:
Струнный стол
Таблица символов
Динамическая таблица символов
Раздел64(ТЕКСТ,заглушки)
Раздел64(ТЕКСТ,текст)
Найдите LC_SYMTAB в командах загрузки, вы можете определить смещение и размер StringTable, а также найти смещение и таблицу количества символов:
Смещение таблицы символов — 0x18c478.
Количество символов: 0x9a2d.
Смещение таблицы строк равно 0x2273b0.
Размер таблицы строк: 0x108d58.
Поскольку длина данных каждого символа составляет 16 байт, что равно 0x10,
Таким образом, размер таблицы символов равен 0x9a2d*0x10 = 0x9A2D0.
Начальный адрес таблицы символов — 0x18c478.
Конечный адрес: 0x18c478 0x9A2D0 = 0x226748.
Начальный адрес таблицы строк — 0x2273b0.
Конечный адрес: 0x2273b0 0x108d58 = 0x330108.
Поскольку длина строки не фиксирована, длина каждого фрагмента данных в таблице строк не фиксирована.
При чтении данных таблицы строк в двоичном формате вы можете использовать «x00» в качестве разделителя строк.
Сначала вы можете прочитать данные таблицы строк в macho и использовать «x00» в качестве разделителя для создания массива строк.
Просмотрите массив строк и определите, равен ли каждый фрагмент данных «_NSLog».
_NSLog был найден по адресу 0x23331b, а машинный код «5F4E534C6F6700» — это строка «_NSLogn».
49003 (0xBF6B в шестнадцатеричном формате) — это порядковый номер текущей строки, который ориентировочно определяется как strTab_index = 49003.
Индексный номер 49003 рассчитывается из начального адреса 0x2273b0 таблицы строк, 49003-го байта,
0x2273b0 49003 = 0x23331B, который является начальным адресом _NSLog.
В MachOView вы можете видеть, что адрес 0x00224988 соответствует _NSLog.
Как найти соответствующие данные таблицы символов по индексу 49003?
Известно на шаге 1:
Начальный адрес таблицы символов — 0x18c478.
Конечный адрес таблицы символов — 0x226748.
У этого мачо размер данных одной таблицы символов равен 0x10.
Значение первых четырех байтов 38993-го фрагмента данных в таблице символов равно 0xBF6B, что равно 49003.
Он совпадает с номером индекса строки _NSLog в таблице строк, поэтому эти данные соответствуют «_NSLog»:
38993 — порядковый номер текущих данных в Таблице символов, ориентировочно symTab_index = 38993,
0x18c478 38993 * 0x10 = 0x224988 — это именно адрес текущих данных.
Расположение косвенных символов можно определить в LC_DYSYMTAB в разделе «Команды загрузки» в Macho:
Начальный адрес: 0x226748, имеется 794 фрагмента данных, размер каждого фрагмента данных равен 0x4.
Обход каждого фрагмента данных в косвенных символах. 111-й фрагмент данных хранит 38993.
Итак, эти данные соответствуют «_NSLog», установите dySymTab_index = 111.
0x226748 111*0x4 = 0x226904