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

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

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

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

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

Категории

Все категории
Loading categories
ghostrings — Скрипты Ghidra для восстановления определений строк в Go-бинарниках | Kitploit
Инструменты/GitHubGitHub/nccgroup/ghostrings
Анализ КодаОбратная инженерияАнализ Бинарных Файлов
GitHubnccgroup/ghostrings

ghostrings

Скрипты Ghidra для восстановления определений строк в Go-бинарниках

РепозиторийСайт
13898 месяцев назадПроверено Kitploit

Популярное

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

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

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

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

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

Ghostrings

Скрипты для восстановления определений строк в Go-бинарниках с помощью P-Code анализа. Протестировано на x86, x86-64, ARM и ARM64.

Скрипты

Golang

Их можно найти в категории Golang в Script Manager.

  • GoDynamicStrings.java
    • Анализирует P-Code для поиска строковых структур, создаваемых в стеке. Использует низкоуровневый анализ в стиле "register".
  • GoFuncCallStrings.java
    • Анализирует P-Code для поиска строковых структур, передаваемых напрямую в вызовы функций через регистры, без записи в стек. Использует анализ в стиле "normalize" со встроенной поддержкой Golang в Ghidra (см. примечания к релизу Ghidra для поддерживаемых версий Golang).
  • GoStaticStrings.java
    • Ищет Go строковые структуры, статически размещённые в памяти только для чтения.
  • GoKnownStrings.java
    • Ищет стандартные уникальные строки и определяет их. Данные строк загружаются из data/known_strings.json.
  • GoStringFiller.java
    • Заполняет пробелы в go.string.* после первичного анализа, основываясь на возрастающем порядке длины строковых данных.

Также есть несколько особых вариаций скрипта динамического анализа строк:

  • GoDynamicStringsSingle.java
    • Выполняет тот же анализ, что и GoDynamicStrings.java, но использует один процесс декомпилятора. Используйте этот вариант, если анализ бинарника приводит к исчерпанию системной памяти параллельными процессами декомпилятора.
  • GoDynamicStringsHigh.java
    • Экспериментальный, использует вывод P-Code из высокоуровневого анализа в стиле "normalize". В настоящее время зависит от хака, отключающего удаление мёртвого кода в декомпиляторе (см. https://research.nccgroup.com/2022/05/20/earlyremoval-in-the-conservatory-with-the-wrench/). Этот хак ломается в Ghidra 10.2.

P-Code

Его можно найти в категории PCode в Script Manager.

  • PrintHighPCode.java
    • Выводит в консоль высокоуровневый P-Code для выбранной функции, с селектором стиля упрощения декомпилятора. В основном используется для разработки скриптов P-Code анализа.

Порядок восстановления строк

Ниже описан общий порядок использования этих скриптов для восстановления определений строк в Go-бинарнике:

  1. Очистите все некорректные или автоматически определённые строки в блоке памяти только для чтения.
    • В окне "Defined Strings" включите колонку "Mem Block" и отфильтруйте по блоку памяти, чтобы выбрать все строки в .rodata, .rdata или __rodata. Затем щёлкните правой кнопкой мыши в листинге кода и выберите "Clear Code Bytes".
  2. (Опционально) Запустите GoKnownStrings.java для обнаружения некоторых стандартных строк.
  3. Запустите GoStaticStrings.java.
  4. Запустите GoFuncCallStrings.java (если версия Golang-бинарника поддерживается встроенными функциями Golang в Ghidra).
  5. Запустите GoDynamicStrings.java.
  6. Запустите GoStringFiller.java.
    • Если он обнаружит нарушение возрастающего порядка длины строковых данных, очистите любые ложноположительные определения строк в этой области и запустите скрипт заново. Есть опция для автоматического выполнения этого действия.
    • Если бинарник лишён символов (stripped), найдите область однобайтовых строк, найденных скриптом динамических строк. Убедитесь, что это начало сгруппированных строк без нулевого терминатора (после этого должно быть определено больше строк с возрастающей длиной). Создайте метку go.string.* на первой однобайтовой строке.

Установка

Установка

В Ghidra:

  1. File -> Install Extensions -> Add extension
  2. Выберите ZIP-файл расширения

Разработка

Для Eclipse с плагином GhidraDev:

  1. Клонируйте репозиторий
  2. File -> Import -> Projects from Folder or Archive
  3. Выберите каталог репозитория
  4. GhidraDev -> Link Ghidra...
  5. Выберите импортированный проект

Сборка

Сборка в Eclipse:

  • GhidraDev -> Export -> Ghidra Module Extension...

Сборка напрямую с помощью Gradle:

root@kitploit:~
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>

Предыстория

Хорошо известная проблема при реверс-инжиниринге Go-программ заключается в том, что отсутствие нулевых терминаторов в Go-строках затрудняет восстановление определений строк из скомпилированных бинарников. Многие константные строковые значения Go-программы хранятся вместе в одном огромном блоке в скомпилированной сборке, без каких-либо символов-терминаторов в строковых данных, которые отмечали бы, где заканчивается одна строка и начинается другая. Даже простая программа, которая просто выводит "Hello world!", содержит более 1500 строк, связанных с системой выполнения Go и другими стандартными библиотеками. Это может привести к тому, что типичные реализации обнаружения ASCII строк, например, та, что встроена в Ghidra, будут создавать ложноположительные определения строк длиной в десятки тысяч символов.

Вместо строк с нулевым терминатором Go использует строковую структуру, состоящую из указателя и значения длины. Многие из этих строковых структур создаются в стеке программы во время выполнения, поэтому восстановление отдельных начальных позиций строк и значений длины требует анализа скомпилированного машинного кода. Существует несколько существующих скриптов, которые выполняют этот анализ, проверяя определённые шаблоны инструкций x86-64, но они пропускают структуры, создаваемые с помощью необработанных вариаций инструкций, которые в конечном итоге оказывают то же воздействие на стек, а также они ограничены конкретной ISA.

Ghostrings избегает обеих этих проблем, работая с упрощёнными, архитектурно независимыми операциями P-Code, создаваемыми анализом декомпилятора Ghidra.

Информация о релизе

Copyright 2022 NCC Group. Выпущено под лицензией GPLv3 (см. LICENSE).

Основной автор проекта: James Chambers [email protected]

Скачать инструмент
  • Проверьте оставшиеся пробелы в go.string.* и определите все строки с очевидными начальной и конечной точками.
    • Чтобы максимально использовать GoStringFiller.java, определите места, где длины строк меняются в неопределённых строковых данных, и определите строки, ближайшие к этой границе. Затем запустите GoStringFiller.java повторно, чтобы автоматически заполнить места, где он может корректно определить длину оставшихся неопределённых строк.
  • (Опционально) Повторно запустите встроенный инструмент Ghidra для анализа ASCII строк.
    • Отключите перезапись существующих строк. Запустите с требованием нулевого терминатора и без него.