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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
windows-x86-shellcode-poc — Windows x86 PoC: レガシー32ビットWindows上でのカスタムシェルコードを使ったスタックベースのバッファオーバーフロー | Kitploit
ツール/GitHubGitHub/nataliadiak/windows-x86-shellcode-poc
脆弱性分析リバースエンジニアリングシェルコード学習と教育ペイロード開発バイナリエクスプロイト
GitHubnataliadiak/windows-x86-shellcode-poc

windows-x86-shellcode-poc

Windows x86 PoC: レガシー32ビットWindows上でのカスタムシェルコードを使ったスタックベースのバッファオーバーフロー

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

人気

すべて見る →

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

すべてのツールを探索

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

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

Windows x86 バッファオーバーフロー PoC 入門

これは、32ビットWindows向けのスタックベースのバッファオーバーフローエクスプロイトに関する、シンプルで自己完結型のチュートリアルです。外部のガイドは不要です。必要なものはすべてここにあります。

このリポジトリの内容

  • vulnerable.c: 安全でない gets() 関数を使用するシンプルなプログラム。
  • messageBox.asm: オーバーフロー後に実行される小さなアセンブリペイロード。
  • exploit.c: オーバーフローがどのようにトリガーされるかの例。

このプロジェクトは、安全でない入力読み取りにより攻撃者がリターンアドレスを上書きし、実行をリダイレクトできるという核心的なアイデアを教えます。

脆弱性: gets() にサイズ制限がない

vulnerable.c では、プログラムは次のように動作します:

root@kitploit:~
char buffer[32];
gets(buffer);

プログラムは buffer に32バイトを確保し、gets() を呼び出して入力を読み取ります。 問題: gets() はバッファサイズをチェックしません。 改行文字に遭遇するまで文字を読み続けます。 ユーザーが40文字や50文字を入力すると、余分な文字が32バイトのバッファを超えてオーバーフローします。

スタック上のメモリの配置

Cの関数が実行されるとき、スタックには次のものが保存されます:

  1. ローカル変数(buffer など)
  2. 保存された EBP(呼び出し元関数のベースポインタ)
  3. 保存されたリターンアドレス(関数が戻るときにCPUがジャンプするアドレス)

次のようにイメージしてください:

root@kitploit:~
低いアドレス(図のスタックの上部)
[  buffer (32 bytes)  ]
[    saved EBP (4 bytes)     ]
[  return address (4 bytes)  ]
高いアドレス(下部)

gets() が buffer を大量の入力でオーバーフローさせると、余分なバイトが保存された EBP、次にリターンアドレスを上書きします。

オーバーフローを注意深く構築してリターンアドレスフィールドに特定のアドレスを配置すると、関数が戻ろうとしたときにCPUがそのアドレスにジャンプします。

エクスプロイトの仕組み: ステップバイステップ

  1. プログラムが起動し、スタック上に buffer[32] を割り当てます。
  2. gets(buffer) を呼び出してユーザー入力を1行読み取ります。
  3. 32バイトより長い文字列(例えば50バイト)を送信します。
  4. gets() はサイズチェックを行わないため、50バイトすべてをバッファに書き込みます。
  5. 余分な18バイトが buffer を超えてオーバーフローし、保存された EBP とリターンアドレスを上書きします。
  6. リターンアドレスがスタック上のシェルコードを指すようにオーバーフローを注意深く構築します。
  7. 関数が戻るとき、CPUは上書きされたリターンアドレスを読み取ります。
  8. CPUはシェルコードにジャンプします。
  9. シェルコードがプログラムの権限で実行されます。

これがバッファオーバーフローによるコード実行の最も単純な形です。

シェルコードの動作: ペイロード

messageBox.asm は、オーバーフロー後に実行されるように設計された小さなコードです。

以下のことを行います:

  1. USER32.DLL のロード: LoadLibraryA を文字列 "USER32.DLL" で呼び出し、ライブラリがメモリにあることを確認します。
  2. MessageBoxA の引数を準備: 4つの引数(ウィンドウハンドル、メッセージテキスト、キャプション、ボタンの種類)をスタックにプッシュします。
  3. MessageBoxA を呼び出す: Windows API 関数を呼び出し、"CAN I HACK THE PC?" というテキストのメッセージボックスを表示します。
  4. 正常に終了: ExitProcess を呼び出してプログラムを安全に終了します。

重要なのは、これはオーバーフローによって実行がリダイレクトされた後に実行される実行可能コードであることです。 メッセージボックスが画面に表示されると、次の3つのことを証明します:

  1. バッファオーバーフローが機能し、リターンアドレスが書き換えられたこと。
  2. 実行がスタック上のシェルコードにジャンプしたこと。
  3. シェルコードが正常に実行され、Windows API 呼び出しが行われたこと。

実際の攻撃では、このペイロードはデータの窃取、ユーザーの作成、マルウェアのダウンロードなど、あらゆることを行えます。 メッセージボックスは、任意のコード実行が発生したことを示す視覚的で安全なデモンストレーションに過ぎません。

この特定のペイロードは、MessageBoxA (0x751D8830) と ExitProcess (0x7437ADB0) にハードコードされたメモリアドレスを使用しています。 これらのアドレスは特定のシステムに固有です。異なる Windows バージョンやシステムではペイロードを調整する必要があります。

MessageBoxA

デモのビルドと実行方法

ステップ1: 保護機能を無効にする

最新のWindowsには、このエクスプロイトを防ぐ複数のセキュリティ機能があります:

  • スタックカナリア (GSフラグ): スタックの上書きを検出します。
  • ASLR (DYNAMICBASE): メモリアドレスをランダム化し、ハードコードされたアドレスが機能しないようにします。
  • DEP/NX (NXCOMPAT): スタックを実行不可としてマークし、コードの実行を防ぎます。

この学習演習では、これらすべてを無効にします。

ステップ2: Windows でコンパイルする

MSVC (Microsoft Visual C++) を特定のフラグとともに使用します:

root@kitploit:~
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe

フラグの意味:

  • /GS- はスタックバッファオーバーラン保護を無効にします。
  • /DYNAMICBASE:NO はアドレス空間配置のランダム化 (ASLR) を無効にします。
  • /NXCOMPAT:NO は DEP を無効にし、スタック上のコードの実行を許可します。

実行可能ファイルが既にある場合は、editbin を使用して保護を無効にできます:

root@kitploit:~
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe

ステップ3: 実行する

  1. vulnerable.exe を起動します。
  2. プロンプトが表示されたら、長い文字列(32文字以上)を入力します。
  3. オーバーフローが機能すると、保存されたリターンアドレスが上書きされます。
  4. プログラムはクラッシュするか、ランダムなメモリにジャンプするか、(適切なシェルコードを使用した実際のエクスプロイトでは)ペイロードを実行する可能性があります。

このREADMEが完全である理由

このREADMEでは以下のことを説明しています:

  1. gets() とは何か、なぜ安全でないか(サイズ制限がない)。
  2. スタックがローカル変数、保存されたレジスタ、リターンアドレスをどのように保存するか。
  3. オーバーフローがリターンアドレスをどのように上書きできるか。
  4. 関数が戻るときにCPUがリターンアドレスをどのように使用するか。
  5. リターンアドレスがシェルコードを指す場合、シェルコードがどのように実行されるか。
  6. どのような防御機能が存在し、なぜそれらを無効にするか。
  7. サンプルをビルドして実行する方法。

これでバッファオーバーフローエクスプロイトの全体的な流れを理解しました。 コードファイルを読み、この説明と比較して理解を深めてください。

重要な安全上の注意

この例は学習目的のみです。 所有していないシステムやテストの明示的な許可がないシステムに対してこの手法を使用しないでください。 コンピュータシステムへの不正アクセスは違法です。

ツールをダウンロード