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

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

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

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

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

Категории

Все категории
Loading categories
sgn — Полиморфный бинарный кодировщик для полезных нагрузок в сфере наступательной безопасности. Кодирует шеллкод с помощью цепи обратной связи на основе LFSR, внедрения мусорных инструкций и многоитерационной обфускации для обхода статического обнаружения. | Kitploit
Инструменты/GitHubGitHub/egebalci/sgn
Шелл-код
GitHubegebalci/sgn

sgn

Полиморфный бинарный кодировщик для полезных нагрузок в сфере наступательной безопасности. Кодирует шеллкод с помощью цепи обратной связи на основе LFSR, внедрения мусорных инструкций и многоитерационной обфускации для обхода статического обнаружения.

Репозиторий
2.0k24922 дней назадПроверено Kitploit

Популярное

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

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

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

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

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

GitHub All Releases Build Issues Crates License: MIT

SGN — это полиморфный бинарный энкодер для целей наступательной безопасности, например для создания статически необнаруживаемых бинарных полезных нагрузок. В нём используется аддитивный контур обратной связи для кодирования заданных бинарных инструкций, аналогичный LFSR. Этот проект является переработкой оригинального Shikata ga nai на Go со множеством улучшений.

[!WARNING]
Недавно проект был портирован на Rust. Эта версия сохраняет исходный дизайн и поведение, но заменяет текстовый ассемблер keystone на чисто Rust-ассемблер iced-x86, поэтому нет зависимостей от нативных библиотек — сборка выполняется обычной командой cargo build. Для устаревшей версии на Go смотрите ветку sgn-go.

Зачем?

Для сообщества наступательной безопасности оригинальная реализация энкодера Shikata ga nai считалась лучшим шеллкод-энкодером (до сих пор). Но с годами исследователи безопасности нашли несколько недостатков, позволяющих статически обнаруживать заглушку декодера (связанная работа — статья FireEye). Основной мотив этого проекта — создать более совершенный энкодер, который кодирует заданный бинарный файл до состояния полной неотличимости от случайных данных, делая невозможным обнаружение наличия декодера.

  • Поддержка 64 бит. Finally properly encoded x64 shellcodes !
  • Новая уменьшенная заглушка декодера. LFSR key reduced to 1 byte
  • Кодирование заглушки по псевдослучайной схеме. Decoder stub is also encoded with a psudo random schema
  • Без видимого условия цикла. Stub decodes itself WITHOUT using any loop conditions !!
  • Обфускация заглушки декодера. Random garbage instruction generator added with keystone
  • Безопасный режим работы с регистрами. Non of the registers are clobbered (optional preable, may reduce polimorphism)

Как это работает

Каждый проход кодирования:

  1. (необязательно) добавляет суффикс восстановления регистров (безопасный режим);
  2. добавляет в начало случайные мусорные инструкции, сохраняющие значения;
  3. шифрует полезную нагрузку шифром ADFL (аддитивная цепь обратной связи) и добавляет в начало декодер без циклов, который восстанавливает её во время выполнения;
  4. если не указано --plain, дополнительно шифрует саму заглушку случайным схемным шифром (XOR/ADD/SUB/ROL/ROR/NOT над DWORD) и добавляет в начало самолокализующийся декодер схемы, так что даже декодер выглядит как случайные данные;
  5. опционально повторяется --enc раз с новыми seed-значениями;
  6. (необязательно) добавляет в начало префикс сохранения регистров (безопасный режим).

Установка

root@kitploit:~
cargo install sgn

Также вы можете получить готовые скомпилированные бинарные файлы ЗДЕСЬ.

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

-h довольно понятен без объяснений, используйте -v, если хотите видеть, что происходит за кулисами ( ͡° ͜ʖ ͡°)_/¯

root@kitploit:~
       __   _ __        __                               _ 
  ___ / /  (_) /_____ _/ /____ _  ___ ____ _  ___  ___ _(_)
 (_-</ _ \/ /  '_/ _ `/ __/ _ `/ / _ `/ _ `/ / _ \/ _ `/ / 
/___/_//_/_/_/\_\\_,_/\__/\_,_/  \_, /\_,_/ /_//_/\_,_/_/  
========[Author:-Ege-Balcı-]====/___/=======v2.0.2=========  
    ┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻           (ノ ゜Д゜)ノ ︵ 仕方がない

sgn [OPTIONS]

Options:
  -i, --input <INPUT>        Input binary path
  -o, --out <OUT>            Encoded output binary name (default: <input>.sgn)
  -a, --arch <ARCH>          Binary architecture (32/64) [default: 64]
  -c, --enc <ENC>            Number of times to encode the binary [default: 1]
  -M, --max <MAX>            Maximum bytes per garbage block [default: 50]
      --plain                Do not encode the decoder stub
      --ascii                Generate a fully ASCII-printable payload (slow)
  -S, --safe                 Preserve all register values (no clobber)
      --badchars <BADCHARS>  Avoid these bytes, hex format (e.g. \x00\x0a)
  -v, --verbose              Verbose mode
  -h, --help                 Print help
  -V, --version              Print version

Пример:

root@kitploit:~
sgn -i shellcode.bin -o encoded.bin -a 64 --badchars '\x00\x0a\x0d'

Порядок выполнения

На изображении ниже показана базовая схема работы энкодера. Имейте в виду, что размеры, расположение и порядок мусорных инструкций, декодеров и декодеров схем будут меняться на каждой итерации.

Сам по себе LFSR довольно мощный с точки зрения пространства вероятностей. Для ещё большего полиморфизма в начало незакодированной полезной нагрузки добавляются мусорные инструкции. На изображении ниже показана сопровождающая матрица характеристического многочлена LFSR; если обозначить seed как вектор-столбец, она также показывает состояние регистра в конфигурации Фибоначчи через k шагов.

Использование в качестве библиотеки

root@kitploit:~
use sgn::Encoder;

let shellcode = std::fs::read("payload.bin")?;
let mut encoder = sgn::Encoder::new(64)?;
let encoded = encoder.encode(&shellcode)?;
println!("encoded {} bytes", encoded.len());

Смотрите examples/encode_binary.rs.

Тестирование

root@kitploit:~
cargo test

Набор тестов включает модульные тесты шифрования round-trip, а также реальные тесты выполнения: закодированный x64 shellcode отображается в исполняемую память и выполняется в процессе, а x86 shellcode выполняется через вспомогательный стенд cc -m32 (автоматически пропускается, если 32-битный тулчейн отсутствует). Обе архитектуры проверяются в режимах plain, schema, multi-layer и safe-register, включая цикл случайных стресс-тестов.

Примечания о портировании

  • Генерация инструкций использует типизированный API ассемблера iced-x86 вместо текстового ассемблера keystone; заглушки декодеров были переработаны вокруг RIP-относительной адресации (x64) и двухпроходной схемы call/pop (x86).
  • Схемный шифр выражается непосредственно в нативном little-endian представлении DWORD, что эквивалентно, но понятнее, чем смешанная арифметика big/little-endian в оригинале.
  • Мёртвый код из оригинала (неиспользуемая таблица набора инструкций объёмом ~3k строк и генератор «unsafe garbage», который никто не вызывал) был удалён.
  • Незначительные исправления: random_byte теперь покрывает весь диапазон 0..=255, а бюджет размера мусорных данных (--max) теперь последовательно применяется как ограничение на блок.
Скачать инструмент