Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Girls Meets Symbolic Execution: Assertion 2. Automated Exploit Generation

Girls Meets Symbolic Execution: Assertion 2. Automated Exploit Generation

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

Assertion 1: https://speakerdeck.com/katc/bainarimeng-efalsebi-nu-gasinboritukushi-xing-nilian-zhao-sitemasuga-zhi-yue-nitiao-muyou-qi-nabiao-qing-gazui-gao-desu-1
Assertion 3: (´へωへ`*)

【更新履歴】
2018/7/26 一部文章を書き直し

English version is available: https://speakerdeck.com/katc/girls-meets-symbolic-execution-assertion-2-automated-exploit-generation-english

友利奈緒(@K_atc)

July 21, 2018
Tweet

More Decks by 友利奈緒(@K_atc)

Other Decks in Science

Transcript

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

    View full-size slide

  2. 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
    プロフィール

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. 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
    *実行木 シンボリック実行を説明するための仮想的な木
    **パス制約 当該パスが実行されるためのシンボル変数に対する制約
    ▼実行対象

    View full-size slide

  11. 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
    (次の命令)

    View full-size slide

  12. 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);
    }

    View full-size slide

  13. 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);
    }

    View full-size slide

  14. (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);
    }


    View full-size slide

  15. (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)

    View full-size slide

  16. 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.
    今回はこれ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  26. 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)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  31. 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
    ① シード ② ファジング開始
    ③ ファジング中の様子
    生成したクラッシュ入力の数

    View full-size slide

  32. 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は任意値にできそう
    ② 不正なメモリアクセスで落ちた
    ① 確かにクラッシュが再現した

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. 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)

    View full-size slide

  36. 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で生成

    View full-size slide

  37. 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の場合)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  41. 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をバックエンドで使用。

    View full-size slide

  42. デモ/まとめ
    42

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  46. 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
    参考資料

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide