
Плагин для Binary Ninja, использующий хэши XFG, полученные перебором, для восстановления точных прототипов функций.
Этот репозиторий содержит скрипты для генерации и поиска хешей eXtended Flow Guard.
Развёрнутое описание того, как это работает, доступно в выпуске 22 журнала International Journal Of Proof Of Concept || GTFO.
Моя работа над этим PoC была значительно упрощена ребятами из Quarkslab, которые провели обширный реверс-инжиниринг соответствующих частей компилятора MS. Их подробный разбор того, как вычисляются XFG-хеши, можно прочитать здесь: https://blog.quarkslab.com/how-the-msvc-compiler-generates-xfg-function-prototype-hashes.html
Примечание: это никоим образом не «ломает» XFG как защиту от эксплуатации, это просто использует её побочные эффекты для выявления функций без символов.
Если кратко, XFG в том виде, в котором он реализован в Windows, расширяет и ужесточает защиту Control Flow Guard от эксплуатации, ограничивая возможные цели косвенных вызовов функций не только допустимыми точками входа в функции, но и функциями с подходящей сигнатурой. Для этого для каждой функции вычисляется XFG-хеш, и во время выполнения выполняется его проверка. Хеши основаны только на прототипе функции (то есть на соглашении о вызове, аргументах и их типах). Таким образом, мы можем предвычислить их для известных типов, а затем искать их для функций в неизвестных бинарных файлах.
Если поиск успешен, мы можем быть на 100% уверены в точном количестве и типах всех аргументов, а также в возвращаемом значении функции. Это может быть чрезвычайно полезно для бинарных файлов и функций без публичных символов.
Я приглашаю вас прочитать полную статью в PoC||GTFO, доступную с ближайшего зеркала.
Скрипты:
Чтобы использовать эти скрипты, сначала нужно изменить gen_function_prototypes.py, добавив «примитивные типы», структуры или перечисления, специфичные для вашей цели. Также потребуется выбрать, сколько аргументов вы хотите перебирать. До 3 занимает минуту, до 4 — день...
После генерации прототипов функций всех комбинаций нужно запустить gen_hash_from_ast.py, который построчно разберёт ранее сгенерированный файл и создаст соответствующий XFG-хеш.
Когда это будет завершено, у вас будет SQLite-база данных прототипов функций с их XFG-хешами. В xfg_analyzer.py включён очень простой плагин Binary Ninja. При запуске против бинарного файла, защищённого XFG, он найдёт все XFG-хеши, найдёт их в базе данных и, если совпадение найдено, применит новый прототип функции к определённой функции.
Имейте в виду, что это всего лишь PoC. Чтобы быть действительно полезным, должна быть сгенерирована гигантская база данных хешей (возможно, заполненная всеми именами структур и перечислений из заголовочных файлов Windows) и предоставлена для онлайн-поиска. Кроме того, расширение этой идеи на XFG-хеши C++ было бы очень интересным проектом.
Не стесняйтесь использовать код из этого репозитория любым способом. Если вы найдёте его полезным, я хотел бы услышать о вас.