スタック構造に詳しい方がいらっしゃいましたら,以下の実行結果における割り当てをご教授ください。また,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~の割り当てがわかりませんでした。よろしくお願いします。