スタック構造

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yuya

スタック構造

#1

投稿記事 by yuya » 14年前

 C言語を用いてバッファオーバーフローの勉強をしています。スタックの割り当てを表示するプログラムを作成し,実際に表示したのですが,EBPアドレス,リターンアドレス,引数の割り当て場所がわかりません。
 スタック構造に詳しい方がいらっしゃいましたら,以下の実行結果における割り当てをご教授ください。また,EBPアドレスの値が何を表しているのかもご教授お願いします。また環境として,OSはLinux 2.6.39.4,CPUはDual-Core AMD Opteron(tm) Processor 1212です。

以下がプログラムです。

コード:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//今回は無関係な関数です。
void overflow(void){
	printf("buffer over floww!!!\n");
	exit(0);
}

//mark2からFFFFFFFF方向へのスタック割り当てを表示します。
void out(int* p,int count){
	unsigned char cbuff[4];
	int i;
	puts("-----------------------------");
	puts("Adress  |var     |+0 +1 +2 +3");
	for(i=0;i<count;i++){
		printf("%08x|%08x|",&p[i],p[i]);
		memcpy(cbuff,&p[i],sizeof(cbuff));
		printf("%02x %02x %02x %02x\n",cbuff[0],cbuff[1],cbuff[2],cbuff[3]);
	}
	puts("-----------------------------");
}

void func(const char* line,const int* m,int size){
	unsigned char msg[4];
	int mark2=0x22222222;   //目印です。
	memcpy(msg,line,size);  //バッファオーバーフローを発生させます。(今回は発生させていません。)
	out(&mark2,20);
}

int main(void){
	int s=4;
	unsigned char linebuf[]={
		0xaa,0xaa,0xaa,0xaa,
		};
	int mark1=0x11111111;  //目印です。
	func(linebuf,&mark1,s);
	return 0;
}
以下が実行結果です。
-------------------------------------
Adress |var |+0 +1 +2 +3
ac54853c|22222222|22 22 22 22   //mark2
ac548540|aaaaaaaa|aa aa aa aa   //msg[0]~msg[3]
ac548544|00007fff |ff 7f 00 00
ac548548|004007e5|e5 07 40 00
ac54854c|00000000|00 00 00 00
ac548550|ac548580|80 85 54 ac
ac548554|00007fff |ff 7f 00 00
ac548558|0040077a|7a 07 40 00
ac54855c|00000000|00 00 00 00
ac548560|00000000|00 00 00 00
ac548564|00000000|00 00 00 00
ac548568|00400520|20 05 40 00
ac54856c|11111111|11 11 11 11   //mark1
ac548570|aaaaaaaa|aa aa aa aa   //linebuf[0]~linebuf[3]
ac548574|00007fff |ff 7f 00 00
ac548578|00000000|00 00 00 00
ac54857c|00000004|04 00 00 00   //s
ac548580|00000000|00 00 00 00
ac548584|00000000|00 00 00 00
ac548588|7007ac4d|4d ac 07 70
--------------------------------------

具体的にac548544~ac548568,ac548574~ac548578,ac548580~の割り当てがわかりませんでした。よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スタック構造

#2

投稿記事 by softya(ソフト屋) » 14年前

アセンブルコードを出力してスタックフレームの構造を確認してみるのが先決では無いでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る