Slide 1

Slide 1 text

(C) K_atc 2018 All Rights Reserved Girls Meets Symbolic Execution Assertion 2. Automated Exploit Generation Tomori Nao (@K_atc)

Slide 2

Slide 2 text

Girls Meets Symbolic Execution (2) by @K_atc 著者 友利奈緒( @K_atc @K-atc) 今春からセキュリティエンジニア。 これは趣味でやってる研究の一環。 趣味は、バイナリ、CTF、イラスト、デザインと多岐にわたる。 イラスト K_atc イラスト歴6年。著者と同一人物。 TomoriNaoの同人誌のイラストを担当。 https://www.pixiv.net/member.php?id=4440209 2 プロフィール

Slide 3

Slide 3 text

Girls Meets Symbolic Execution (2) by @K_atc 3 前回(Assertion 1)はこちら

Slide 4

Slide 4 text

Girls Meets Symbolic Execution (2) by @K_atc 4 皆さんは道から外れるのが好きですか? execve (‘/bin/sh’, 0, 0) … 正規の実行パス 攻撃 (エクスプロイト) … 任意コード実行

Slide 5

Slide 5 text

Girls Meets Symbolic Execution (2) by @K_atc エクスプロイト自動生成――その甘美な響きに二人 の女の子が酔いしれていた。 葵は考えた。ファジングがうまくいけば、脆弱な箇 所が判明する、と。 双葉は考えた。シンボリック実行が、その脆弱性を 利用したエクスプロイトを自動化する、と。 ――折しも、浮かれる二人の背後に黒い影がとうと 迫る。 5 あらすじ

Slide 6

Slide 6 text

Girls Meets Symbolic Execution (2) by @K_atc メインヒロイン 二木 双葉(ふたき ふたば) 高校2年生。17歳。 部屋着のレパートリーが多いらしい。 好きな食べ物:シュークリーム 好きな言葉:バイナリおいしい 6 登場人物紹介 ヒロイン 紗山 葵(さやま あおい) 大学2年生。19歳。 猫のフード付きの部屋着を愛用。 好きな食べ物:寿司 好きな言葉:身から出たわさび

Slide 7

Slide 7 text

Girls Meets Symbolic Execution (2) by @K_atc ☺イントロ ☺Day 1 無能エクスプロイト ☺Day 2 めげない葵と気まぐれファザー ☺Day 3 双葉とシンボリック実行、今すぐエクスプロイト ☺デモ/まとめ ☺双葉ちゃんからの宿題 7 目次

Slide 8

Slide 8 text

イントロ • シンボリック実行とは • エクスプロイトとは 8

Slide 9

Slide 9 text

Girls Meets Symbolic Execution (2) by @K_atc シンボリック実行は、入力をシンボル化して実行することをいう。 シンボルとは数学でいう変数に相当し、一定の値に固定されない。 シンボリック実行では、レジスタ、スタック、メモリ、ファイル等、 実行環境がシンボル化される。 9 シンボリック実行とは シンボル変数生成 逐次命令解釈 セマンティック構築 制約導出 実行パス選択 求解 次スライドから例示 図 Forward Symbolic Execution(FSE)における実行フロー (FSEはシンボリック実行でよく採用される実行方式)

Slide 10

Slide 10 text

void testme(int a, int b) { int c = 0; if (a * b == 6) { c = 1; if (a == 1) c = 3; } assert(a * b * c == 6); } Girls Meets Symbolic Execution (2) by @K_atc シンボリック実行で下図の実行木*を作る過程を追う ノードは、次の命令、メモリー、パス制約** の3つ組 10 実行木によるシンボリック実行の例 (o) (2. c = 0, {a ↦ α, b ↦ β}, true) (4. c = 1, {a ↦ α, b ↦ β, c ↦ 0}, α × β = 6) (7. assert, {a ↦ α, b ↦ β, c ↦ 0}, α × β ≠ 6) assert: fail (unsat) (5. c = 3, {a↦α, b↦β, c↦1}, α × β = 6 ∧ α = 1) (7. assert, {a↦α, b↦β, c↦1}, α × β = 6 ∧ α ≠ 1) (7. assert, {a↦α, b↦β, c↦3}, α × β = 6 ∧ α = 1) assert: pass (α = 1, β = 2) assert: pass (α = 2, β = 3) assert is assert(a * b * c == 6) (a) (b) (c) if-true if-false if-true if-false *実行木 シンボリック実行を説明するための仮想的な木 **パス制約 当該パスが実行されるためのシンボル変数に対する制約 ▼実行対象

Slide 11

Slide 11 text

Girls Meets Symbolic Execution (2) by @K_atc 1. 引数a, bをα, βでシンボル化 2. PCが指す命令は 必ず実行されるので、 パス制約は true 11 Step 1. 入力をシンボル化(Symbolize) (o) (2. c = 0, {a ↦ α, b ↦ β}, true) ↦ α, b ↦ β, c ↦ 0}, α × β = 6) (7. assert, {a ↦ α, b ↦ β, c ↦ 0}, α × β assert: fail α × β = 6 ∧ α = 1) (7. assert, {a↦α, b↦β, c↦1}, α × β = 6 ∧ α ≠ 1) (b) (c) if-true if-false if-true if-false void testme(int a, int b) { int c = 0; if (a * b == 6) { c = 1; if (a == 1) c = 3; } assert(a * b * c == 6); } PC (次の命令)

Slide 12

Slide 12 text

Girls Meets Symbolic Execution (2) by @K_atc 1. 分岐命令に対しては、 ジャンプ有無に分けて 実行を分岐する 12 Step 2. 分岐 (o) (2. c = 0, {a ↦ α, b ↦ β}, true) ↦ α, b ↦ β, c ↦ 0}, α × β = 6) (7. assert, {a ↦ α, b ↦ β, c ↦ 0}, α × β assert: fail α × β = 6 ∧ α = 1) (7. assert, {a↦α, b↦β, c↦1}, α × β = 6 ∧ α ≠ 1) (b) (c) if-true if-false if-true if-false void testme(int a, int b) { int c = 0; if (a * b == 6) { c = 1; if (a == 1) c = 3; } assert(a * b * c == 6); }

Slide 13

Slide 13 text

Girls Meets Symbolic Execution (2) by @K_atc 1. cの値は0に更新済み《代入》 2. 今はthen節に入り、 パス制約を更新する 13 Step 3. セマンティック構築&パス制約導出 (o) (2. c = 0, {a ↦ α, b ↦ β}, tr (4. c = 1, {a ↦ α, b ↦ β, c ↦ 0}, α × β = 6) (7. asser (5. c = 3, {a↦α, b↦β, c↦1}, α × β = 6 ∧ α = 1) (7. assert, {a↦α, b↦ (a) if-true if-true if-false void testme(int a, int b) { int c = 0; if (a * b == 6) { c = 1; if (a == 1) c = 3; } assert(a * b * c == 6); }

Slide 14

Slide 14 text

(o) (2. c = 0, {a ↦ α, b ↦ β}, true) ↦ β, c ↦ 0}, α × β = 6) (7. assert, {a ↦ α, b ↦ β, c ↦ 0}, α × β ≠ 6) assert: fail (unsa = 6 ∧ α = 1) (7. assert, {a↦α, b↦β, c↦1}, α × β = 6 ∧ α ≠ 1) = 6 ∧ α = 1) ass (α = 1, β = 2) assert: pass (α = 2, β = 3) assert is assert(a * b * c == (b) (c) if-true if-false f-true if-false Girls Meets Symbolic Execution (2) by @K_atc 1. cの値は1に更新済み《代入》 2. 今はif文を抜け(①→②)、 パス制約を更新する 14 Step 4. 以降繰り返し void testme(int a, int b) { int c = 0; if (a * b == 6) { c = 1; if (a == 1) c = 3; } assert(a * b * c == 6); } ① ②

Slide 15

Slide 15 text

(o) (2. c = 0, {a ↦ α, b ↦ β}, true) ↦ β, c ↦ 0}, α × β = 6) (7. assert, {a ↦ α, b ↦ β, c ↦ 0}, α × β ≠ 6) assert: fail (unsa = 6 ∧ α = 1) (7. assert, {a↦α, b↦β, c↦1}, α × β = 6 ∧ α ≠ 1) = 6 ∧ α = 1) ass (α = 1, β = 2) assert: pass (α = 2, β = 3) assert is assert(a * b * c == (b) (c) if-true if-false f-true if-false 今のパスが実行される入力は? パス制約 α × β = 6 ∧ α ≠ 1 を解いて、 α = 2, β = 3 void testme(int a, int b) { int c = 0; if (a * b == 6) { c = 1; if (a == 1) c = 3; } assert(a * b * c == 6); } 15 Girls Meets Symbolic Execution (2) by @K_atc Step 5. 求解(Constraint Solving)

Slide 16

Slide 16 text

Girls Meets Symbolic Execution (2) by @K_atc テストケース生成 [KLEE] 人手でソフトウェアテストするのは大変>< テスト自動化! リバースエンジニアリング [S2E, Triton] 例)パス網羅、Deobfuscation エクスプロイト生成(クラッシュ含む) [AEG, S2E, Driller] 例)Control Flow Hijack 16 シンボリック実行の用途(先行研究) [KLEE] Cadar, C., Dunbar, D., and Engler, D. (2008). KLEE: Unassisted and automatic generation of high- coverage tests for complex systems programs. [S2E] Chipounov, V., Kuznetsov, V., and Candea, G. (2012). The S2E platform: Design, implementation, and applications. [Triton] https://github.com/JonathanSalwan/Tigress_protection [AEG] T. Avgerinos, S. K. Cha, B. L. Tze Hao, and D. Brumley. (2011). AEG: Automatic Exploit Generation. [Driller] Stephens, N., Grosen, J., Salls, C., Dutcher, A., Wang, R., Corbetta, J., Shoshitaishvili, Y., Kruegel, C., and Vigna, G. (2016). Driller: Augmenting fuzzing through selective symbolic execution. 今回はこれ

Slide 17

Slide 17 text

エクスプロイトコード 担当範囲 Girls Meets Symbolic Execution (2) by @K_atc ソフトウェアの脆弱性を利用した攻撃 例)バッファオーバーフロー→シェル(/bin/sh)起動 エクスプロイトを達成するまでの道のり(一例) 17 エクスプロイト(Exploit)とは クラッシュ Information Leak 任意メモリ書き換え PC乗っ取り シェル起動 シェルコード起動 … SIGSEGV, SIGABRT, SIGBUS … libc関数アドレスなどをリーク … GOT Overwrite, UAFなど … PCを、シェルコードの 先頭アドレスに向けるとか はん雑!めんどい!

Slide 18

Slide 18 text

Girls Meets Symbolic Execution (2) by @K_atc i … 命令 I … プログラムへの入力 18 [参考]記号の定義

Slide 19

Slide 19 text

無能エクスプロイト 双葉と葵の作戦会議 19 Day 1 Aoi Futaba

Slide 20

Slide 20 text

Girls Meets Symbolic Execution (2) by @K_atc 20 双葉の無鉄砲な思いつき シンボリック実行を使って

Slide 21

Slide 21 text

Girls Meets Symbolic Execution (2) by @K_atc シンボリック実行の限界 ・パス爆発(Path Explosion) ➡ 一般的に網羅的探索は非現実的 ・探索空間の指数的増大 O(2m)* ➡ 長い入力が苦手 21 双葉に立ちふさがる壁 * 入力長をmビットとする。プログラムの動作は入力に対して決定的なので、この問題はパス爆発と同値 シンボリック実行を使って

Slide 22

Slide 22 text

Girls Meets Symbolic Execution (2) by @K_atc エクスプロイト自動化に際し、 シンボリック実行の弱点を補ってくれる素敵な解決策は…? 22 願いを叶えるブラックボックス ? Exploit Code Something Good Symbolic Execution ((o(´∀`)o)) 何かな?何かな?

Slide 23

Slide 23 text

Fuzzing (AFL) Symbolic Execution (Triton) Girls Meets Symbolic Execution (2) by @K_atc 23 素敵コラボ:葵×双葉(ファジング×シンボリック実行)

Slide 24

Slide 24 text

Girls Meets Symbolic Execution (2) by @K_atc 予期しない入力を生成し、検査対象の異常な動作の有無を確認する セキュリティテスト 24 [補足]ファジングとは Fuzzer Program 図 ほのぼのとしたファジングの風景

Slide 25

Slide 25 text

Girls Meets Symbolic Execution (2) by @K_atc ゴール 任意メモリ書き換え→Control Flow Hijack* アイデア詳細 1. ファジングでクラッシュする入力 I を得る** 2. 入力 I で実行し、クラッシュ時の実行パス P を得る 3. パス P でControl Flow Hijack脆弱性を検出する*** 4. 発現条件の解がエクスプロイトコードもどき 25 願いを叶えるホワイトボックス Fuzzing Symbolic Execution Exploit Code Crash Input Seed Method I ︙ To Detect Control Flow Hijack Vulnerability *Control Flow Hijack PC(プログラムカウンタ)を乗っ取る攻撃 ** Exploitableなクラッシュであるかどうかの検証もしたいところ。今回は人力で検証した。 *** 任意のクラッシュからこの脆弱性を導けるとは限らないよ Day 2 Day 3

Slide 26

Slide 26 text

Mechanical Phish @Cyber Grand Challenge Girls Meets Symbolic Execution (2) by @K_atc シンボリック実行×エクスプロイト→AEG (2011) ・ゴール:Control Flow Hijackするエクスプロイトコードの自動生成 ・緩和した問題:探索空間の指数的増大 ・アプローチ:Preconditioned Symbolic Execution(入力空間の制限) ファジング×シンボリック実行→Driller (2016) ・ゴール:脆弱性検出の効率化 ・緩和した問題:パス爆発 ・アプローチ:シンボリック実行の欠点をファジングで補う [参考]Cyber Reasoning System (CRS) における両者の位置づけ 26 [補足]エクスプロイト自動化に関する先行研究 Vulnerability Detection Exploit Generation Input Generation Automatic Patching Driller (CGC) AEG (Stack BOF)

Slide 27

Slide 27 text

Girls Meets Symbolic Execution (2) by @K_atc ノートを管理する自作のLinux CUIアプリnotes バッファオーバーフロー脆弱性により、ポインタが書き換わる 簡単のため、プログラムは既知アドレスにシェルコードを展開 27 今回のエクスプロイト対象(デモアプリ)について Futaba% ./notes ---- [menu] ---- n: new note u: update note s: show notes q: quit input command: n ==== [note #0] ==== title: Futaki Futaba content: I’m a high school student. ---- [menu] ---- ... snipped ... input command: s note #0:Futaki Futaba I’m a high school student. typedef struct { char* content; char title[16]; } note; note notes[8]; void update_note(unsigned int note_id) { ... snipped ... _printf(“title: "); _fgets(notes[note_id].title, 1024, stdin); } ▼バッファオーバーフロー脆弱性の箇所 ▼ノートの構造体定義 ポインタ書きかえ可能 BOF

Slide 28

Slide 28 text

めげない葵と 気まぐれファザー 葵(AFL)パート 28 Day 2

Slide 29

Slide 29 text

Girls Meets Symbolic Execution (2) by @K_atc AFL(American Fuzzy Lop)はファジングを行うソフトウェア AFLはOSSで、Michal Zalewski氏@Googleがホスト 29 今回採用するAFLとは

Slide 30

Slide 30 text

Girls Meets Symbolic Execution (2) by @K_atc 環境構築と準備は比較的容易。うまくいくかは場合による。 1. ファジング対象を用意 2. シード(入力の元になる値)を作成 3. ポチって待つ 4. クラッシュさせる入力が生成される 5. 検証:生成された入力でどのようにクラッシュするのかを確認 30 AFLによるファジングの流れ afl-fuzz Seed Fuzz Target (In binary form) Crash Inputs afl-gcc Source Code Instrumentation with afl-gcc is optional (recommended) (1) (2) (3) (4)

Slide 31

Slide 31 text

Girls Meets Symbolic Execution (2) by @K_atc 31 Let’s Fuzzing なのです (>ω<)/ afl-fuzz -i inputs/notes -o result ./notes n title content s n title 2 content! s u 3 n title 3 content!! s q ① シード ② ファジング開始 ③ ファジング中の様子 生成したクラッシュ入力の数

Slide 32

Slide 32 text

Girls Meets Symbolic Execution (2) by @K_atc 32 ファジング結果を検証 wasabi% xxd result-notes/crashes/id:000004,sig:07, src:000000,op:havoc,rep:32 00000000: 6ef8 5d69 74e9 6d0d 320a 730a 750a 330a 00000010: 6e6c 65ff 68ff ff6f 8121 212e 7a81 2121 00000020: 20d5 0a63 6e6e 2120 d50a 636e 6e66 adad 00000030: adad 66ad adad adad adad ad22 adad adad 00000040: adad ad9d adad adad 0d51 0a73 0a75 0a33 00000050: 0a6e 6c65 ff28 ffff 6f81 2121 20d5 0a63 00000060: 6e6e 6e6e 6e81 e16e 6e6e 6e6e 7e6e 6e6f 00000070: 6e21 ff00 730a 71 検証結果 操作可能な不正なメモリアクセス によりクラッシュした! Exploitableなクラッシュだ!! ➡双葉にバトンパッチ 下図 クラッシュ入力(一部出力加工) 右図 gdbで動作確認した結果 ③ このrbpは任意値にできそう ② 不正なメモリアクセスで落ちた ① 確かにクラッシュが再現した

Slide 33

Slide 33 text

双葉とシンボリック実行、 今すぐエクスプロイト 双葉(Triton)パート 33 Day 3

Slide 34

Slide 34 text

Girls Meets Symbolic Execution (2) by @K_atc 今回はTritonを採用! 要件 • Tracer:与入力に従う実行パスだけをシンボリック実行できる • libc:libcを高速にシンボリック実行できること 34 双葉「どのシンボリック実行エンジンを使おうかな?」 Triton angr KLEE S2E Published in 2015 2016 2008 2011 Usability Medium Easy Easy Medium Hard User Script Python Python command line, C/C++ Lua, C++ Tracer Available Not Works N/A N/A libc Fully Symbolically Executed Replaced with Symbolic Procedure 1) Engine is written in C++ Python C++ C++ libcでクラッシュする場合に必要な要件 表 シンボリック実行エンジンの比較 クラッシュする実行パスは分かっている 1) libc can be symbolically executed, but slow

Slide 35

Slide 35 text

Girls Meets Symbolic Execution (2) by @K_atc QuarkslabのJonathan Salwan氏*を 筆頭に開発されている シンボリック実行エンジン** 外部(Intel Pinなど)で実行したと きの命令トレースを与え、 当時の実行パスに従って シンボリック実行することも可能 エミュレーターを実装して、 バイナリ全体をシンボリック実行す ることも可能 35 [補足]Tritonについて (画像は https://github.com/JonathanSalwan/Triton より) * shellstormの人 ** 正確には動的解析基盤(Dynamic Binary Analysis Framework)

Slide 36

Slide 36 text

Girls Meets Symbolic Execution (2) by @K_atc 36 クラッシュする入力からエクスプロイトコードをどう作るか? ①クラッシュ入力生成 mov byte ptr [rbp], al Invalid Memory Access ②任意メモリ書き換え ネイティブ実行 トレースしたパスに従い、 シンボリック実行 • パス制約 • メモリアクセス制約 mov byte ptr [symvar_rbp], symvar_al クラッシュする時点の命令において、 メモリアドレスAに値aを書き込める ⇔symvar_rbp == A, symvar_al == a に解が存在 《➡宿題》 • クラッシュ クラッシュ入力生成 任意メモリ書き換え PC乗っ取り シェルコード起動 トレーサーが ①の入力に従い実行。 命令トレースを出力 ※AFLの検証フェーズで説明済み クラッシュ 入力 ※AFLで生成

Slide 37

Slide 37 text

Girls Meets Symbolic Execution (2) by @K_atc 37 クラッシュする入力からエクスプロイトコードをどう作るか? クラッシュ入力生成 任意メモリ書き換え PC乗っ取り シェルコード起動 GOT(Global Offset Table)には libc関数のアドレスが入っている GOT Overwriteにより、 libc関数のアドレスをアドレスXに上書きする(*A = X) fputs() fputs@libc() Index Real Addr fputs fputs@libc GOT lookup call func fputs() X() Index Real Addr fputs X GOT (Overwritten) lookup call func ④シェルコード起動 今回、バイナリ中にシェルを起動する関数が存在し、アドレスが既知と仮定。 そのアドレスをXとする ③PC乗っ取り(GOT Overwriteの場合)

Slide 38

Slide 38 text

Girls Meets Symbolic Execution (2) by @K_atc ここでは❶~ ❸について説明 • 標準入力のシンボル化とreadシステムコールのハンドル(❶) • 任意メモリ書き換えを2段階で実現(❷) • パス制約の解になぜか誤り→方針転換:与入力を修正 • Tritonのランタイムエラー(❸) • SIGBUSでトレーサーがTritonと心中 • z3の例外で死ぬ 38 実装の苦労話

Slide 39

Slide 39 text

Girls Meets Symbolic Execution (2) by @K_atc 標準入力のシンボル化をサポートしないシンボリック実行エンジン では、sys_readをフックして自力でシンボル化するはめになる Tritonはこれに該当 39 ❶ 標準入力のシンボル化とreadシステムコールのハンドル def syscallsEntry(threadId, std): if getSyscallNumber(std) == SYSCALL64.READ: ### readシステムコールをフック fd = getSyscallArgument(std, 0) buff = getSyscallArgument(std, 1) size = getSyscallArgument(std, 2) if fd == 0: ### 標準入力だったら、読み込み先のバッファと読み込みの長さを控える isRead = {'buff': buff, 'size': size} return def syscallsExit(threadId, std): if isRead is not None: size = isRead['size'] buff = isRead['buff'] for index in range(size): ### 書き込み先のバッファをシンボル化 Triton.convertMemoryToSymbolicVariable(MemoryAccess(buff+index, CPUSIZE.BYTE)) isRead = None return

Slide 40

Slide 40 text

Girls Meets Symbolic Execution (2) by @K_atc クラッシュする入力をトレーサーに与えるとき、一度のシンボリッ ク実行で「特定のメモリ書き換えを行うペイロード」の生成するの が難しい《➡宿題》 双葉は、シンボリック実行を2回に分けた。 入力 I により命令 i でクラッシュするとして、 1. 入力Iを与え、命令iでメモリ書き込み先がA**という制約を解き、 ペイロードPを生成† 2. 入力Pを与え、命令iでアドレスAの中身がX**という制約を解き、 ペイロードP´を生成† ➡ P´がエクスプロイトコード相当 40 ❷「困難は分割せよ」 † このとき、パス制約も満たすように生成する * 今回、A はGOTのエントリー ** 今回、X はシュエル起動コードのアドレス i : mov byte ptr [rbp], al

Slide 41

Slide 41 text

Girls Meets Symbolic Execution (2) by @K_atc 以下の現象に遭遇した。プルリクエストを出して修正済み* SIGBUSでトレーサーがTritonと心中 Tritonではトレーサーが原因のシグナルをハンドルできるが、 SIGBUSを無視するのでTritonを巻き込んで死ぬ ➡SIGBUSをハンドルするように修正 z3の例外で死ぬ z3**は制約式がおかしいと例外(z3::exception)を投げる Tritonがそれを拾わないので例外メッセージを出さずに死ぬ ➡ Tritonがそれを拾うように修正(Jonathan氏の手助けあり) 41 ❸ Tritonのランタイムエラー * 当該プルリク #695 はdev-v0.6ブランチにマージ済み。dev-v0.6は6/29にmasterにマージ ** z3は制約ソルバー。Tritonはz3をバックエンドで使用。

Slide 42

Slide 42 text

デモ/まとめ 42

Slide 43

Slide 43 text

Girls Meets Symbolic Execution (2) by @K_atc 43 デモっ! https://asciinema.org/a/oex5uONOiUy5lNb41fgBQALtb 実行時間:3分。最大使用メモリ量:100 MB

Slide 44

Slide 44 text

Girls Meets Symbolic Execution (2) by @K_atc コード量 約400行 コーディング時間 2~3週間 Tritonにハマりどころが多かったり、 非効率なソルバーを書くと1回の実行に30分かかったりして大変! 44 [参考]実装規模

Slide 45

Slide 45 text

Girls Meets Symbolic Execution (2) by @K_atc 以下のアプローチでエクスプロイト自動生成に取り組んだ 1. クラッシュする入力をファジングにより生成 2. クラッシュする実行パスをシンボリック実行 3. 制約を解いてエクスプロイトコードを生成 今回実装したAEG: https://github.com/macaron-et/wasabi-aeg 今後の課題 他の脆弱なアプリに対して本ツールを適用 エクスプロイトにつながるクラッシュをファジングでうまく発見 (CTFのpwnのバイナリだと、DoSに留まるクラッシュが見つかりがち) 45 まとめ 遊んでみてね~

Slide 46

Slide 46 text

Girls Meets Symbolic Execution (2) by @K_atc バイナリ萌えの彼女がシンボリック実行に恋着していますが、 制約に挑む幼気な表情が最高です!(1) https://speakerdeck.com/katc/bainarimeng-efalsebi-nu- gasinboritukushi-xing-nilian-zhao-sitemasuga-zhi-yue-nitiao- muyou-qi-nabiao-qing-gazui-gao-desu-1 American Fuzzy Lop (AFL) http://lcamtuf.coredump.cx/afl/ Triton https://github.com/JonathanSalwan/Triton 46 参考資料

Slide 47

Slide 47 text

双葉ちゃんからの宿題 ブログなどでご回答ください マージはしませんが、プルリクを送る形でもいいです 47

Slide 48

Slide 48 text

Girls Meets Symbolic Execution (2) by @K_atc あるプログラムが、次のx86_64の命令 i においてrbpレジスタが任 意の値をとるとします。 mov byte ptr [rbp], al ファジングにより、命令 i でセグメンテーションフォールト (SEGV)する入力 I を得られました。 入力 I をトレーサーへの入力として与えるとき、一度のシンボリッ ク実行で「特定のメモリに特定の8バイト値を書き込むペイロー ド」を得ることが極めて難しいです。それはなぜでしょうか? ヒント:トレーサーの性質 48 問1 (難易度:やや難)

Slide 49

Slide 49 text

Girls Meets Symbolic Execution (2) by @K_atc 問1のプログラムに対して、ファジングの結果をうまく利用し、任 意メモリ書き換え脆弱性を効率的に検出する方法を考えます。 メモリアクセス毎にその脆弱性の有無を検証すると、制約ソルバー *が何度も呼ばれることになり、実行速度が低下します。 制約ソルバーの呼び出しを最小にする検出方法を考えてください。 ヒント:想定回答は2つ。 49 問2 (難易度:易) *制約ソルバー 制約を解き、制約を満たす具体値を得るためのプログラム

Slide 50

Slide 50 text

Girls Meets Symbolic Execution (2) by @K_atc ある命令 i が実行されたときに、副作用の無い処理を追加します。 実際は、ASLR*のせいで実行時の命令 i のアドレスは不定です。 シンプルなASLR対策をお願いします>< ヒント:ASLRの仕様。追加処理には副作用が無い。 50 問3 (難易度:易) *ASLR (Address Space Layout Randomization) see Wikipedia