binary-protection-bypass
ELFバイナリに実装されたASLR、PIE、NX/DEP、スタックカナリア、RELRO、FORTIFY_SOURCE、CET、MTEなどのセキュリティ保護機構を特定し回避するためのプレイブック。エクスプロイトを可能にする目的で、これらの保護を解析・バイパスする際に使用する。
description の原文を見る
>- Binary protection bypass playbook. Use when identifying and bypassing ASLR, PIE, NX/DEP, stack canary, RELRO, FORTIFY_SOURCE, CET, and MTE protections in ELF binaries to enable exploitation.
SKILL.md 本文
SKILL: Binary Protection Bypass — Expert Attack Playbook
AI LOAD INSTRUCTION: バイナリ保護の識別とバイパス技法に関する専門知識。ASLR、PIE、NX、RELRO、canary、FORTIFY_SOURCE、スタッククラッシュ、CET シャドウスタック、および ARM MTE をカバーしています。各保護には、そのバイパス方法と必要なプリミティブが対になっています。ctf-wiki の緩和セクションと実際の悪用から抽出されています。ベースモデルは、どの保護がどの攻撃をブロックするかを混同し、複数の保護の組み合わせ効果を見落とす傾向があります。
0. RELATED ROUTING
stack-overflow-and-rop— NX をバイパスするための ROP チェーン、ASLR バイパスのための ret2libcformat-string-exploitation— canary、PIE、libc アドレスをリークするための主要手法heap-exploitation— GOT が読み取り専用の場合の RELRO バイパスのためのヒープ攻撃arbitrary-write-to-rce— GOT が RELRO で保護されている場合に上書きする対象
Advanced Reference
包括的な保護 × バイパス × プリミティブ マトリックスについては、PROTECTION_BYPASS_MATRIX.md を読み込んでください。
1. PROTECTION IDENTIFICATION
$ checksec ./binary
[*] '/path/to/binary'
Arch: amd64-64-little
RELRO: Full RELRO ← GOT が読み取り専用
Stack: Canary found ← スタックカナリアが有効
NX: NX enabled ← スタックが実行不可
PIE: PIE enabled ← 位置独立コード
FORTIFY: Enabled ← 強化された libc 関数
Quick Identification Table
| 保護 | チェックコマンド | バイナリインジケータ |
|---|---|---|
| ASLR | cat /proc/sys/kernel/randomize_va_space | OS レベル (0=off、1=partial、2=full) |
| PIE | checksec または readelf -h (Type: DYN) | -pie でコンパイルされたバイナリ |
| NX | checksec または readelf -l (RWE セグメントなし) | gcc -z noexecstack (デフォルトで有効) |
| Canary | checksec または __stack_chk_fail@plt を検索 | gcc -fstack-protector-all |
| Partial RELRO | readelf -l (GNU_RELRO セグメント、.got.plt が書き込み可能) | gcc -Wl,-z,relro |
| Full RELRO | readelf -l + .got セクションが読み取り専用 | gcc -Wl,-z,relro,-z,now |
| FORTIFY | __printf_chk、__memcpy_chk など の存在 | gcc -D_FORTIFY_SOURCE=2 |
2. ASLR BYPASS
ASLR は、実行ごとにスタック、ヒープ、libc、および mmap 領域の基本アドレスをランダム化します。
| バイパス方法 | 必要なプリミティブ | 注釈 |
|---|---|---|
| 情報リーク | 任意の読み取りプリミティブ (フォーマット文字列、OOB 読み取り、UAF) | libc/スタック/ヒープアドレスをリーク → 基本を計算 |
| 部分的な上書き | 書き込みプリミティブ (長さ制限) | 最後の 1〜2 バイトを上書き (ページオフセット固定) |
| ブルートフォース (32-bit) | 再接続/再試行能力 | 約 256〜4096 回の試行 (8〜12 ビットのエントロピー) |
| Return-to-PLT | スタックオーバーフロー | PLT アドレスはバイナリ基本からの固定オフセット (PIE がない場合) |
| ret2dlresolve | スタックオーバーフロー + 書き込みプリミティブ | libc 基本を知らずに任意関数を解決 |
| フォーマット文字列リーク | フォーマット文字列脆弱性 | %N$p スタック/libc/ヒープアドレス用 |
| スタック読み取り | バイト単位 (フォークサーバー) | クラッシュオラクルを介してスタックをバイト単位で読み取り |
ASLR Entropy (x86-64 Linux)
| リージョン | エントロピー (ビット) | 位置 |
|---|---|---|
| Stack | 22 | 約 4M |
| mmap / libc | 28 | 約 256M |
| Heap (brk) | 13 | 約 8K |
| PIE バイナリ | 28 | 約 256M |
3. PIE BYPASS
PIE (Position Independent Executable) はバイナリ自体のコード/データ基本アドレスをランダム化します。
| バイパス方法 | 必要なプリミティブ | 注釈 |
|---|---|---|
| 情報リーク | スタックから戻りアドレスを読み取り | PIE base = leaked_addr - known_offset |
| 部分的な上書き | 1 バイトまたは 2 バイト書き込み | ページオフセットの最後の 12 ビットは固定 |
| フォーマット文字列リーク | フォーマット文字列脆弱性 | %N$p (N は .text 戻りアドレスを指す) |
| 相対アドレッシング | バイナリレイアウトの知識 | 相対オフセットを知っている場合、1 つのリークだけが必要 |
Partial Overwrite Details
PIE バイナリがロードされた場所: 0x555555554000 (例)
オフセット 0x1234 の関数: 0x555555555234
戻りアドレスの最後の 2 バイトを上書き: 0x?234 → 0x?XXX
不明な部分: ビット 12-15 (1 ニブル = 4 ビット = 16 の可能性)
成功率: 試行ごとに 1/16
4. NX / DEP BYPASS
NX (No-eXecute) / DEP (Data Execution Prevention) はスタック/ヒープ上のコード実行を防ぎます。
| バイパス方法 | 詳細 |
|---|---|
| ROP (Return-Oriented Programming) | ret で終わる既存コードガジェットをチェーン |
| ret2libc | libc 関数 (system、execve) を直接呼び出し |
| ret2csu | 制御された関数呼び出しのために __libc_csu_init ガジェットを使用 |
| ret2dlresolve | 動的リンカー構造を偽造して任意関数を解決 |
| SROP | 偽造されたシグナルフレームからすべてのレジスタを設定するために sigreturn を使用 |
| mprotect ROP | mprotect(addr, size, PROT_RWX) をチェーン → ページを実行可能にする → シェルコードにジャンプ |
| JIT spray | JIT 環境 (V8 など) では、JIT コンパイラを介して実行可能コードを作成 |
mprotect Chain
# スタックを実行可能にしてからシェルコードにジャンプ
rop = b'A' * offset
rop += p64(pop_rdi) + p64(stack_page) # ページアラインされたアドレス
rop += p64(pop_rsi) + p64(0x1000) # サイズ
rop += p64(pop_rdx) + p64(7) # PROT_READ|PROT_WRITE|PROT_EXEC
rop += p64(mprotect_addr)
rop += p64(shellcode_addr) # 今実行可能なスタックのシェルコードにジャンプ
5. RELRO BYPASS
| RELRO レベル | GOT ステータス | バイパス |
|---|---|---|
| No RELRO | GOT が完全に書き込み可能 | 直接 GOT 上書き |
| Partial RELRO | .got.plt が書き込み可能 (遅延バインディング) | GOT 上書きが依然として機能 |
| Full RELRO | すべての GOT エントリがロード時に解決、GOT が読み取り専用 | GOT に書き込みできない → 他の構造をターゲット |
Full RELRO Alternative Targets
| ターゲット | いつ | どのように |
|---|---|---|
__malloc_hook | glibc < 2.34 | one_gadget で上書き |
__free_hook | glibc < 2.34 | system で上書き、free("/bin/sh") をトリガー |
_IO_FILE vtable | 任意の glibc | FSOP / vtable ハイジャック |
__exit_funcs | 任意の glibc | 終了ハンドラーリストを上書き |
TLS_dtor_list | glibc ≥ 2.34 | スレッドローカルデストラクタリスト (ポインタガード必要) |
.fini_array | 書き込み可能な場合 | デストラクタ関数ポインタを上書き |
| スタック戻りアドレス | 直接スタック書き込み | ROP のための戻りアドレスを上書き |
包括的なターゲットリストについては、arbitrary-write-to-rce を参照してください。
6. CANARY BYPASS
| 方法 | 条件 | 詳細 |
|---|---|---|
| フォーマット文字列リーク | printf(user_input) | %N$p でスタックから canary を読み取り |
| ブルートフォース | fork() サーバー (canary は子で永続) | バイト単位: 256 × (canary_size-1) 回の試行 |
| スタック読み取り | 部分的な上書き / 情報リーク | canary のヌル バイトを上書き、出力経由でリーク |
| スレッド canary 上書き | オーバーフロー到達 TLS | Canary は fs:[0x28]; バッファを超えて TLS へオーバーフロー → canary を既知の値で上書き |
| Canary 相対的上書き | Canary の後だが戻りアドレスの前へのオーバーフロー | Canary をスキップ、戻りアドレスだけを上書き (レアレイアウト) |
| ヒープベース | 脆弱性がスタックではなくヒープ上 | Canary はスタックのみを保護 |
| __stack_chk_fail GOT 上書き | Partial RELRO | __stack_chk_fail@GOT を無害な関数へポイント → canary チェック成功 |
Canary Format
x86: 0x00XXXXXX (4 バイト、先頭ヌルバイト)
x86-64: 0x00XXXXXXXXXXXXXX (8 バイト、先頭ヌルバイト)
先頭の \x00 は、文字列操作が誤って canary を読み取るのを防ぎます。
7. FORTIFY_SOURCE BYPASS
_FORTIFY_SOURCE=2 はバッファサイズチェックを追加し、フォーマット文字列操作を制限します。
| 強化された関数 | 制限 | バイパス |
|---|---|---|
__printf_chk | %n (位置指定引数 %N$n の場合) が禁止 | 非位置指定 %n または %hn チェーンを使用 |
__memcpy_chk | コピー先バッファサイズがチェック | 代わりにヒープオーバーフローを使用 |
__strcpy_chk | 同上 | |
__read_chk | 読み取りサイズがバッファに対してチェック |
Format String with FORTIFY_SOURCE
# %1$n は __printf_chk によってブロック
# しかし、順序指定なし (非位置指定) %n はまだ機能する可能性:
# 正確なバイト数を出力してから %hn — 非常に正確である必要があります
# または: ROP を介してバイナリ/libc 内の強化されていない printf を検索
8. CET (Control-flow Enforcement Technology)
Intel CET は 2 つのメカニズムを追加します:
Shadow Stack
- ハードウェアによって管理される戻りアドレスのコピー
retでは、CPU はシャドウスタックが実際のスタックと一致することを確認- 不一致 →
#CPフォルト (制御保護例外)
| 影響 | 詳細 |
|---|---|
| ROP がブロック | ret で戻りアドレスの上書きが検出 |
| JOP が可能 | jmp [reg] はシャドウスタックでチェックされない |
| COP が可能 | call [reg] はシャドウスタックにプッシュされるがターゲットは IBT で検証 |
Indirect Branch Tracking (IBT)
- 間接
jmp/callはENDBR64命令にランディング必須 - 非 ENDBR ランディング →
#CPフォルト
バイパス:
- データのみ攻撃 (制御フロー変更なし)
- 有用な操作にチェーンする有効な ENDBR ガジェットを検索
- ENDBR プリフィックス付きガジェットでの JOP
- CFI スコープ外の構造をターゲット (modprobe_path、関数ポインタ配列)
9. MTE (Memory Tagging Extension, ARM)
ARM MTE はメモリポインタと割り当てに 4 ビットタグを割り当てます。タグ不一致 = フォルト。
| 側面 | 詳細 |
|---|---|
| タグビット | ポインタ内の 4 ビット (ビット 56-59) = 16 の可能なタグ |
| グラニュール | 16 バイト (各 16 バイトグラニュールには 1 つのタグ) |
| チェック | ロード/ストア: ポインタタグはメモリタグと一致する必要があります |
| 確率的 | ランダムタグ → 攻撃者が正しく推測できる確率 1/16 |
Bypass Approaches
| 方法 | 成功率 |
|---|---|
| ブルートフォース | 試行ごとに 1/16 (6.25%) |
| タグオラクル | タグを判定するサイドチャネル (タイミング、エラーメッセージ) |
| 範囲内悪用 | 同じタグ付き領域内に留まる (相対オフセット使用) |
| タグバイパスガジェット | アクセス可能な場合 LDGM/STGM 命令を使用 |
| 推測実行 | Spectre スタイルのタグチェックバイパス |
10. DECISION TREE
バイナリ分析: checksec 出力
├── NX が無効?
│ └── スタック/ヒープ上のシェルコード (最も単純なパス)
│
├── NX が有効? (標準的なモダンバイナリ)
│ ├── コード実行が必要 → ROP/ret2libc
│ │
│ ├── Canary が有効?
│ │ ├── フォークサーバー? → バイト単位のブルートフォース
│ │ ├── フォーマット文字列? → %p で canary をリーク
│ │ ├── ヒープの脆弱性? → canary はヒープを保護しない
│ │ └── Partial RELRO? → __stack_chk_fail@GOT を上書き
│ │
│ ├── PIE が有効?
│ │ ├── フォーマット文字列? → .text アドレスをリーク → PIE base
│ │ ├── 部分的な上書き → 最後の 12 ビット固定 (1/16 ブルートフォース)
│ │ └── OOB 読み取り? → コードポインタをリーク
│ │
│ ├── ASLR が有効?
│ │ ├── 情報リーク利用可能 → libc base をリーク
│ │ ├── リークなし → ret2dlresolve または SROP
│ │ ├── 32-bit? → ブルートフォース実行可能 (約 4096 回の試行)
│ │ └── Return-to-PLT (libc base の知識不要な PLT 呼び出し)
│ │
│ ├── RELRO レベル?
│ │ ├── None/Partial → GOT 上書き
│ │ └── Full → 代替ターゲット:
│ │ ├── glibc < 2.34 → __malloc_hook / __free_hook
│ │ ├── glibc ≥ 2.34 → _IO_FILE / exit_funcs / TLS_dtor_list
│ │ ├── .fini_array (書き込み可能な場合)
│ │ └── スタック戻りアドレス
│ │
│ └── FORTIFY_SOURCE?
│ ├── 位置指定 %n をブロック → 順序指定なし %n またはヒープ悪用を使用
│ └── 強化された関数のバッファオーバーフロー → 強化されていないパスを使用
│
├── CET (シャドウスタック)?
│ ├── ROP がブロック → データのみ攻撃または JOP
│ └── ENDBR ガジェットチェーン
│
└── MTE (ARM)?
├── 1/16 ブルートフォース
└── 相対破損のため範囲内に留まる
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。