Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
VulFi — Плагин для IDA Pro для поиска на основе запросов внутри бинарного файла, полезный в основном для исследования уязвимостей. | Kitploit
Инструменты/GitHubGitHub/accenture/vulfi
Статический анализАнализ уязвимостейОбратная инженерияАнализ Бинарных Файлов
GitHubaccenture/vulfi

VulFi

Плагин для IDA Pro для поиска на основе запросов внутри бинарного файла, полезный в основном для исследования уязвимостей.

Репозиторий
669741 год назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

VulFi v3.0

Введение

Инструмент VulFi (Vulnerability Finder) представляет собой плагин для IDA Pro, который можно использовать для помощи в поиске уязвимостей в бинарных файлах. Его основная цель — предоставить единое представление со всеми перекрёстными ссылками на наиболее интересные функции (такие как strcpy, sprintf, system и т.д.). В случаях, когда доступен декомпилятор Hexrays, он попытается отсеять вызовы этих функций, которые не представляют интереса с точки зрения исследования уязвимостей (например, strcpy(dst,"Hello World!")). Без декомпилятора правила гораздо проще (чтобы не зависеть от архитектуры), поэтому отсеиваются только самые очевидные случаи.

См. Список изменений для получения дополнительной информации об обновлениях.

Установка

Поместите файлы vulfi.py, vulfi_prototypes.json и vulfi_rules.json в папку плагинов IDA (cp vulfi* <IDA_PLUGIN_FOLDER>).

Подготовка файла базы данных

Перед запуском VulFi убедитесь, что вы хорошо понимаете бинарный файл, с которым работаете. Постарайтесь идентифицировать все стандартные функции (strcpy, memcpy и т.д.) и назвать их соответствующим образом. Плагин нечувствителен к регистру, поэтому MEMCPY, Memcpy и memcpy — все являются допустимыми именами. Однако обратите внимание, что поиск функции требует точного совпадения. Это означает, что memcpy? или std_memcpy (или любой другой вариант) не будут распознаны как стандартная функция и, следовательно, не будут учитываться при поиске потенциальных уязвимостей. Если вы работаете с неизвестным бинарным файлом, сначала необходимо установить параметры компилятора: Options > Compiler. После этого VulFi сделает всё возможное, чтобы отфильтровать все очевидные ложные срабатывания (например, вызов printf с константной строкой в качестве первого параметра). Обратите внимание: хотя плагин создан без привязки к конкретной архитектуре, некоторые процессоры не имеют полной поддержки указания типов, и в таких случаях VulFi просто отметит все перекрёстные ссылки на потенциально опасные стандартные функции, чтобы вы могли продолжить ручной анализ. В этих случаях вы можете воспользоваться функциями отслеживания плагина.

Использование

Сканирование

Чтобы запустить сканирование, выберите пункт Search > VulFi из верхнего меню. Это либо запустит новое сканирование, либо загрузит предыдущие результаты, сохранённые в файле idb/i64. Данные автоматически сохраняются при сохранении базы данных.

После завершения сканирования или загрузки предыдущих результатов будет представлена таблица со столбцами:

  • IssueName — Используется в качестве заголовка для подозреваемой проблемы.
  • FunctionName — Имя функции.
  • FoundIn — Функция, содержащая потенциально интересную ссылку.
  • Address — Адрес обнаруженного вызова.
  • Status — Статус проверки; изначально для каждого нового элемента устанавливается Not Checked. Другие статусы: False Positive, Suspicious и Vulnerable. Их можно задать с помощью контекстного меню (правый клик) на элементе, и они должны отражать результаты ручного просмотра данного вызова функции.
  • Priority — Попытка расставить приоритеты для более интересных вызовов по сравнению с менее интересными. Возможные значения: High, Medium и Low (также Info для случаев, когда сканеру не удалось корректно определить все параметры). Приоритеты определяются вместе с другими правилами в файле vulfi_rules.json.
  • Comment — Пользовательский комментарий для данного элемента.

Если в файле idb/i64 нет данных или пользователь решил выполнить новое сканирование, плагин спросит, следует ли запускать сканирование с использованием включённых по умолчанию правил или использовать собственный файл правил. Обратите внимание: повторное сканирование с уже существующими данными не перезаписывает ранее найденные элементы, идентифицированные правилом с тем же именем, что и правило, с которым сохранены предыдущие результаты. Таким образом, повторное сканирование не удаляет существующие комментарии и обновления статуса.

basic

В контекстном меню (правый клик) в представлении VulFi вы также можете удалить элемент из результатов или удалить все элементы. Учтите, что все комментарии и обновления статуса будут потеряны после выполнения этой операции. Начиная с версии 2.1, VulFi также поддерживает операции, выполняемые сразу над несколькими выбранными элементами. Это позволяет отмечать несколько элементов определённым статусом, удалять их или добавлять одинаковый комментарий к нескольким строкам. Иногда бывает, что операция не обновляется корректно. В таких случаях обновите интерфейс (Ctrl+U) несколько раз, пока не увидите изменения.

Исследование

Всякий раз, когда вы хотите проверить обнаруженный экземпляр возможной уязвимой функции, просто дважды щёлкните в любом месте нужной строки, и IDA перенесёт вас в то место в памяти, которое было определено как потенциально интересное. Используя правый клик и опцию Set Vulfi Comment, вы можете ввести комментарий для данного экземпляра (например, чтобы обосновать статус).

Добавление дополнительных функций

Плагин также позволяет создавать пользовательские правила. Эти правила могут быть определены в интерфейсе IDA (идеально для отдельных функций) или предоставлены в виде файла пользовательских правил (идеально для правил, охватывающих несколько функций).

Внутри интерфейса

Если вы хотите отслеживать пользовательскую функцию, обнаруженную в ходе анализа, щёлкните правой кнопкой мыши в любом месте её тела и выберите Add <name> function to VulFi. Вы также можете выделить и щёлкнуть правой кнопкой мыши имя функции в текущем представлении дизассемблера/декомпилятора, чтобы не переключаться в тело функции.

add custom

Пользовательский набор правил

Также можно загрузить пользовательский файл с набором нескольких правил. Чтобы создать файл пользовательских правил со структурой, приведённой ниже, вы можете использовать прилагаемый файл шаблона здесь.

root@kitploit:~
[   // Массив правил
    {
        "name": "RULE NAME", // Имя правила
        "function_names":[
            "function_name_to_look_for" // Список всех имён функций, которые должны быть сопоставлены с условиями, определёнными в этом правиле
        ],
        "wrappers":true,    // Также искать обёртки для указанных выше функций (обратите внимание, что обёрнутая функция также должна соответствовать правилу)
        "mark_if":{
            "High":"True",  // Если вычисляется как True, отметить с приоритетом High (см. Правила ниже)
            "Medium":"False", // Если вычисляется как True, отметить с приоритетом Medium (см. Правила ниже)
            "Low": "False" // Если вычисляется как True, отметить с приоритетом Low (см. Правила ниже)
        }
    }
]

Пример правила, которое ищет все перекрёстные ссылки на функцию malloc и проверяет, не является ли её параметр константой и проверяется ли возвращаемое значение функции, показан ниже:

root@kitploit:~
{
    "name": "Possible Null Pointer Dereference",
    "function_names":[
        "malloc"
    ],
    "wrappers":false,
    "mark_if":{
        "High":"not param[0].is_constant() and not function_call.return_value_checked()",
        "Medium":"False",
        "Low": "False"
    }
}

Правила

Вспомогательные функции для не-функциональных конструкций

  • Loop Check — Отмечает все циклы. В этом случае param[0] — это счётчик цикла (если обнаружен), а param[1] — условие, с которым сравнивается счётчик для завершения цикла.
  • Array Access — Отмечает все обращения к массивам. В этом случае param[0] — это массив, а param[1] — индекс.

Те же функции можно использовать при создании правил, как и для обычных параметров функций (всё, что можно вызвать для param[<index>]).

Доступные переменные

  • param[<index>]: Используется для доступа к параметру вызова функции (индекс начинается с 0)
  • function_call: Используется для доступа к событию вызова функции
  • param_count: Содержит количество параметров, переданных функции

Доступные функции

  • Является ли параметр константой: param[<index>].is_constant()
  • Получить числовое значение параметра: param[<index>].number_value()
  • Получить строковое значение параметра: param[<index>].string_value()
  • Устанавливается ли параметр в null после вызова: param[<index>].set_to_null_after_call()
  • Проверяется ли возвращаемое значение функции: function_call.return_value_checked(<constant_to_check>)
  • Используется ли параметр также в качестве параметра в одном из вызовов указанного списка функций до/после: param[<index>].used_in_call_<before|after>(["function1","function2"])
  • Доступен ли вызов выбранной функции из определённой другой функции: function_call.reachable_from("<function_name>")
  • Является ли параметр частью знакового сравнения: param[<index>].is_sign_compared()
  • Используется ли параметр как индекс массива в текущей функции: param[<index>].used_as_index()

Примеры

  • Отметить все вызовы функции, где третий параметр > 5: param[2].number_value() > 5
  • Отметить все вызовы функции, где второй параметр содержит "%s": "%s" in param[1].string_value()
  • Отметить все вызовы функции, где второй параметр не константа: not param[1].is_constant()
  • Отметить все вызовы функции, где возвращаемое значение проверяется на значение, равное количеству параметров: function_call.return_value_checked(param_count)
  • Отметить все вызовы функции, где возвращаемое значение проверяется на любое значение: function_call.return_value_checked()
  • Отметить все вызовы функции, где ни один из параметров, начиная с третьего, не является константой: all(not p.is_constant() for p in param[2:])
  • Отметить все вызовы функции, где любой из параметров является константой: any(p.is_constant() for p in param)
  • Отметить все вызовы функции: True
  • Отметить все вызовы функции, где второй параметр не константа и не проверяется с помощью strlen: not param[1].is_constant() and not param[1].used_in_call_before(["strlen"])

Проблемы и предупреждения

  • Когда вы запрашиваете параметр с индексом, выходящим за границы, любой вызов функции будет помечен как приоритет Low. Это способ избежать пропуска перекрёстных ссылок, когда не удалось корректно получить все параметры (в основном это относится к режиму дизассемблера).
  • Если вы выполняете поиск в представлении VulFi и переключаете контекст из представления, а затем возвращаетесь, представление не загрузится. Вы можете решить это, либо завершив операцию поиска перед переключением контекста, переместив представление VulFi на боковую панель, чтобы оно было всегда видимым, либо закрыв и снова открыв представление (данные не будут потеряны).
  • Сканирование для более экзотических архитектур приводит к большому количеству ложных срабатываний.
  • С добавлением операций множественного выбора в селектор VulFi операция обновления иногда не обновляет представление. Если вы заметили, что ваши изменения не отобразились, используйте сочетание клавиш Ctrl+U, чтобы вручную обновить представление (несколько раз).
Скачать инструмент
  • Отметить все вызовы функции, которые доступны из функции read: function_call.reachable_from("read")