ctf-pwn について
CTF の pwn 問題に取り組む人向けのバイナリ攻撃リファレンスです。簡潔な技法の概要と、ROP、ヒープ、カーネルなどの攻撃経路に関する詳細なノートをまとめています。
主な機能
- 01バイナリの初期調査と緩和策の確認
- 02ROP とシェルコードの技法
- 03ヒープとフォーマット文字列の攻撃
- 04カーネル・サンドボックス攻撃のノート
- 05任意の MCP デバッグガイド
活用シーン
- 01保護機構を確認して攻撃経路を選定
- 02問題向けの ROP チェーンを構築
- 03ヒープやフォーマット文字列の欠陥を調査
- 04Windows のクラッシュダンプや実行中の対象をデバッグ
MCP 対応
クラッシュダンプ、実行中の対象、カーネルのデバッグに使う任意の WinDbg MCP と、脆弱な関数のデコンパイルに使う IDA Pro MCP、Ghidra MCP を説明しています。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ljagiello/ ctf-skills --skill ctf-pwnインストール後、Claude Code で/ctf-pwnを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
advanced-exploits-2.mdadvanced-exploits-3.mdadvanced-exploits-4.mdadvanced-exploits-5.mdadvanced-exploits.mdadvanced.mdattack-playbook.mdfield-notes.mdformat-string.mdheap-fsop.mdheap-techniques-2.mdheap-techniques.mdkernel-bypass.mdkernel-techniques.mdkernel.mdoverflow-basics.mdpwnable-tw/3x17.mdalive_note.mdapplestore.mdbabyallocator.mdbabystack.mdbash_revenge.mdbash.mdbookwriter.mdbounty_program_a.mdbounty_program_b.mdbreak_out.mdcalc.mdcaov.mdcriticalheap_pp.md詳細
CTF バイナリ解析(Pwn)
バイナリ解析(pwn)CTF チャレンジのクイックリファレンスです。各手法をここでは一行で紹介します。詳しくは関連ファイルを参照してください。
前提条件
Python パッケージ(すべてのプラットフォーム):
pip install "pwntools==4.15.0" "ROPgadget==7.7" "ropper==1.13.13"
# or via script: bash scripts/install_ctf_tools.sh python
uv を使用する場合:
uv venv && uv pip install "pwntools==4.15.0" "ROPgadget==7.7" "ropper==1.13.13"
Linux(apt):
apt install gdb binutils strace ltrace qemu-system-x86
クロスアーキテクチャ対応(ARM/MIPS — Debian/Ubuntu、任意):
apt install qemu-user qemu-user-static gdb-multiarch binutils-multiarch libc6-armhf-cross libc6-arm64-cross libc6-mips-cross
macOS(Homebrew):
brew install gdb binutils qemu
Ruby gem(すべてのプラットフォーム):
gem install one_gadget seccomp-tools
手動インストール:
- pwndbg — Linux:GitHub、macOS:
brew install pwndbg/tap/pwndbg-gdb - checksec — pwntools に含まれています(
checksec --file=binary)
MCP サーバー(任意): Windows のクラッシュダンプ、ライブのブレークポイント駆動型エクスプロイト、カーネル/ドライバーのデバッグには WinDbg MCP(svnscha/mcp-windbg)を、脆弱な関数の逆コンパイルには IDA Pro MCP / Ghidra MCP を使用できます。詳しくは tools-mcp.md を参照してください。
追加リソース
- overflow-basics.md - スタック/グローバルバッファオーバーフロー、ret2win、カナリアの回避、フォークするサーバーでのカナリアの1バイトずつの総当たり、構造体ポインターの上書き、符号付き整数による回避、隠れたガジェット、ストライドベースのOOB読み取りリーク、チェックされていないmemcpy長によるパーサーのスタックオーバーフローと呼び出し先保存レジスターの復元
- rop-and-shellcode.md - 基本的なROPチェーン(ret2libc、システムコールROP、rdx制御、シェル操作)、ret2csu、不正文字のXOR回避、特殊なx86ガジェット(BEXTR/XLAT/STOSB/PEXT)、xchg rax,espによるスタックピボット、不正文字回避のためのsprintf()ガジェット連結、RDXをゼロ化するガジェットとしてのカナリアXORエピローグ、read()の戻り値を利用したexecveの代替としてのstub_execveatシステムコール
- rop-advanced.md - 高度なROPテクニック:leave;retによるBSSへの二重スタックピボット、UTF-8制約下でのSROP(Sigreturn-Oriented Programming)、seccomp回避、seccomp回避のためのRETFアーキテクチャ切り替え(x64→x32)、入力反転を伴うシェルコード、.fini_arrayの乗っ取り、ret2vdso、pwntoolsテンプレート、seccomp回避のためのx32 ABIシステムコールエイリアス、時間ベースのブラインドシェルコード流出
- format-string.md - フォーマット文字列の悪用(リーク、GOT上書き、ブラインドpwn、フィルター回避、カナリアリーク、__free_hook、.rela.pltのパッチ適用、.bssピボットのための保存済みEBP上書き、スタックスマッシュ情報リークのためのargv[0]上書き、複数段階の悪用のための.fini_arrayループ、連続する%pによる__printf_chk回避、単一呼び出しでのリーク+GOT上書き、入力変換を介したROT13エンコード済みフォーマット文字列の悪用)
- advanced.md - seccompの高度なテクニック、UAF、JIT、特殊なGOT、基数変換によるヒープ重複、ツリーデータ構造のスタック割り当て不足、ret2dlresolve、カーネルの悪用(基本)
- heap-techniques.md - House of Apple 2(+setcontext SUID版)、House of Einherjar、House of Orange/Spirit/Lore/Force、ヒープグルーミング、カスタムアロケーター(nginx、talloc)、古典的なunlink、musl libcヒープ(メタポインター+atexit乗っ取り)、tcache stashing unlink攻撃、unsafe unlink+top chunk統合
- heap-techniques-2.md - CTF writeupのヒープ手法:UAFによるvtableポインターエンコード済みシェル引数、未初期化チャンクに残ったポインターのリーク、tcacheでのstrcpyヌルバイトオーバーフロー+後方統合、隣接する構造体の関数ポインターオーバーフローによるlibcリーク+GOT上書き、隠しメニューからのtcache poisoning、tcache double-free+偽の_IO_FILE vtableによるstdout乗っ取り、tcacheからfastbinへの昇格を利用したクロスビン攻撃、6ビットインデックスのOOB+written_bytesアキュムレーター、callocされたチャンクでのIS_MMAPEDビット反転によるunsorted binリーク、LSBのみのヒープポインター上書きによるファイル名正規表現制約付きfastbin、カスタムアロケーターのunsafe unlinkによるGOT上書き
- heap-fsop.md - FILE構造体(_IO_FILE)の悪用:PIE+Full RELROに対するfastbin stdout vtableの2段階乗っ取り、_IO_buf_baseのヌルバイトによるstdin乗っ取り、glibc 2.24以降の_IO_FILE vtable検証回避、stdinの_IO_buf_endに対するunsorted-bin攻撃、mp_構造体を介したunsorted binの破損、realloc(ptr, 0)をfree()として利用するUAF、1バイトの参照カウンターのラップアラウンドによるUAF
- advanced-exploits.md - 高度なエクスプロイト手法(第1部):VMの符号付き比較、BF JITシェルコード、型混同、off-by-oneインデックス破損、DNSオーバーフロー、ASANシャドウメモリ、エンコード制約付きフォーマット文字列、カスタムカナリアの保持、符号付き整数による回避、カナリアを考慮した部分オーバーフロー、CSVインジェクション、MD5原像ガジェット、VM GC UAFスラブ再利用、パストラバーサルサニタイザーの回避、openat/mmap/writeによるFSOP+seccomp回避
- advanced-exploits-2.md - 高度なエクスプロイト手法(第2部):自己書き換えによるバイトコードバリデーターの回避、SQEインジェクションを伴うio_uring UAF、整数切り詰め int32->int16、GCのヌル参照による連鎖的破損、複数回のfgetsによるリークレスlibc取得とstdout FILE上書き、符号付き/符号なしcharのアンダーフローによるヒープオーバーフロー、XORキーストリームの総当たりによる書き込みプリミティブ、tcacheポインター復号によるヒープリーク、偽造チャンクサイズによるunsorted bin昇格、FSOP stdout TLSリーク、
__call_tls_dtorsによるTLSデストラクター乗っ取り、カスタムシャドウスタックポインターオーバーフロー回避、符号付きintオーバーフローによる負のOOBヒープ書き込み、XSSからバイナリーpwnへのブリッジ - advanced-exploits-4.md - 高度なエクスプロイト手法(第4部):Windows SEH上書き+pushad VirtualAlloc ROP、IAT相対解決、デタッチされたプロセスでのシェル安定化、SeDebugPrivilegeによるSYSTEM権限昇格、Thumbシェルコードを使ったARMバッファオーバーフロー、Forthインタープリターのsystemワード悪用、複数パスのtcache poisoningに対するGF(2)ガウス消去法、単一ビット反転の悪用プリミティブ(mprotect+反復的なコードパッチ)、静物を介したGame of Lifeシェルコードの進化、メニュー操作によるstrdup/free順序を利用したUAF、system()を有効な呼び出し先として使うWindows CFG回避、関数ポインターインデックスのOOBとしてのニューラルネットワーク出力、カウンターオーバーフローによるシェルコードの固有バイト数制限回避
- advanced-exploits-3.md - 高度なエクスプロイト手法(第3部):スタック変数の重複/キャリー破損によるOOB、8ビットループカウンターによる1バイトオーバーフロー、ゲームAIの算術平均によるOOB読み取り、任意読み書きとGOT上書きによるシェル取得、__environ+memcpyオーバーフローによるスタックリーク、uint16ジャンプ切り詰めによるJITサンドボックス脱出、複数の質問を使ったDNS圧縮ポインターのスタックオーバーフローとROP、プログラムヘッダー操作によるELFコード署名回避、ゲームレベル形式における座標の符号付き/符号なし不一致、O_CLOEXEC欠落によるファイルディスクリプター継承、メタデータ解析における符号拡張整数アンダーフロー、読み取り専用プリミティブを使ったROPチェーン構築、永続レジスターを利用したタイミングサイドチャネル付き4バイトシェルコード、任意読み取りを実現するCRCオラクル、UTF-8大文字小文字変換バッファーオーバーフロー
- advanced-exploits-5.md - 高度なエクスプロイト手法(第5部):データ解釈を利用した悪用 — Chip-8エミュレーターのOOBメモリによるret2libc、倍精度浮動小数点quicksortによるカナリア位置の変更、bloom filterのabs(INT_MIN)による負のインデックスOOB書き込み
- sandbox-escape.md - カスタムVMの悪用、FUSE/CUSEデバイス、busybox/制限付きシェル、シェルのトリック、process_vm_readvによるサンドボックス回避、名前付きパイプのファイルサイズ制限回避、CPUエミュレーターのprintオペコードへのPython evalインジェクション(Python jailの手法についてはctf-misc/pyjails.mdを相互参照)
- kernel.md - Linuxカーネルの悪用の基礎:環境構築、QEMUデバッグ、ヒープスプレー用構造体(tty_struct、poll_list、user_key_payload、seq_operations)、カーネルスタックオーバーフロー、カナリアリーク、権限昇格(ret2usr、カーネルROP)、modprobe_path上書き、core_pattern上書き、kmallocサイズ不一致によるヒープオーバーフロー+struct fileのf_op破損
- kernel-techniques.md - カーネルの悪用手法:tty_struct kROP(偽vtable+スタックピボット)、ioctlレジスター制御によるAAW、userfaultfdレースの安定化、SLUBアロケーター内部構造(freelistの強化/難読化)、カーネルパニックによるリーク、MADV_DONTNEEDレースウィンドウの延長(DiceCTF 2026)、クロスキャッシュCPU分割攻撃(DiceCTF 2026)、PTE重複によるファイル書き込み(DiceCTF 2026)、ファイルオープン失敗を利用したaddr_limit回避によるカーネルメモリの読み書き
- kernel-bypass.md - カーネル保護機構の回避:KASLR/FGKASLR回避(__ksymtab)、KPTI回避(swapgsトランポリン、シグナルハンドラー、ROPによるmodprobe_path/core_pattern)、SMEP/SMAP回避、GDBカーネルモジュールデバッグ、initramfs/virtio-9pワークフロー、エクスプロイトテンプレート、エクスプロイトの配布
- field-notes.md - 詳細なpwnメモ:ヒープ悪用のクイックリファレンス、追加のエクスプロイトメモ、便利なコマンド
- attack-playbook.md - Linuxユーザーランド攻撃プレイブック:入力/権限境界の調査、緩和策に応じたリーク手法の選択、プリミティブの優先順位付けワークフロー
- static-signals.md - エクスプロイト可能性の評価に役立つ静的シグナル(libcバージョン、seccompポリシー、RELRO/PIE/カナリア/NXの証拠)
- pwnable-tw/README.md - 43件のpwnable.tw writeup(orw、start、calc、hacknote、babystack、tcache_tear、death_note、dubblesort、applestore、bookwriterなど)。各課題の環境、保護機構、根本原因となる欠陥、具体的なエクスプロイトチェーンを掲載
- tools-mcp.md - pwn向けMCPサーバー統合:WinDbg MCPセッションモデル(
open_cdb_dump/open_cdb_remote/open_kd_session+session_id)、クラッシュダンプのトリアージ、ダンプ内のflag{メモリスキャン、実行中プロセスへのブレークポイント/ハードウェアウォッチポイント/メモリパッチを使った悪用、Windows緩和策チェックにおける!dh -f(checksec相当)、kdを使ったカーネルモードのトークン窃取、エクスプロイト開発向けIDA/Ghidra MCP(まず脆弱な関数をデコンパイルし、正確なガジェットバイト列を調べる場合に限ってアセンブリーを確認)
切り替えのタイミング
- バイナリの動作をまだ理解できていない場合は、悪用を試す前に
/ctf-reverseに切り替えてください。 - サービスが実際には制限付きシェル、エンコードパズル、またはサンドボックス言語の課題である場合は、
/ctf-miscに切り替えてください。 - 悪用の経路がメモリ破損よりもウェブエンドポイント、セッションのバグ、またはアップロード機能に依存する場合は、
/ctf-webに切り替えてください。 - 脆弱性を悪用する前に暗号プリミティブを破る必要がある場合は、
/ctf-cryptoに切り替えてください。
クイックスタートコマンド
# Binary analysis
checksec --file=binary
file binary
readelf -h binary
# Find gadgets
ROPgadget --binary binary | grep "pop rdi"
ropper -f binary --search "pop rdi"
one_gadget /lib/x86_64-linux-gnu/libc.so.6
# Debug
gdb -q binary -ex 'start' -ex 'checksec'
# Pattern for offset finding
python3 -c "from pwn import *; print(cyclic(200))"
python3 -c "from pwn import *; print(cyclic_find(0x61616168))"
# libc identification
./libc-database/find puts <leaked_addr_last_3_nibbles>
ソースコードで注意すべき点
- スレッド処理/
pthread→ 競合状態 usleep()/sleep()→ タイミングウィンドウ- 複数のスレッドで使われるグローバル変数 → TOCTOU
競合状態の悪用
bash -c '{ echo "cmd1"; echo "cmd2"; sleep 1; } | nc host port'
よくある脆弱性
- バッファーオーバーフロー:
gets()、scanf("%s")、strcpy() - フォーマット文字列:
printf(user_input) - 整数オーバーフロー、UAF、競合状態
エクスプロイト戦略に対する保護機能の影響
| 保護機能 | 状態 | 影響 |
|---|---|---|
| PIE | 無効 | すべてのアドレス(GOT、PLT、関数)は固定されています。直接上書きできます |
| RELRO | 部分的 | GOTへの書き込みが可能です。GOT上書き攻撃を実行できます |
| RELRO | 完全 | GOTは読み取り専用です。代替の標的(フック、vtable、リターンアドレス)が必要です |
| NX | 有効 | スタック/ヒープ上のシェルコードは実行できません。ROPまたはret2winを使用します |
| Canary | あり | スタック破壊が検出されます。リークするか、スタックオーバーフローを避ける(ヒープを使用する)必要があります |
クイック判断フロー:
- 部分RELRO + PIEなし → GOT上書き(最も簡単です。固定アドレスを使用します)
- 完全RELRO →
__free_hook、__malloc_hook(glibc < 2.34)、またはリターンアドレスを標的にします - スタックカナリアあり → ヒープベースの攻撃を優先するか、先にカナリアをリークします
スタックバッファーオーバーフロー
- オフセットを特定します:
cyclic 200の後にcyclic -l <value> - 保護機能を確認します:
checksec --file=binary - PIEなし + カナリアなし = 直接ROP
- フォーマット文字列または部分上書きでカナリアをリークします
- forkするサーバーではカナリアをバイト単位で総当たりします(最大7*256回の試行)
マジック値を使ったret2win: オーバーフロー → ret(アラインメント) → pop rdi; ret → マジック値 → win()。 スタックアラインメント: movapsでSIGSEGVが発生する場合は、retガジェットをもう1つ追加します。 オフセット: バッファーはrbp - N、リターンアドレスはrbp + 8にあり、合計はN + 8です。 入力フィルタリング: ペイロードにmemmem()で禁止された文字列が含まれないようにします。 ガジェット: ROPgadget --binary binary | grep "pop rdi"を使うか、pwntoolsのROP()でCMPの即値に隠れたガジェットを探します。エクスプロイトコード全体はoverflow-basics.mdを参照してください。
パーサーのスタックオーバーフロー(未チェックのmemcpy)
パターン: カスタムファイルパーサー(PCAP、画像、アーカイブ)が固定サイズのスタックバッファーを確保する一方、入力レコードはそれを超えることができます。長さを検証する前にmemcpyでコピーするため、保存レジスターとリターンアドレスがオーバーフローします。呼び出し元保存レジスターを復元する必要があります。rbxには読み取り可能なメモリ(BSS)を設定し、ループカウンターには終了値を設定してから、retガジェットとwin関数を実行します。詳細はoverflow-basics.mdを参照してください。
構造体ポインターの上書き(ヒープメニュー課題)
パターン: データバッファーとポインターを持つ構造体に対するメニュー形式の作成/変更/削除機能です。名前をオーバーフローさせてポインターフィールドにGOTアドレスを書き込み、その後、変更機能でwinアドレスを書き込みます。エクスプロイト全体とGOT標的の選択表についてはoverflow-basics.mdを参照してください。
符号付き整数のバイパス
パターン: 符号チェックなしでscanf("%d")を使用しています。数量に価格を掛けると負の合計になり、残高チェックを回避できます。overflow-basics.mdを参照してください。
カナリアを考慮した部分オーバーフロー
パターン: バッファーとカナリアの間にあるvalidフラグをオーバーフローさせます。長さを正確に調整するパディングには、何もしないパスとして./を使用します。エクスプロイトチェーン全体についてはoverflow-basics.mdとadvanced.mdを参照してください。
グローバルバッファーオーバーフロー(CSVインジェクション)
パターン: 隣接するグローバル変数があり、余分なCSV区切り文字でオーバーフローさせると、ファイル名ポインターが変更されます。エクスプロイト全体についてはoverflow-basics.mdとadvanced.mdを参照してください。
ROP チェーンの構築
puts@PLT(puts@GOT) で libc をリークし、vuln に戻って、第 2 段階で system("/bin/sh") を実行します。2 段階の ret2libc パターン、リークの解析、戻り先の選択については、rop-and-shellcode.md を参照してください。
DynELF による libc の特定: pwntools.DynELF(leak_func, pointer_in_libc) は、libc のバージョンを知らなくても、リモートで libc のシンボルを解決します。rop-and-shellcode.md を参照してください。
小さなバッファでの制約付きシェルコード: バッファが小さすぎる場合は、read() を使うシェルコードのスタブ(20 バイト未満)で、第 2 段階のシェルコード全体を読み込みます。rop-and-shellcode.md を参照してください。
生のシステムコールによる ROP: system()/execve() がクラッシュする場合(CET/IBT)、libc の pop rax; ret と syscall; ret を使用します。rop-and-shellcode.md を参照してください。
ret2csu: __libc_csu_init のガジェットで rdx、rsi、edi を制御し、任意の GOT 関数を呼び出せます。libc のガジェットを使わずに、任意の 3 引数関数を呼び出せます。rop-and-shellcode.md を参照してください。
XOR による不正な文字の回避: .data に書き込む前にペイロードのデータをキーで XOR し、ROP ガジェットを使ってその場で XOR を元に戻します。ヌルバイト、改行、その他のフィルター対象文字を回避できます。rop-and-shellcode.md を参照してください。
特殊なガジェット(BEXTR/XLAT/STOSB/PEXT): 標準的な mov 書き込みガジェットが使えない場合は、一般に知られていない x86 命令を連結し、メモリに 1 バイトずつ書き込みます。rop-and-shellcode.md を参照してください。
スタックピボット(xchg rax,esp): オーバーフロー領域が ROP チェーン全体を格納するには小さすぎる場合、スタックポインターを攻撃者が制御するヒープ/バッファに切り替えます。事前に pop rax; ret でピボット先のアドレスを読み込む必要があります。rop-and-shellcode.md を参照してください。
rdx の制御: puts() の後、rdx は 1 で上書きされます。libc の pop rdx; pop rbx; ret を使用するか、バイナリの read セットアップに再度入り、スタックピボットを実行します。rop-and-shellcode.md を参照してください。
rdx をゼロにするガジェットとしてのカナリー XOR エピローグ: pop rdx; ret がない場合は、カナリーチェックのエピローグ xor rdx, fs:28h にジャンプします。カナリーが無傷であれば、RDX をゼロにします。rop-and-shellcode.md を参照してください。
execve の代替としての stub_execveat: pop rax; ret がない場合は、execve の代わりに stub_execveat(システムコール 322/0x142)を使います。read() の戻り値で rax を設定するため、正確に 0x142 バイト送信してください。rop-and-shellcode.md を参照してください。
シェルとのやり取り: execve の後に sleep(1) を実行し、sendline(b'cat /flag*') を送信します。rop-and-shellcode.md を参照してください。
入力変換を経由したフォーマット文字列
ROT13 でエンコードされたフォーマット文字列: 入力が printf に渡される前に ROT13/シーザー変換される場合は、逆変換でフォーマット文字列のペイロードを事前にエンコードし、変換後に元の状態で届くようにします。format-string.md を参照してください。
カーネルのエクスプロイト
ファイルオープン失敗を利用した addr_limit の回避: カーネルモジュールが addr_limit = KERNEL_DS を設定し、エラー処理経路で元に戻さない場合は、エラーを強制します(例:対象ファイルをディレクトリにする)。これにより、ユーザー空間からの read()/write() でカーネルメモリにアクセスできる状態を維持できます。kernel-techniques.md を参照してください。
サンドボックスとエミュレーターからの脱出
CPU エミュレーターの eval インジェクション: エミュレーターの print 命令がエスケープシーケンスの処理に eval('"' + buf + '"') を使う場合、ADD 命令でエミュレーターのメモリ上に "+__import__("os").system("cmd")# を組み立てます。文字列から脱出し、Python を実行できます。sandbox-escape.md を参照してください。
高度なエクスプロイト手法
ニューラルネットワークの関数ポインター OOB: バイナリが境界チェックを行わず、NN の出力を関数ポインター配列のインデックスとして使用する場合、重みやバイアスを再学習させて範囲外のインデックスを生成し、バイアス配列からターゲットアドレスを読み取らせます。詳しくは advanced-exploits-4.md を参照してください。
カウンターオーバーフローによるシェルコードのユニークバイト数制限の回避: シェルコードのユニークバイト数が N 個に制限されている場合、スタックをスプレーして seen[256] カウンターを破壊し、その後 main を再実行(memset をスキップ)すると、オーバーフローしたカウンターによって 2 回目の実行で任意のバイトを使用できるようになります。詳しくは advanced-exploits-4.md を参照してください。
詳細な調査メモ
チャレンジが本当にエクスプロイトを多用する内容であることを確認したら、field-notes.md を参照してください。
- ヒープとアロケーターに関するメモ:House of Apple、tcache、unsafe unlink、talloc、UAF、FSOP
- 高度なエクスプロイトに関するメモ:seccomp の回避、ret2vdso、io_uring、整数の切り詰め、ASAN、タイミングオラクル
- サンドボックスとハイブリッドに関するメモ:pyjail のクロスオーバー、busybox のエスケープ、カスタム VM、シェルのトリック、パスのサニタイザー
- カーネルと Windows に関するメモ:カーネル攻略手順、SEH、CFG の回避、権限昇格
- 歴史的な事例メモ:古いものの、今でも再利用できる CTF のエクスプロイトパターン