Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
MOEW — ホワイトペーパー | Kitploit
ツール/GitHubGitHub/harryeetsource/moew
防御ツールエクスプロイトリバースエンジニアリングデバッガマルウェア分析学習と教育バイナリエクスプロイト
GitHubharryeetsource/moew

MOEW

ホワイトペーパー

リポジトリを見る
1628ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

見えない脅威、見える解決策。

Misaligned Opcode Exception Waterfall (MOEW)

3段階SEHウォーターフォールPoC(良性、x86/Wow64)

TL;DR: このPoCは、最初の有効命令がゼロ除数によるフォールト発生div regである生バイトブロブへの意図的なミスアラインド実行によって引き起こされる3段階の構造化例外処理(SEH)カスケードを実証します。
各例外ステージは次のSEHハンドラをインストールし、新しいミスアラインド除算ゼロをトリガーし、元のSEHチェーンを復元してクリーンに終了する前に、良性の観測可能なペイロードを実行します。


1. 概要

MOEW(Misaligned Opcode Exception Waterfall)は、x86/Wow64 Windows上で制御された例外駆動型マルチステージ実行を示す防御研究用サンプルです。以下を実証します:

  • fs:[0]を介した手動SEHチェーン操作
  • 手作りバイトシーケンス(blob1、blob2、blob3)への意図的なミスアライメント
  • ステージチェーン型SEHハンドラ
  • 以下を介したマルチフォールトリカージョン:
    • KiUserExceptionDispatcher
    • RtlDispatchException
    • カスタムユーザーモードハンドラ
  • 元のSEHチェーンを復元するクリーンな終了パス

すべてのペイロードは良性です:

  • ステージ1: メモ帳(Notepad)を起動
  • ステージ2: %TEMP%にマーカーファイルを書き込み
  • 最終ステージ: 電卓(Calculator)を起動

このPoCは意図的に無害化されています。データの暗号化、変更、破壊は行われません。


2. 特徴

  • 3つのステージハンドラによる完全に決定的なSEH再帰
  • 複数の有効なデコードパスを持つネイキッドx86バイトブロブ
  • 制御されたオフセットでのミスアラインドdiv(ECX/EDX/EBX = 0)
  • ロギングとトレース用のステージ別グローバルカウンタ
  • 元のSEHヘッド(ORIGINAL_SEH)の完全な復元
  • Rust nightly + インラインアセンブリ + ネイキッド関数
  • テレメトリとデバッガテスト用の良性だが可視の「ペイロード」

3. 環境要件

3.1 アーキテクチャ

  • x86(32ビット)のみ
  • MSVCツールチェーンでコンパイル
  • WoW64での64ビットWindows上でも動作

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はSAFESEHテーブルに存在しないカスタムSEHハンドラをインストールするため、リンカに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. ステージ1ハンドラを指すSEHレコードを構築。
  3. fs:[0]をこの新しいレコードで上書き。
  4. blob1 + 5にミスアラインし、div ecxとしてデコード(ECX = 0を設定後)。

ステージ1 — 最初のSEHハンドラ

  1. notepad.exeを起動。
  2. ステージ2ハンドラ用のSEHレコードを構築し、チェーンの先頭に追加。
  3. blob2 + 3にミスアライン → div edx(EDX = 0)。

ステージ2 — 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 chain walk (fs:[0])
            → MOEW handler

一般的なデバッガでの表示:

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. 今後の拡張

考えられる拡張は以下のとおりです:

  • SEHウォーターフォールと再帰的例外パターンに対するYARAおよび行動ルール。
  • 段階的ハードウェアフォールトのETW/EDRシグナルマッピング。
  • 時間経過に伴うSEHチェーン進化のグラフィカル図。
  • 実世界のマルウェア例外チェーンとの並列比較。

13. 完全なソースコード

完全なPoC実装はこのリポジトリにあります(src/main.rsを参照)。


14. ライセンス

このプロジェクトは防御研究と教育を目的としています。 Copyright <2025>

ここに、本ソフトウェアおよび関連文書ファイル(以下「本ソフトウェア」)の複製を取得するすべての人に対し、本ソフトウェアを無制限に扱うことを無償で許可します。これには、本ソフトウェアの使用、複製、変更、統合、公開、配布、サブライセンス、および/または販売の権利、ならびに本ソフトウェアを提供される者にそれを行うことを許可する権利が、以下の条件に従うことを条件として含まれます:

上記の著作権表示およびこの許可表示は、本ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。

本ソフトウェアは「現状のまま」提供され、明示または黙示を問わず、商品性、特定目的への適合性、および非侵害に関する保証を含むがこれらに限定されない、いかなる保証もありません。いかなる場合も、著作者または著作権保有者は、契約、不法行為、その他の行為であるかを問わず、本ソフトウェアまたは本ソフトウェアの使用もしくはその他の取引に起因または関連して発生するいかなる請求、損害、その他の責任についても責任を負いません。


15. 実サンプルとPoCの比較:SEH破壊、ウォーターフォールの動作、テレメトリへの影響

15.1 実サンプルの動作:意図的なSEH破壊

このPoCの着想元となった実世界のMOEWサンプルは、実行終了時にfs:[0]を復元しませんでした。
その代わりに、その最終ステージは:

  1. SEHヘッド(fs:[0])をNULLまたは無効なメモリへのポインタで上書きしました。
  2. 最後のミスアラインド例外をトリガーし、ハードウェアフォールトを確実に発生させました。
  3. Windowsに無効または切り詰められたSEHチェーンの走査を強制しました。
  4. RtlDispatchExceptionに無効なハンドラポインタを検出させました。
  5. 次のようなクラッシュを結果として生じました:
    • EIP/RIPが非イメージメモリ(ヒープ、スタック、または匿名領域)を指していました。
    • フォールトモジュールを解決できず、unknownとして表示されました。
    • フォールトパスもunknownとして表示されました。
  6. ロードされたモジュールに帰属できないWindowsエラー報告(WER)シグネチャを生成しました。
  7. 意味のないフォールトオフセットを持つイベントビューアのApplication Errorイベントを記録しました。
  8. 次によって支配されるEDRテレメトリを生成しました:
    • 繰り返されるKiUserExceptionDispatcher呼び出し、
    • 再帰的SEH遷移、
    • モジュール帰属を欠く最終的な異常なクラッシュ。

この破壊的なSEH破壊ステップは、サンプルの主要なアンチフォレンジック目的を果たします:
因果連鎖を消去し、帰属不可能な最終クラッシュを生成すること。


15.2 PoCの動作:最終クラッシュなしのSEHのクリーンな復元

実サンプルとは異なり、このPoCは:

  • ステージ0中に元のSEHヘッドをキャプチャします:

    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はまさに同じ根本的な方法でテレメトリを確かに劣化させます:

  • 意図的に複数のミスアラインドハードウェアフォールトをトリガーします。

  • 複数のファーストチャンス例外を連続して生成します。

  • Windowsに以下を繰り返し実行させます:

    root@kitploit:~
    KiUserExceptionDispatcher
    RtlDispatchException
        → custom handler
        → misaligned blob
        → hardware fault
    
  • 非線形で例外が支配的なコールスタックを生成します。

  • 実行を以下を経由させることで、デバッガやEDRでの制御フロー再構築を歪めます:

    • 再帰的SEHハンドラ、
    • ミスアラインドデコードパス、
    • 関数アライメントされていないアドレス、
    • 部分的な命令境界。

したがって、PoCは以下を忠実に再現します:

  • 再帰的ウォーターフォールパターン、
  • 例外駆動型ステートマシン、
  • ミスアラインドオペコードエントリ動作、
  • そして制御フロー難読化、

…を実現しつつ、破壊的な最終クラッシュを回避します。

これにより、PoCは完全なアンチフォレンジックペイロードを実行することなく、インストルメンテーションと研究に理想的です。


15.4 PoCが防御研究に適している理由

PoCはSEH破壊クラッシュを除いたMOEWの全体的な動作を保持しているため、次のようになります:

  • ラボ環境で繰り返し実行しても安全。
  • 決定的で安定。
  • 以下に適しています:
    • EDRパイプライン分析、
    • テレメトリ研究、
    • インシデントレスポンス訓練、
    • デバッガ動作テスト、
    • 実際の悪性サンプルとの並列比較。

PoCは、最終的な破壊的シグネチャを除去しつつ、例外ウォーターフォール(MOEWの本質)をモデル化しています。
テレメトリ劣化がSEH破壊だけでなく、例外駆動型制御フローモデル自体からも生じることを実証しています。


15.5 まとめ

このセクションは、PoCの目的を明確に保ちながら、動作の違いを形式化します:
アンチフォレンジックな最終クラッシュなしに、MOEWウォーターフォールを安全で研究に適した形式で実証すること。

ツールをダウンロード
動作実際のMOEWサンプルPoC実装
ミスアラインドオペコードウォーターフォール✔✔
再帰的SEH駆動ステートマシン✔✔
例外ディスパッチが支配的なコールスタック✔✔
テレメトリ/スタックトレース劣化✔✔
意図的なSEH破壊✔❌
宙吊りまたは無効なSEHポインタ✔❌
最終的な未処理例外✔❌
WER「unknown module」クラッシュ✔❌
fs:[0]のクリーンな復元❌✔
クリーンな終了❌✔