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

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

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

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

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

Категории

Все категории
Loading categories
MOEW — Белая книга | Kitploit
Инструменты/GitHubGitHub/harryeetsource/moew
Оборонительные ИнструментыЭксплуатацияОбратная инженерияОтладчикиАнализ вредоносных программОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubharryeetsource/moew

MOEW

Белая книга

Репозиторий
16219 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

Невидимые угрозы — видимые решения.

Каскад исключений на невыровненных опкодах (MOEW)

3‑стадийный SEH-каскад PoC (безвредный, x86/Wow64)

Кратко: Данный PoC демонстрирует 3‑стадийный каскад обработки структурных исключений (SEH), вызванный намеренным невыровненным исполнением необработанных байтовых последовательностей, первая корректная инструкция которых — вызывающая сбой div reg с нулевым делителем.
Каждая стадия исключения устанавливает следующий SEH-обработчик, инициирует новое невыровненное деление на ноль и выполняет безвредную наблюдаемую нагрузку, после чего восстанавливает исходную SEH-цепочку и корректно завершает работу.


1. Обзор

MOEW (Misaligned Opcode Exception Waterfall) — это образец оборонительного исследования, демонстрирующий управляемое многостадийное исполнение на основе исключений в среде x86/Wow64 Windows. Он показывает:

  • Ручное управление SEH-цепочкой через fs:[0]
  • Намеренное невыровненное исполнение вручную составленных байтовых последовательностей (blob1, , )
Скачать инструмент
blob2
blob3
  • Стадийные SEH-обработчики, связанные в цепочку
  • Многоуровневую рекурсию сбоев через:
    • KiUserExceptionDispatcher
    • RtlDispatchException
    • Пользовательские обработчики в режиме пользователя
  • Чистый путь завершения, восстанавливающий исходную SEH-цепочку
  • Вся нагрузка безвредна:

    • Стадия 1: Запускает Блокнот
    • Стадия 2: Записывает файл-маркер в %TEMP%
    • Финальная стадия: Запускает Калькулятор

    PoC намеренно «обезврежен». Никакие данные не шифруются, не изменяются и не уничтожаются.


    2. Возможности

    • Полностью детерминированная SEH-рекурсия через 3 стадийных обработчика
    • «Голые» x86-байтовые последовательности с несколькими корректными путями декодирования
    • Невыровненный div по управляемым смещениям (ECX/EDX/EBX = 0)
    • Глобальный счётчик стадий для логирования и трассировки
    • Полное восстановление исходной головы SEH-цепочки (ORIGINAL_SEH)
    • Rust nightly + встроенный ассемблер + голые функции
    • Безвредная, но видимая «нагрузка» для телеметрии и отладки

    3. Требования к окружению

    3.1 Архитектура

    • Только x86 (32‑бит)
    • Компиляция с помощью MSVC-тулчейна
    • Работает также на 64‑битной Windows в режиме WoW64

    3.2 Rust Nightly

    PoC использует возможности, доступные только в nightly:

    root@kitploit:~
    #![feature(asm_experimental_arch)]
    #![feature(naked_functions)]
    

    Установите необходимые компоненты:

    root@kitploit:~
    rustup toolchain install nightly
    rustup target add i686-pc-windows-msvc --toolchain nightly
    

    3.3 Отключение SAFESEH

    Поскольку PoC устанавливает пользовательские SEH-обработчики, отсутствующие в таблице SAFESEH, необходимо указать линковщику отключить проверку SAFESEH.

    Создайте .cargo/config.toml:

    root@kitploit:~
    [target.i686-pc-windows-msvc]
    rustflags = [
      "-C", "link-arg=/SAFESEH:NO",
    ]
    

    4. Инструкция по сборке

    Соберите бинарный файл:

    root@kitploit:~
    cargo +nightly build --target i686-pc-windows-msvc --release
    

    Результат находится по пути:

    root@kitploit:~
    target\i686-pc-windows-msvc\release\seh_waterfall.exe
    

    5. Запуск PoC

    Выполните:

    root@kitploit:~
    seh_waterfall.exe
    

    Ожидаемый порядок управления:

    root@kitploit:~
    Stage 0 → misaligned blob1 → Stage 1 handler
    Stage 1 → misaligned blob2 → Stage 2 handler
    Stage 2 → misaligned blob3 → Final handler
    Final  → restore SEH       → exit
    

    Видимые артефакты:

    • Запускается notepad.exe (Стадия 1)
    • Создаётся %TEMP%\moew_stage2.txt (Стадия 2)
    • Запускается calc.exe (финальный обработчик)

    6. Технический разбор

    6.1 Структура SEH-записи

    В 32‑битной Windows SEH-записи образуют связный список, хранящийся по адресу fs:[0]:

    root@kitploit:~
    #[repr(C)]
    struct SehRec {
        next: *mut SehRec,
        handler: usize,
    }
    

    Каждый обработчик использует стандартную сигнатуру SEH:

    root@kitploit:~
    extern "system" fn handler(
        record: *mut u8,
        frame: *mut u8,
        context: *mut u8,
        dispatcher: *mut u8,
    ) -> i32
    

    6.2 Глобальное состояние

    root@kitploit:~
    static STAGE_COUNTER: AtomicU32 = AtomicU32::new(0);
    static mut ORIGINAL_SEH: *mut SehRec = std::ptr::null_mut();
    

    Используется для:

    • подсчёта глубины рекурсии обработчиков
    • восстановления исходной головы SEH-цепочки в конце каскада

    7. Логика стадий

    Стадия 0 — Первоначальная настройка фрейма

    1. Сохранить fs:[0] как ORIGINAL_SEH.
    2. Создать SEH-запись, указывающую на обработчик Стадии 1.
    3. Перезаписать fs:[0] этой новой записью.
    4. Выполнить невыровненный переход в blob1 + 5, который декодируется как div ecx (после установки ECX = 0).

    Стадия 1 — Первый SEH-обработчик

    1. Запустить notepad.exe.
    2. Создать SEH-запись для обработчика Стадии 2 и добавить её в вершину цепочки.
    3. Выполнить невыровненный переход в blob2 + 3 → div edx (при EDX = 0).

    Стадия 2 — Второй SEH-обработчик

    1. Записать %TEMP%\moew_stage2.txt.
    2. Установить финальный обработчик в SEH-цепочку.
    3. Выполнить невыровненный переход в blob3 + 3 → div ebx (при EBX = 0).

    Финальный обработчик — Завершение

    1. Запустить calc.exe.
    2. Восстановить ORIGINAL_SEH в fs:[0].
    3. Завершить процесс корректно через process::exit(0).

    8. Невыровненные сбойные последовательности

    8.1 blob1

    root@kitploit:~
    #[unsafe(naked)]
    pub extern "C" fn blob1() {
        naked_asm! {
            ".byte 0xB8, 0x10, 0x00, 0x00, 0x00", // mov eax, 0x10
            ".byte 0xF7, 0xF1",                   // div ecx
            ".byte 0xC3",                         // ret
            ".byte 0x90, 0x90, 0x90",             // nop padding
        }
    }
    
    • Выровненное декодирование: mov eax, 0x10; div ecx; ret
    • Невыровненное по смещению +5: div ecx (при ECX = 0 → #DE)

    8.2 blob2

    root@kitploit:~
    #[unsafe(naked)]
    pub extern "C" fn blob2() {
        naked_asm! {
            ".byte 0x55",                         // push ebp
            ".byte 0x8B, 0xEC",                   // mov ebp, esp
            ".byte 0xF7, 0xF2",                   // div edx
            ".byte 0xC3",                         // ret
            ".byte 0x90, 0x90, 0x90",             // nop padding
        }
    }
    
    • Выровненное декодирование: push ebp; mov ebp, esp; div edx; ret
    • Невыровненное по смещению +3: div edx (при EDX = 0 → #DE)

    8.3 blob3

    root@kitploit:~
    #[unsafe(naked)]
    pub extern "C" fn blob3() {
        naked_asm! {
            ".byte 0x53",                         // push ebx
            ".byte 0x8B, 0xD8",                   // mov ebx, eax
            ".byte 0xF7, 0xF3",                   // div ebx
            ".byte 0xC3",                         // ret
            ".byte 0x90, 0x90, 0x90",             // nop padding
        }
    }
    
    • Выровненное декодирование: push ebx; mov ebx, eax; div ebx; ret
    • Невыровненное по смещению +3: div ebx (при EBX = 0 → #DE)

    9. Конвейер исключений

    Каждая сбойная стадия повторно входит в пользовательский конвейер исключений Windows:

    root@kitploit:~
    KiUserExceptionDispatcher
        → RtlDispatchException
            → обход SEH-цепочки (fs:[0])
                → обработчик MOEW
    

    Типичный вид в отладчике:

    root@kitploit:~
    seh_waterfall!blobX+offset
    ntdll!KiUserExceptionDispatcher
    ntdll!RtlDispatchException
    seh_waterfall!stageN_handler
    

    Каскад полностью основан на реальных аппаратных сбоях и диспетчеризации SEH; никакие синтетические или поддельные исключения не используются.


    10. Вывод файла-маркера

    Файл, записываемый на Стадии 2, выглядит так:

    root@kitploit:~
    MOEW Stage 2 Marker
    -------------------
    This file was written by the Stage 2 SEH handler
    as a benign demonstration payload.
    

    Его наличие в %TEMP% служит простым наблюдаемым доказательством того, что Стадия 2 была выполнена через SEH-цепочку.


    11. Примечания по безопасности

    • PoC безвреден и предназначен только для оборонительных исследований.
    • Отсутствуют персистентность, изменения реестра или шифрование.
    • Все исключения перехватываются и обрабатываются.
    • Исходная SEH-цепочка восстанавливается перед завершением.

    12. Возможные будущие улучшения

    Потенциальные расширения включают:

    • YARA- и поведенческие правила для SEH-каскадов и рекурсивных паттернов исключений.
    • Сопоставление сигналов ETW / EDR для стадийных аппаратных сбоев.
    • Графические диаграммы эволюции SEH-цепочки во времени.
    • Сравнение бок о бок с реальными вредоносными цепочками исключений.

    13. Полный исходный код

    Полная реализация PoC доступна в этом репозитории (см. src/main.rs).


    14. Лицензия

    Этот проект предназначен для оборонительных исследований и образования. Copyright <2025>

    Настоящим предоставляется разрешение, бесплатно, любому лицу, получившему копию этого программного обеспечения и связанных файлов документации («Программное обеспечение»), на использование Программного обеспечения без ограничений, включая, без ограничений, права использовать, копировать, изменять, объединять, публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это, при соблюдении следующих условий:

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

    ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ЛЮБЫМ ИСКАМ, УБЫТКАМ ИЛИ ИНОЙ ОТВЕТСТВЕННОСТИ, БУДЬ ТО В ДЕЙСТВИЯХ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКАЮЩИМ ИЗ, ВНЕ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.


    15. Реальный образец против PoC: повреждение SEH, поведение каскада и влияние на телеметрию

    15.1 Поведение реального образца: намеренное повреждение SEH

    Реальный образец MOEW, вдохновивший этот PoC, не восстанавливал fs:[0] в конце своего выполнения.
    Вместо этого его финальная стадия:

    1. Перезаписывала голову SEH-цепочки (fs:[0]) значением NULL или указателем на недопустимую память.
    2. Инициировала последнее невыровненное исключение, гарантируя аппаратный сбой.
    3. Вынуждала Windows обходить недопустимую или усечённую SEH-цепочку.
    4. Приводила к тому, что RtlDispatchException сталкивался с некорректным указателем на обработчик.
    5. Завершалась крахом, при котором:
      • EIP/RIP указывал на память вне образа (куча, стек или анонимная область).
      • Сбойный модуль не мог быть определён и отображался как unknown.
      • Сбойный путь также отображался как unknown.
    6. Формировала сигнатуры Windows Error Reporting (WER), которые не были связаны ни с одним загруженным модулем.
    7. Записывала в Просмотр событий события Application Error с бессмысленными смещениями сбоя.
    8. Формировала телеметрию EDR, в которой доминировали:
      • повторные вызовы KiUserExceptionDispatcher,
      • рекурсивные переходы SEH,
      • финальный аномальный крах без атрибуции модуля.

    Этот разрушительный шаг повреждения SEH служит главной антикриминалистической цели образца:
    стирание причинно-следственной цепочки и создание неатрибутируемого финального краха.


    15.2 Поведение PoC: чистое восстановление SEH без финального краха

    В отличие от реального образца, этот PoC:

    • Захватывает исходную голову SEH-цепочки на Стадии 0:

      root@kitploit:~
      asm!("mov {old}, fs:[0]", old = out(reg) old_head);
      ORIGINAL_SEH = old_head;
      
    • Восстанавливает исходную голову SEH-цепочки в финальном обработчике:

      root@kitploit:~
      asm!("mov fs:[0], {p}", p = in(reg) ORIGINAL_SEH);
      
    • Завершает работу корректно через process::exit(0) вместо инициирования необработанного сбоя.

    В результате PoC:

    • не оставляет повреждённую SEH-цепочку;
    • не создаёт финальное необработанное исключение;
    • не генерирует:
      • отчёты о крахе WER,
      • записи Application Error 1000 в Просмотре событий,
      • сигнатуры «faulting module: unknown»,
      • недопустимые диспозиции исключений,
      • или зависшие SEH-записи.

    Однако, что критически важно, PoC не устраняет вызванную исключениями деградацию телеметрии MOEW.


    15.3 Деградация телеметрии, общая для реального образца и PoC

    PoC абсолютно точно деградирует телеметрию тем же фундаментальным образом:

    • Он намеренно инициирует множественные невыровненные аппаратные сбои.

    • Он создаёт множественные first-chance исключения в быстрой последовательности.

    • Он заставляет Windows многократно выполнять:

      root@kitploit:~
      KiUserExceptionDispatcher
      RtlDispatchException
          → custom handler
          → misaligned blob
          → hardware fault
      
    • Он генерирует нелинейные, доминируемые исключениями стеки вызовов.

    • Он искажает реконструкцию потока управления в отладчиках и EDR, направляя исполнение через:

      • рекурсивные SEH-обработчики,
      • невыровненные пути декодирования,
      • адреса, не выровненные по границам функций,
      • частичные границы инструкций.

    Таким образом, PoC достоверно воспроизводит:

    • рекурсивный каскадный паттерн,
    • управляемую исключениями машину состояний,
    • поведение входа через невыровненные опкоды,
    • и обфускацию потока управления,

    …избегая при этом разрушительного финального краха.

    Это делает PoC идеальным для инструментирования и исследований без применения полной антикриминалистической нагрузки.


    15.4 Почему PoC подходит для оборонительных исследований

    Поскольку PoC сохраняет общее поведение MOEW за вычетом краха из-за повреждения SEH, он:

    • Безопасен для многократного запуска в лабораторных средах.
    • Детерминирован и стабилен.
    • Подходит для:
      • анализа конвейеров EDR,
      • исследований телеметрии,
      • обучения реагированию на инциденты,
      • тестирования поведения отладчиков,
      • сравнения бок о бок с реальными вредоносными образцами.

    PoC моделирует каскад исключений (суть MOEW), убирая при этом финальную разрушительную сигнатуру.
    Он демонстрирует, что деградация телеметрии возникает не только из-за повреждения SEH, но и из самой модели потока управления, управляемой исключениями.


    15.5 Сводка

    ПоведениеРеальный образец MOEWРеализация PoC
    Каскад невыровненных опкодов✔✔
    Рекурсивная SEH-управляемая машина состояний✔✔
    Доминирующие стеки вызовов с диспетчеризацией исключений✔✔
    Деградация телеметрии / трассировки стека✔✔
    Намеренное повреждение SEH✔❌
    Зависшие или недопустимые SEH-указатели✔❌
    Финальное необработанное исключение✔❌
    Крах WER «unknown module»✔❌
    Чистое восстановление fs:[0]❌✔
    Чистое завершение❌✔

    Этот раздел формализует поведенческие различия, сохраняя при этом ясность назначения PoC:
    продемонстрировать каскад MOEW в безопасной, пригодной для исследований форме без антикриминалистического финального краха.