Метод идентификации соглашений о вызове функций в бинарных приложениях
Предлагается метод определения соглашений о вызове функций в бинарных приложениях.
Identification method for function calling conventions in binary applications.pdf При статическом анализе бинарных приложений возникает задача определения соглашений о вызовах функций. Соглашением о вызове (calling convention) называется способ передачи параметров (аргументов) подпрограммам [1]. В известных средствах анализа бинарных приложений (например, Radare2, Angr, IDA Pro) эта задача решается с использованием встроенных инструментов, что, как правило, не позволяет использовать их в собственных разрабатываемых средствах анализа. В данной работе предлагается собственный метод анализа соглашений о вызове функций. Для определения соглашения о вызове необходимо определить следующие параметры: 1) наличие регистров для передачи параметров в функции; 2) используемые регистры для передачи параметров в функции; 3) используемые области памяти; 4) мнемоника инструкции возврата. Например, соглашение о вызове cdecl использует следующие параметры: для передачи аргументов в функции используются области памяти с отрицательным смещением вместо регистров, а мнемоника инструкции возврата - retn. Метод определения соглашения о вызове функции Пусть имеется набор физических и виртуальных адресов функций, соглашения о вызовах которых нужно определить. 1) Строится граф потока управления исследуемой функции для определения её конца и возможных условий выхода из нее. 2) Строится таблица использования неинициализированных регистров внутри функции: в случае нахождения такого регистра в инструкции в таблицу заносится метка об его использовании. 3) Проверяется наличие пролога функции и выясняется адресация относительно отрицательных смещений в стеке. 4) Проверяется наличие аргументов у инструкции возврата (мнемоника «ret/retn»). 5) По завершении всех проверок на основе полученных данных выдаётся определённый тип соглашения о вызове исследуемой функции, а в случае неспособности определить тип соглашения достоверно (например, если присутствуют несколько признаков различных соглашений о вызове) применяется мажоритарный принцип, основанный на статистике использования того или иного соглашения о вызове. 6) В случае отсутствия каких-либо признаков известных соглашений о вызове считается, что тип соглашения функции равен «user call». На данный момент определяются следующие соглашения о вызове: cdecl_x86, cdecl_x86_64, fastcall_x86, fastcall_x86_64, stdcall_x86, stdcall_x86_64. Программная реализация метода доступна в сети Github [2].
Ключевые слова
статический анализ,
бинарные приложения,
соглашение о вызове,
static analysis,
calling convention,
binary applicationАвторы
Станчин Максим Андреевич | Томский государственный университет | студент кафедры защиты информации и криптографии | mostobriv@gmail.com |
Сороковиков Никита Викторович | Томский государственный университет | студент кафедры защиты информации и криптографии | d86leader@yandex.ru |
Всего: 2
Ссылки
Agner F. Calling Conventions for Different C++ Compilers and Operating Systems. 2017. http://www.agner.org/optimize/calling_conventions.pdf
CCPTool. https://github.com/ACIDYWE/CCPTool
Метод идентификации соглашений о вызове функций в бинарных приложениях | Прикладная дискретная математика. Приложение. 2017. № 10. DOI: 10.17223/2226308X/10/47