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
Arata
March 21, 2026
420
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
5分でわかるPage-Fault Weird Machine
Arata
March 21, 2026
More Decks by Arata
See All by Arata
Black Hat USA 2026の面白かった発表を紹介
arata_nvm
1
6
Operating Systems: Three Easy Pieces, Chapter 49 / Sun's Network File System (NFS)
arata_nvm
0
15
デコンパイラ研究調査
arata_nvm
1
32
コンパイラ基盤を支える言語たち
arata_nvm
1
110
LLVMのDSL”TableGen”向け言語サーバーの開発
arata_nvm
0
36
eBPFを用いたAndroid向けデバッガ「eDBG」のx86_64 Linuxへの移植
arata_nvm
0
26
Pythonのcopy-and-patch JITの実装を読む
arata_nvm
0
160
eBPFを使った動的解析手法
arata_nvm
1
820
カーネルハック実験の振り返り
arata_nvm
1
66
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Into the Great Unknown - MozCon
thekraken
41
2.7k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
560
Abbi's Birthday
coloredviolet
3
9.4k
Faster Mobile Websites
deanohume
310
32k
Rails Girls Zürich Keynote
gr2m
96
14k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
280
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Unsuck your backbone
ammeep
672
58k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
220
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
310
Game over? The fight for quality and originality in the time of robots
wayneb77
1
250
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