PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。

【保護機構と回避編】Canary・PIE・ASLR・RELROの戦い方|CTF思考フレームワーク #65

【保護機構と回避編】Canary・PIE・ASLR・RELROの戦い方|CTF思考フレームワーク #65 アイキャッチ画像
安全に生きたい編集部

広告・PRを含みます。この記事にはアフィリエイトリンクが含まれます。掲載内容は編集方針に基づいて作成していますが、価格・在庫・キャンペーン内容はリンク先で最新情報を確認してください。

Canary・PIE・ASLR・RELRO……保護機構って、結局どれが何を守るの?🛡️

全部、Pwn攻撃を阻む層。Canary はスタックBoFを検知、PIE はアドレスを毎回ランダム化、ASLR は同様にヒープ/ライブラリのアドレスをランダム化、RELRO は GOT を読み取り専用化。これらの組み合わせで攻撃難易度が上がります。

Pwn 攻撃を防ぐ保護機構(Mitigation)。Stack Canary、NX/DEP(実行禁止)、ASLR(アドレス空間配置ランダム化)、PIE(位置独立実行)、RELRO(再配置のみ読み取り専用化)、CFI(Control Flow Integrity)――現代のバイナリは複数層で守られており、攻撃者は1層ずつ突破していく必要があります。

Pwn って攻撃と防御のいたちごっこなんだね…

この記事は、CTF思考フレームワーク第65回。Pwn保護機構(Canary・NX・ASLR・PIE・RELRO・CFI)の仕組みと、それぞれを回避する攻撃テクニック、checksec での確認方法を整理します。

📖 この記事はシリーズの一部です
CTF思考フレームワーク#65 / 全86記事 → シリーズ一覧を見る →

🛡️ 現代のバイナリは多層防御。Canary、PIE、RELRO、CET、Shadow Stack。攻撃者にとっては「leakをどう確保するか」「mitigationのどれを迂回するか」のメタゲームになります。

Pwnerの腕前が試されるのは、ひとつの脆弱性から「leak→計算→exploit」をどれだけ短い経路で組めるか。各mitigationの仕組みと、対応する迂回テクをセットで覚えるのが効率的。

難易度:★★★(上級)

Canary・PIE・ASLR・RELROの戦い方を整理します🛡️

現代の保護機構はCanary・NX・ASLR・PIE・RELROの5要素。攻略は「どれを破るか」の選択🛡️

この記事で出てくる言葉

先に意味を押さえておくと読みやすい用語です。

  • CTF: セキュリティの練習問題を解く競技。必ず許可された環境だけで試します。
  • RCE: 離れた場所から相手のサーバーや端末で命令を実行できる状態です。
  • Pwn: バイナリの不備を突いてプログラムの制御を奪うCTF分野です。
  • ROP: 既存コードの断片をつなぎ、攻撃用の処理を作る高度な手法です。
  • ヒープ: プログラムが実行中に動的に使うメモリ領域です。
  • スタック: 関数呼び出しや一時データを積み上げて管理するメモリ領域です。

👀 観察フェーズ:まず何を見る?

checksec --file ./progどの保護が有効か一目瞭然🔍

checksecで全mitigation状態を確認。Canary・NX・PIE・RELRO・FORTIFY・CET。各々が何をする防御で、どこに弱点があるかを把握。

  • Canary:関数末尾でcanary値を比較
  • NX:スタック・ヒープが実行不可
  • PIE:実行ファイルアドレスがランダム
  • RELRO(Partial / Full):GOT書込制限
  • FORTIFY_SOURCE:危険関数の安全側ラッパ
  • CET(IBT+Shadow Stack):return / indirect call検証

組み合わせの強さ: Full RELRO + PIE + Canary + NXが現代標準。これでも完全防御ではない👀

カナリアって「炭鉱のカナリア」から名前が来てるんだね💡

🤔 仮説フェーズ:攻撃者は何を考える?

保護機構の特性4要素。

🕶️ 攻撃者は「leakの取り方」を最優先で考えます。Canaryバイト漏洩(printfの%s)、PIEはアドレスleakで一気に解決、Full RELROは__free_hook等のhook書き換えに切り替え、CETは endbr64 ありgadgetを選ぶ。

🐦 仮説①:Stack Canary

リターンアドレス前に乱数ガード。BoF時に検証で異常検出→__stack_chk_fail

🚫 仮説②:NX (No-eXecute)

スタック・heap領域を実行不可に。シェルコード直撃を防ぐ。

🎲 仮説③:ASLR + PIE

アドレス毎回ランダム。leakなしではROPもret2libcも不能。

🔐 仮説④:RELRO

GOT書換・dynamic領域改ざんを防ぐ。Full RELROでGOT読取専用

保護は「組合せでこそ強い」。1つ抜かれても他で支える設計💡

🔬 検証フェーズ:どうやって確かめる?

攻略はleak→ASLR突破→Canary回避→ROP→RCEのフルコース。pwntoolsのprocess()/ELF()/ROP()でほぼ自動化🧪

保護機構ごとの典型迂回経路を頭に入れる。Canaryは漏洩 → 再現、PIEはleak → ベース計算、Full RELROはhookやFSOPに転換、CETは合法エントリ(endbr64)gadgetのみ採用。

# Canary leak(printf %sで隣接スタック)
# canaryは下位1バイトがx00で固定
# 1バイトずつbruteforce or 漏洩で取得

# PIE leak(puts(GOT[puts])でlibc base、続いて.text base)
# x000-fffの下位3桁が固定で上位だけランダム

# Full RELRO下:__free_hook / __malloc_hookに書き込み(glibc<2.34)
# またはFSOP(File Stream Oriented Programming)

leakはformat stringかoff-by-oneで取るのが定番だね💡

⚔️ 攻撃フェーズ:実際の手口

保護を破る代表3パターン。

迂回テクの代表:①Canary leak+再現、②PIE base leakでgadget再計算、③Full RELRO下はlibc側hook書き換え、④CETは endbr64 ありgadgetのみ使用してret2libc、⑤FSOP(_IO_FILE構造を悪用)。

# 一般的なexploitテンプレ(Full mitigations)
from pwn import *
p = process('./chall')

# 1) canary漏洩
p.send(b'A' * 56)
p.recvuntil(b'A' * 56)
canary = u64(b'x00' + p.recv(7))

# 2) PIE base leak(puts(GOT[puts]))
# ROP gadget使ってleak

# 3) libc base 計算
libc.address = leak - libc.symbols['puts']

# 4) 本ROP(system + /bin/sh)

Linux 6.x以降のCETサポート進展で、近未来のCTFは endbr64 制約下のROPが主流になりつつあります。CFI Bypass論文の追跡が地味に重要📚

① Canary leak via FSB

%pでcanary値を取得→canary込みでstack BoFを成立。

② libc leak via PLT/GOT

puts(puts@got)などでlibc内アドレス漏洩→ASLRオフセット計算。

③ Partial overwrite

下位ビットだけ書き換えて同関数内のジャンプを狙う。PIEがあっても下位は固定なので有効。

🛡️ 防御フェーズ:どう守る?

保護機構を最大限活かす3点。

守備側はmitigationを全部入りにし、CIで自動チェック。さらに secrets.toml等で脆弱関数禁止、Rust移行、fuzzing継続。

  • コンパイラフラグ全有効:-fstack-protector-strong -D_FORTIFY_SOURCE=2 -fpie -pie -Wl,-z,now,-z,relro -fcf-protection=full
  • CIで checksec --fileを実行し全mitigation確認
  • Hardened mallocまたはscudo採用
  • KASLR / KPTI(カーネル側)
  • メモリ安全言語(Rust / Swift等)
  • fuzzer継続実行(OSS-Fuzz相当)
✅ ビルドオプション統一

-fstack-protector-strong -fPIE -pie -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now標準化

🛡️ CETやShadow Stack(HW)

Intel CET / ARM PAC等のHW支援でROP/JOPを根絶に近づける。

🔒 Sandbox+最小権限

突破前提でプロセス分離・seccompでダメージを限定。

「多層防御+ハードウェア支援」が現代Pwn対策の本流💪

🧪 pwn検証用のLinuxラボ

Pwnやエクスプロイトの練習は、必ず自分の検証環境で。💻 ConoHa VPSならLinuxをワンクリックで立てて、gdb-pedaやpwntoolsを仕込んでそのままトレーニングできます。

PR / 広告

ConoHa VPS

※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。

⚠️ よくある落とし穴

  1. Canaryを「ランダムだから無理」と諦め、漏洩経路を探さない
  2. PIE leak経路を検討せず固定アドレスを使う
  3. Full RELROでGOT書き換え不可なのに古いexploitテンプレを使う
  4. CET有効環境で endbr64 なしgadgetを使い不発
  5. mitigationを「コンパイラのデフォルト任せ」にして抜け
  6. 本番でASLR無効化(ulimit -s unlimited等)して攻撃面拡大

🧰 ツール早見表

ツール用途備考
checksecmitigation確認pwntools同梱版が便利
ROPgadget / roppergadget抽出--filterで endbr64 検索
pwntoolsexploit骨格leak/canary/ROP定型
gdb + pwndbgデバッグmitigationごとの挙動観察
CodeQL / Semgrep静的解析危険関数検出

🎓 本気で学びたい人へ

ローレベルやOSレベルの許可を、仕事として深く学びたい方へ。🎓 ササエルはインフラとセキュリティの両方を学べるスクールです。

PR / 広告

ササエル

📚 もっと深く学びたい人へ

実際に手を動かして攻撃手法を体で覚えたいなら『7日間でハッキングをはじめる本 TryHackMe』がおすすめ📚

📚 次に読みたい

✍️ 学んだことを発信する

検証ノートをブログで公開したい方は、高速で安価なConoHa WINGが使いやすいです。

PR / 広告

ConoHa WING

⚖️ 大事なお約束

必ず守ってね

この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝

この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏

記事URLをコピーしました