【保護機構と回避編】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検証

カナリアって「炭鉱のカナリア」から名前が来てるんだね💡
🤔 仮説フェーズ:攻撃者は何を考える?

保護機構の特性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論文の追跡が地味に重要📚
%pでcanary値を取得→canary込みでstack BoFを成立。
puts(puts@got)などでlibc内アドレス漏洩→ASLRオフセット計算。
下位ビットだけ書き換えて同関数内のジャンプを狙う。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を標準化。
Intel CET / ARM PAC等のHW支援でROP/JOPを根絶に近づける。
突破前提でプロセス分離・seccompでダメージを限定。

「多層防御+ハードウェア支援」が現代Pwn対策の本流💪
🧪 pwn検証用のLinuxラボ
Pwnやエクスプロイトの練習は、必ず自分の検証環境で。💻 ConoHa VPSならLinuxをワンクリックで立てて、gdb-pedaやpwntoolsを仕込んでそのままトレーニングできます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
- Canaryを「ランダムだから無理」と諦め、漏洩経路を探さない
- PIE leak経路を検討せず固定アドレスを使う
- Full RELROでGOT書き換え不可なのに古いexploitテンプレを使う
- CET有効環境で endbr64 なしgadgetを使い不発
- mitigationを「コンパイラのデフォルト任せ」にして抜け
- 本番でASLR無効化(ulimit -s unlimited等)して攻撃面拡大
🧰 ツール早見表
| ツール | 用途 | 備考 |
|---|---|---|
| checksec | mitigation確認 | pwntools同梱版が便利 |
| ROPgadget / ropper | gadget抽出 | --filterで endbr64 検索 |
| pwntools | exploit骨格 | leak/canary/ROP定型 |
| gdb + pwndbg | デバッグ | mitigationごとの挙動観察 |
| CodeQL / Semgrep | 静的解析 | 危険関数検出 |
🎓 本気で学びたい人へ
ローレベルやOSレベルの許可を、仕事として深く学びたい方へ。🎓 ササエルはインフラとセキュリティの両方を学べるスクールです。
📚 もっと深く学びたい人へ
実際に手を動かして攻撃手法を体で覚えたいなら『7日間でハッキングをはじめる本 TryHackMe』がおすすめ📚
📚 次に読みたい
✍️ 学んだことを発信する
検証ノートをブログで公開したい方は、高速で安価なConoHa WINGが使いやすいです。
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝
この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏



