Exploiting実習 第7回


目次


スタック構造

[設置場所] <<<<<●←

[設置場所] <<<<  →<●

fig.7-1:スタックからのデータのとりだし

[設置場所] <<< <●←

[設置場所] <<<<●←

fig.7-2:スタックへのデータの格納


関数呼び出し


int func(int var1, int var2);
int func2(int f2var);

int main(int argc, char * argv[]){

    int var1, var2;
    var1 = 3;
    func(var1, var2);
    var2 = 8;
    return 0;
}

int func(int var1, int var2){

    int fvar1, fvar2;
    fvar1 = 3;
    func2(var1);
    return 0;
}

int func2(int f2var){
    return 0;
}

スタックフレーム

呼ぶとき

呼び出した後はスタックは次のような感じになる

[メモリ低位アドレス]
|             |
+-------------+
|             |
+-------------+
|  fvar2      | *
+-------------+ *←ローカル変数
|  fvar1      | *
+-------------+
|  0x000fffe  | ←SEP
+-------------+
|  0x000113f  | ←戻りアドレス
+-------------+
|  var2       | *
+-------------+ *←引数
|  var1       | *
+-------------+
|  ????????   | 他の関数が使ってる領域
+-------------+
[メモリ高位アドレス]

fig.7-3:func()を呼び出した後のスタック

さらにfunc()の中でfunc2()を呼ぶと次の用になる

[メモリ低位アドレス]
|             |
+-------------+ --------------func2()の領域-------
|  0x000fffd  | ←SEP
+-------------+
|  0x000114e  | ←戻りアドレス
+-------------+
|  f2var      | ←引数
+-------------+ --------------func()の領域--------
|  fvar2      | *
+-------------+ *←ローカル変数
|  fvar1      | *
+-------------+
|  0x000fffe  | ←SEP
+-------------+
|  0x000113f  | ←戻りアドレス
+-------------+
|  var2       | *
+-------------+ *←引数
|  var1       | *
+-------------+ ---------------------------------
|  ????????   | 他の関数が使ってる領域
+-------------+
[メモリ高位アドレス]

fig.7-4:func()を呼び出した後のスタック

呼んだ後

関数内での仕事がなくなったら、前にいた場所に戻るように頑張る

[メモリ低位アドレス]
|             |
+-------------+ --------------func()の領域--------
|  fvar2      | *
+-------------+ *←ローカル変数
|  fvar1      | *
+-------------+
|  0x000fffe  | ←SEP
+-------------+
|  0x000113f  | ←戻りアドレス
+-------------+
|  var2       | *
+-------------+ *←引数
|  var1       | *
+-------------+ ---------------------------------
|  ????????   | 他の関数が使ってる領域
+-------------+
[メモリ高位アドレス]

fig.7-5:func2()処理後のスタック

[メモリ低位アドレス]
|             |
+-------------+ --------------func()の領域--------
|  fvar2      | *
+-------------+ *←ローカル変数
|  fvar1      | *
+-------------+
|  0x000fffe  | ←SEP
+-------------+
|  0x000113f  | ←戻りアドレス
+-------------+
|  var2       | *
+-------------+ *←引数
|  var1       | *
+-------------+ ---------------------------------
|  ????????   | 他の関数が使ってる領域
+-------------+
[メモリ高位アドレス]

fig.7-6:func()処理後のスタック


戻りアドレスの書き換え


ペイロードの格納場所

         buffer                 sfp    戻りアドレス
--------+----------------------+-----+--------------------+-------
        | shellcode            |     | address of buffer  |
--------+----------------------+-----+--------------------+-------
        ↑                              |
        +-------------------------------+

fig.7-7:飛ばす場所のイメージ

★ターゲットプログラムの実行時のメモリ
Low 0x0000                          0x01f4   0x01f8   0x01fc   0x0200    High
----[buffer 500byte                ][SEP    ][ret add][argc   ][argv   ]---


★入力する文字列 508byte
    [shellcode 33byte][適当な値 471byte       ][0x0000 ]

問題点


次回の予定


Copyleft (C) 2007. Defolos. All rights opened.