Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
5分でわかるPage-Fault Weird Machine
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Arata
March 21, 2026
1
110
5分でわかるPage-Fault Weird Machine
Arata
March 21, 2026
Tweet
Share
More Decks by Arata
See All by Arata
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
9
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
100
eBPFを使った動的解析手法
arata_nvm
1
690
カーネルハック実験の振り返り
arata_nvm
1
44
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
41
コードエディターのシンタックスハイライトの話
arata_nvm
0
190
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
86
TableGenの言語サーバーをつくる
arata_nvm
0
600
pwn入門 / introduction to pwn
arata_nvm
1
2.6k
Featured
See All Featured
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
200
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
240
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
140
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Visualization
eitanlees
150
17k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
500
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
320
Mind Mapping
helmedeiros
PRO
1
130
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
It's Worth the Effort
3n
188
29k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
330
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.1k
Transcript
5分でわかる Page-Fault Weird Machine 2026/03/21 情報科学若手の会・セキュリティ若手の会 春の陣2026 @Arata
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata x86のページフォルトの仕組みを悪用して、 CPU命令を1つも実行せずに計算を行う手法 元論文: Bangert
et al. "The Page-Fault Weird Machine: Lessons in Instruction-less Computation" (WOOT'13) Page-Fault Weird Machineとは 2
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • ページフォルトでmovdbz命令を構成する方法を理解する ◦ movdbz命令1つでチューリング完全
目標 3
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata movdbz dst, src, label_zero,
label_nonzero 意味: • srcをデクリメントしてdstに書き込み、 ◦ dst > 0 ならば label_nonzeroにジャンプする ◦ dst = 0 ならば label_zeroにジャンプする • 要するにデクリメントと分岐ができる movdbz命令 4
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • x86ではページテーブルを使って仮想アドレスを物理アド レスに割り当てる •
割り当てられていない仮想アドレスにアクセスすると、 ページフォルトという例外が発生する x86速習(1/3): ページフォルト 5 割り当て済み 未割り当て OK ページフォルト
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • 例外が起きるとCPUは例外ハンドラを呼び出す • x86ではハンドラとしてタスクスイッチを行える
• 例 ◦ #PF (ページフォルト)発生 → タスクAに切り替え ◦ #DF (ダブルフォルト)発生 → タスクBに切り替え x86速習(2/3): 例外ハンドラ 6
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • レジスタの値を入れ替える機能 • タスク毎のTSSを用意して保存・復元
タスクスイッチ時の動作 1. レジスタを今のタスクのTSSに保存 2. 次のタスクのTSSからレジスタを復元 x86速習(3/3): タスクスイッチ 7 TSS
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • movdbz1命令ごとにタスクと例外ハンドラを用意 • ページフォルトをトリガとしたタスクスイッチを繰り返
して計算を進める • ESPを(movdbzの世界の)レジスタとして用いる movdbz命令の構成 8 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata Q1. ページフォルトを発生させる方法 Q2. デクリメントの実現方法
Q3. 分岐の実現方法 movdbz命令の構成 9 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata Q1. ページフォルトを発生させる方法 Q2. デクリメントの実現方法
Q3. 分岐の実現方法 movdbz命令の構成 10 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata タスクのEIP(命令ポインタ)を未割り当てのアドレスに設 定しておく → タスクスイッチ直後にEIPを読んで命令をフェッチ
→ 未割り当てなのでフェッチできない → ページフォルトが発生 タスクスイッチ直後にページフォルトを起こせる movdbz命令の構成: ページフォルト 11
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata ✅ Q1. ページフォルトを発生させる方法 Q2.
デクリメントの実現方法 Q3. 分岐の実現方法 movdbz命令の構成 12 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata ページフォルトでerror codeがスタックにプッシュされる → ESP(スタックポインタ)が4減算される
ページフォルトでESPを4減算できる=デクリメント movdbz命令の構成: デクリメント 13
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata ✅ Q1. ページフォルトを発生させる方法 ✅
Q2. デクリメントの実現方法 Q3. 分岐の実現方法 movdbz命令の構成 14 タスクA タスクB #PF / #DF #PF / #DF タスクC #PF / #DF movdbz movdbz movdbz
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata #PF時にESP=0だとダブルフォルトが発生することを利用 • ESP >
0の場合 ◦ ESP -= 4 ◦ ページフォルト発生 • ESP = 0の場合 ◦ ESP -= 4 → オーバーフローするので実行できない! ◦ ダブルフォルト発生 ESP>0かどうかで#PF,#DFどちらかのハンドラが実行される ref: https://hikalium.github.io/opv86/sdmparser/pdf/325383-sdm-vol-2abcd.pdf#page=1253 movdbz命令の構成: 分岐 15
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • タスク1にスイッチ ◦ EIPが未割り当てアドレスなのでページフォルト発生
◦ error codeをスタックにプッシュしようとする(分岐) ▪ ESPが0より大きい • プッシュに成功する(デクリメント) • #PFのハンドラ実行 • タスク2にスイッチ ▪ ESPが0と等しい • プッシュに失敗する • #DFのハンドラ実行 • タスク3にスイッチ movdbz命令の構成: まとめると 16
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata tkbctf5でPage-Fault Weird Machineを題材にした Reversing問題を作りました
解いてみてください! https://alpacahack.com/challenges/classic おわりに 17
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • IDTの変更には通常lidt命令の実行が必要 ◦ 一方で、もちろん命令は実行したくない
• TSSのCR3でページテーブルを切り替えられることを利用 • 各タスクのページテーブルで、IDTを0x40000にマップす るよう設定 • タスクスイッチでCR3が切り替わり、自動でそのタスク に対応するIDTが参照される 付録: タスクごとにIDTを切り替える方法 18
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • タスクスイッチでタスクにbusy flagが立ち、そのタスク にスイッチできなくなる
• TSSのEAXと、GDT descriptorを同じ物理アドレスに マップするよう設定しておく ◦ また、EAXをbusy flagなしのdescriptorの値に設定しておく ◦ これでレジスタの保存でbusy flagがクリアされるようになる • 1つのタスクはbusy flagが立っているので、TSSをマップ するスロットが最低3つは必要になる 付録: TSSのbusy flagの回避 19
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • タスクスイッチでESPの値も保存・復帰されてしまうた め、複数タスクでESPを共有できない •
TSSをページ境界を跨ぐように配置し、ESP以前と以降を 別のページにマップする • これでESPを特定の物理アドレスにマップできるので、同 じ物理アドレスにマップするよう設定すれば複数のタス クでESPを共有できる 付録: 複数のタスクでESPを共有する方法 20
2026/03/21 5分でわかるPage-Fault Weird Machine | Arata • https://www.usenix.org/system/files/conference/wo ot13/woot13-bangert.pdf •
https://github.com/kristerw/instless_comp ◦ https://kristerw.blogspot.com/2015/08/instruction-less-c omputation.html ◦ https://kristerw.blogspot.com/2015/08/instruction-less-c omputation-technical.html • https://github.com/jbangert/trapcc 参考文献 21