[設置場所] <<<<<●← [設置場所] <<<< →<●
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 ]