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

Stack&Heep

 Stack&Heep

スタック・ヒープオーバーラン勉強会の資料です

Kotokaze

May 31, 2021
Tweet

More Decks by Kotokaze

Other Decks in Education

Transcript

  1. スタックとヒープ
    Kotokaze

    View full-size slide

  2. 1.
    メモリとは
    データの⼀時置き場 (
    ⼤きな配列のようなもの)
    のこと
    プロセス実⾏時には、プログラムがメモリ上に展開される
    → 32bit
    コンピュータであれば、232
    分だけ確保*
    される
    +----------------------------------------------------- ---------------+
    | 0x00000000 | 0x00000001 | 0x00000002 | 0x00000003 | ≈≈≈≈≈ | 0xFFFFFFFF |
    +----------------------------------------------------- ---------------+
    *
    ほとんどの場合では、必要とする分だけ OS
    が⽤意してくれる
    2

    View full-size slide

  3. environ
    argv
    share
    bss
    data
    text
    0
    番地
    232
    番地
    heep
    stack
    2.
    プロセスとメモリ
    名称 主な配置データ 備考
    text
    機械語 Read Only
    data
    グローバル変数 初期値有り
    bss
    グローバル変数 初期値無し
    heep
    動的なデータ malloc
    など
    stack
    ⾃動変数/
    アドレス ⾃動的に拡張
    3

    View full-size slide

  4. data
    data
    3.
    スタック
    積み⽊ように、積み上げてデータ保存
    アクセスできるのは最上位のみ
    スタック領域では、ローカル変数・
    リターンアドレスなどを保存
    命令語 内容
    PUSH
    スタックの先頭に追加
    POP
    スタック先頭の値を取り出す
    4

    View full-size slide

  5. 使⽤中
    data1
    data0
    使⽤中
    使⽤中 使⽤中
    4.
    ヒープ
    使う分だけ確保して使う
    未整列 (
    空域に⾃動配置)

    場所指定でアクセス可
    ⾃由度は⾼いが、
    脆弱になりやすい
    int* data0 = new int[sizeof(buff)];
    int* data1 = malloc(sizeof(buff));
    5

    View full-size slide

  6. 5.
    バッファ・オーバーラン
    (CWE-119)
    実⾏中プロセスのメモリ内における、
    意図したバッファ外の値を読み書きすること
    C / C++
    で発⽣しやすい
    名称 対象
    スタック破壊攻撃 ローカル(
    ⾃動)
    変数・リターンアドレス
    ヒープ破壊攻撃 配置したデータ
    6

    View full-size slide

  7. 6.
    プログラム解析
    サンプルコードの解析をしてみよう!
    サンプルコード: Kotokaze/stack-study
    7

    View full-size slide

  8. 6.
    プログラム解析
    (2)
    Key1: Stack
    のコンストラクタで、 data0 / data1
    を初期化

    ヒープ領域に連続して*
    配置されていると考えられる
    +-----------------------------------------------------------------------+
    | data0 | data1 | ≈≈≈≈≈ |
    +-----------------------------------------------------------------------+
    *
    複数の初期化を同時に⾏うと、連続して配置される場合が多い
    8

    View full-size slide

  9. 6.
    プログラム解析
    (3)
    Key2:
    コンストラクタに注⽬
    for (int i = 0; i <= this->tail; i++)
    this->data1[i] = 3;
    名称
    \
    位置
    0 1 2 3 4 5 6 7
    data0 - - - - - - - -
    data1 3 3 3 3 3 3 3 3
    9

    View full-size slide

  10. 6.
    プログラム解析
    (4)
    Key3:
    値の変化に注⽬
    → main
    のループで順に代⼊していくと...
    for (int i = 0; i < num; i++)
    stk.push(i + 1);
    名称
    \
    位置
    0 1 2 3 4 5 6 7
    data0 1 2 3 - - - - -
    data1 3 3 3 3 3 3 3 3
    10

    View full-size slide

  11. 7.
    動かしてみる
    data0

    12
    回の値を⼊れ続けるとどうなる???
    → README
    を参考に動かしてみよう

    脆弱性を含んでいる事に注意しましょう
    11

    View full-size slide

  12. 参考情報
    https://jvndb.jvn.jp/ja/cwe/CWE-119.html
    https://www.ipa.go.jp/security/awareness/vendor/programmingv2/
    contents/c901.html
    12

    View full-size slide