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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2019-25485 — R 3.4.4 におけるスタックベースのバッファオーバーフロー。x86 では完全なエクスプロイトが可能だが、x64 ではプログラムの制約により、gadget 分析による RIP 制御のみ可能。同一の脆弱性が 2 つのアーキテクチャに存在し、異なるエクスプロイト経路をもたらす。 | Kitploit
ツール/GitHubGitHub/themalwareguardian/cve-2019-25485
脆弱性分析エクスプロイトリバースエンジニアリングシェルコードデバッガ学習と教育ペイロード開発バイナリエクスプロイト
GitHub
themalwareguardian/cve-2019-25485

CVE-2019-25485

R 3.4.4 におけるスタックベースのバッファオーバーフロー。x86 では完全なエクスプロイトが可能だが、x64 ではプログラムの制約により、gadget 分析による RIP 制御のみ可能。同一の脆弱性が 2 つのアーキテクチャに存在し、異なるエクスプロイト経路をもたらす。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

🐞 CVE-2019-25485: R 3.4.4 - スタックベースのバッファオーバーフロー(x86 および x64)

R 3.4.4 におけるスタックベースのバッファオーバーフロー。x86 では完全なエクスプロイトが可能だが、x64 ではプログラム上の制約によりガジェット分析での RIP 制御に留まる。同一の脆弱性が 2 つのアーキテクチャで異なるエクスプロイト経路を生む。




📑 目次

  • このリポジトリが存在する理由
  • この脆弱性が興味深い理由
  • 背景と影響を受けるソフトウェア
  • 脆弱性について
  • クラッシュの誘発
  • エクスプロイト



🎓 このリポジトリが存在する理由

このリポジトリは、メモリ破壊エクスプロイトを教える際に使用する教材の一部です(本業に加え、私はさまざまなサイバーセキュリティコースで講師を務め、次世代のリバースエンジニアを育成しています)。

CVE-2019-25485 は、学生に同一の脆弱性を 2 つの異なるアーキテクチャで扱わせ、その違いを実体験させたい場合に使用する事例です。R 3.4.4 は x86 と x64 の両バージョンで提供されており、まったく同じオーバーフロー(同じ GUI フィールド、同じ入力ハンドラ、同じクラッシュ)が両方に存在します。両方のアーキテクチャについて、ここで個別の演習として文書化し、エクスプロイトを示します。

  • x86 版は、古典的なバニラ EIP 上書き手法に従います。オーバーフローが EIP に到達し、ASLR のないモジュールから JMP ESP ガジェットが見つかり、EIP 上書きの後にシェルコードが配置され、動作するリバースシェルが達成されます。これはクリーンで直接的なエクスプロイトであり、スタックベースのバッファオーバーフローの基礎を示しています。
  • x64 版では RIP 制御に到達し、オフセットが確認されますが、完全な RCE は達成されません。これは意図的であり、演習のポイントです。x64 のエクスプロイト試行では、ガジェット検索プロセスを完全に文書化し、各ガジェットカテゴリがこの特定のコンテキストで失敗する理由を分析し、入力ハンドラによって課されるヌルバイト制約を説明し、DEP をバイパスするために必要な ROP チェーン構造と、この入力ベクトルの制約下でそれが構築できない理由を説明します。この単一の脆弱性から完全なエクスプロイトに至る唯一の理論的経路は JOP(Jump-Oriented Programming)であり、これは RET ではなく JMP で終わるガジェットをつなぎ、制御フローをスタックに依存しません。RIP 上書き後に書き込み可能な制御領域がない状態で手動で JOP チェーンを構築することは、高度な未解決の課題であり、この演習の範囲を超えています。失敗は方法論の欠陥ではありません。それが教訓です。



💡 この脆弱性が興味深い理由

R 3.4.4 は統計計算アプリケーションであり、ネットワークサービスやブラウザではありません。オーバーフローはデスクトップ GUI フィールドを通じてトリガーされるため、攻撃対象領域は私が教える他のすべてのケースとはまったく異なります。このケースが教育上有用な理由:

  • ネットワーク要素がない。 ペイロードは GUI フィールドに貼り付けられるため、特に GUI 入力ハンドラが脆弱なコピー操作に到達する前にバイトをどのように処理するかという、異なるクラスの制約が導入されます。
  • RIP 制御が確認される。 オーバーフローは RIP に到達し、オフセットが特定されます。これは脆弱性に到達できないケースではありません。命令ポインタの制御が完全に実証されます。
  • 正規アドレス強制により古典的な手法が破綻する。 x86 では EIP を上書きし、シェルコードを追加します。x64 では RIP の上位バイトが正規アドレスであるために \x00\x00 でなければならず、これらのヌルバイトはガジェットアドレスの直後に入力を終了させます。上書き後にシェルコードや ROP チェーン値を配置するスペースがありません。
  • ヌルバイト変換により ROP が阻止される。 GUI フィールドはヌルバイトを空白に変換してからバッファにコピーします。すべての x64 アドレスは上位半分にヌルバイトを含みます。ROP チェーン値としてスタック上にガジェットアドレスを配置することはできず、すべて破損して到着します。
  • DEP により直接実行が阻止される。 シェルコードバッファに到達する方法が見つかったとしても、DEP が有効であり、スタック上での実行をブロックします。
  • ガジェット検索が完全に文書化される。 ロードされたすべてのモジュールからガジェットをダンプし、タイプでフィルタリングし、各ガジェットが失敗する理由を考察するプロセスがステップバイステップで文書化されています。これはすべてのエクスプロイト開発者に必要な中核スキルです。
  • VirtualProtect の ROP チェーンの骨格が説明される。 学生は、DEP をバイパスするために正確に何が必要か、なぜ呼び出し規約が重要か、そしてなぜこの特定のチェーンが入力制約のために構築できないかを正確に理解します。



🔍 背景と影響を受けるソフトウェア

R は統計計算およびグラフィックス環境で、Windows、macOS、Linux で利用可能です。脆弱性は GUI の環境設定ダイアログ、具体的には「メニューとメッセージの言語」フィールドにあり、ユーザー入力を長さを検証せずに固定サイズのスタックバッファにコピーします。

主な技術的詳細:

  • 脆弱性タイプ:スタックベースのバッファオーバーフロー
  • 影響を受けるバージョン:R 3.4.4 x86_x64
  • 影響を受けるエンドポイント:編集 -> GUI 環境設定 -> メニューとメッセージの言語
  • 脆弱なコンポーネント:GUI 環境設定の入力ハンドラ
  • 必要な認証:なし(ローカルアプリケーション)
  • 影響:x86 - リモートコード実行 | x64 - 制御フロー確認



⚠️ 脆弱性について

R 3.4.4 は「メニューとメッセージの言語」フィールドを処理する際、指定された文字列を固定サイズのスタックバッファに長さをチェックせずにコピーします。脆弱なロジックの簡略版は次のようになります:

root@kitploit:~
char language_buffer[256];

strcpy(language_buffer, user_input);

十分に長い文字列を送信すると、コピーがバッファの終端を超えて書き込まれ、保存された戻りアドレスが上書きされるまでスタックが破損します。関数が戻るとき、CPU はスタックから攻撃者制御の値を RIP にロードし、そのアドレスへのジャンプを試みます。

x64 では、Windows はジャンプが発生する前に正規アドレス検証を強制します。0x4141414141414141 のような非正規値は、RIP がロードされる前に即座にアクセス違反を引き起こすため、クラッシュの様子は x86 とは異なります。つまり、RIP = 4141414141414141 という明確な表示はありません。オフセットは、RIP から直接ではなく、クラッシュ後のスタックから巡回パターンを読み取ることで見つける必要があります。




💥 クラッシュの誘発

長い文字列を言語フィールドに貼り付けることでクラッシュを再現できます。認証は不要です。Python を使用したペイロード生成例:

root@kitploit:~
import struct

payload = b'A' * 400

with open('payload.txt', 'wb') as f:
	f.write(payload)
root@kitploit:~
R 3.4.4 x64 を起動
編集 -> GUI 環境設定
payload.txt の内容を「メニューとメッセージの言語」に貼り付け
OK をクリック



💣 エクスプロイト

このリポジトリの目的は、クラッシュを実証するだけでなく、両アーキテクチャにおける完全なエクスプロイトプロセスを順を追って説明し、x86 で機能すること、x64 で破綻すること、そしてさらに重要なことに、その理由を文書化することです。

メインの README をクリーンに保つため、詳細なエクスプロイトノート、スクリプト、デバッガの手順は、このリポジトリの Vulnerability 📂 フォルダ内に、x86 と x64 のサブフォルダに分けて配置しています。

そこでは、両アーキテクチャの完全なワークフローを見つけることができます:

x86 - 完全なエクスプロイト:

  • 言語フィールドのファジングによるクラッシュの特定
  • オフセットの発見によるスタック上の EIP の正確な位置の特定
  • ペイロードを破損させるバイトを特定するための不良文字解析
  • ASLR も SafeSEH も有効でないモジュール stats.dll 内の JMP ESP ガジェットの特定
  • シェルコードの配置と実行、完全なリバースシェルの達成

x64 - RIP 制御とエクスプロイト分析:

  • DLL ロードイベントによる絶え間ない割り込みを回避するための x64dbg の設定
  • 正確なクラッシュサイズを見つけるための 3 フェーズにわたる言語フィールドのファジング
  • RIP からではなくスタック上の巡回パターンを読み取ることで RIP オフセットを発見
  • 自動ヌルバイトパディングによる 6 バイト上書きを使用した RIP 制御の確認
  • ヌルバイトからスペースへの変換が基本的な入力制約であることの特定
  • rp++ を使用してロードされたすべての R モジュールからガジェットをダンプし、PowerShell でフィルタリング
  • 各ガジェットカテゴリ(CALL RBX、CALL RSP、POP RSP、SUB RSP、PUSH RSP)を分析し、それぞれがこの特定のコンテキストで失敗する理由を文書化
ツールをダウンロード
  • VirtualProtect を呼び出して DEP をバイパスするために必要な ROP チェーン構造と、ヌルバイト制約のために構築できない理由の説明
  • 唯一残された理論的経路としての JOP の文書化と、それが未解決の課題であり続ける理由