栈,ebp和esp寄存器的简单探索

时间:2021-01-17 17:07:10
#include<iostream>
using namespace std;

void ff(){
	cout << "f executing "<< endl;
	int  a =0,b = 0,c = 0,d = 0,e =0;
	/*
	 *	cpu 的读值顺序,是从低地址到高地址,这里不要以big-endian或者
	 *	little-endian的方式去理解哈,是一小段低地址读取"完"后,又从高地址读
	 *	取一小段值.如,变量int a 在 低地址,int b在高地址,
	 *	int *p指定a地址处,read (int)p,就读的是a的值,
	 *	read (int)(p+4)就读的是b的值
	 *
	 *
	 */
	__asm{
		mov a,ebp;
		mov b,esp;
		mov eax,[ebp+4];//调用者的"call ff"后的EIP,指令地址
		mov c,eax;
		jmp c;	//跳转到该指令地址
		mov eax,[ebp-8];
		mov d,eax;
		mov eax,[ebp];//用被调用者(即ff函数)的[ebp]地址处的值,得到调用者的ebp的值
		mov e,eax;
	}
	
	cout << "in f ebp := " << a << endl;
	cout << "in f esp := " << b << endl;
	cout << "in f ebp+4 := " << c << endl;
	cout << "in f ebp-8 := " << d << endl;
	cout << "in f [ebp] := " << e << endl;
}

int main(){

	int a = 0,b=0,c=0,d=0,e=0,f=0;
	int g =0,h=0,i=0;
	int addr = 0;
	__asm{
		mov g,ebp;
		mov  a,esp
		push 123;
		push 456;
		push 789;
		push 999;
		push 888;
		call ff;
		mov h,ebp;
		mov b,esp;
		pop c;
		mov d,esp;
		pop e;
		mov f,esp;
		mov i,ebp;
		mov eax,[ebp];
		mov addr,eax;
	}
	cout << "esp first := " << a << endl;
	cout << "esp second after push order := " << b << endl;
	cout << "after pop order, c := " << c << endl;
	cout << "esp third after pop order := " << d << endl;
	cout << "after pop order,e := " << e << endl;
	cout << "esp fourth after pop order := " << f << endl;

	cout << "ebp first := " << g << endl;
	cout << "ebp second after push order := " << h << endl;
	cout << "ebp third after two pop order := " << i << endl;
	cout << "main address := " << (int)main << endl;
	cout << "ebp pointer address content := " << addr << endl;
	cout << "ff address := " << int(ff) << endl; //被调用者的指令地址
	cout << "我已经执行过了!" << endl;
	return 0;
}

f executing
esp first := 14881597
esp second after push order := 3274656
after pop order, c := 0
esp third after pop order := 14883616
after pop order,e := 14881788
esp fourth after pop order := 3274676
ebp first := 15043440
ebp second after push order := 15043440
ebp third after two pop order := 14887950
main address := 14881488
ebp pointer address content := 3274652
ff address := 14881168
我已经执行过了!
esp first := 3274704
esp second after push order := 3274684
after pop order, c := 888
esp third after pop order := 3274688
after pop order,e := 999
esp fourth after pop order := 3274692
ebp first := 3274744
ebp second after push order := 3274744
ebp third after two pop order := 3274744
main address := 14881488
ebp pointer address content := 3274816
ff address := 14881168
我已经执行过了!


#include<iostream>
using namespace std;

void ff(){
	cout << "f executing "<< endl;
	int  a =0,b = 0,c = 0,d = 0,e =0;
	/*
	 *	cpu 的读值顺序,是从低地址到高地址,不是big-endian或者
	 *	little-endian的方式哈,是一小段低地址读取"完"后,又从高地址读
	 *	取一小段值.如,变量int a 在 低地址,int b在高地址,
	 *	int *p指定a地址处,read (int)p,就读的是a的值,
	 *	read (int)(p+4)就读的是b的值
	 *
	 *
	 */
	__asm{
		mov a,ebp;
		mov b,esp;
		mov eax,[ebp+4];//调用者的代码中"call ff"后 EIP,指令地址
		mov c,eax;
		//jmp c;	//跳转到该指令地址执行,不在执行下面的内容
		//call c;  //同样也不再执行下面的内容
		mov eax,[ebp-8];
		mov d,eax;
		mov eax,[ebp];//用被调用者(即ff函数)的[ebp]地址处的值,得到调用者的ebp的值
		mov e,eax;
	}
	
	cout << "in f ebp := " << a << endl;
	cout << "in f esp := " << b << endl;
	cout << "in f ebp+4 := " << c << endl;
	cout << "in f ebp-8 := " << d << endl;
	cout << "in f [ebp] := " << e << endl;
}

int main(){

	int a = 0,b=0,c=0,d=0,e=0,f=0;
	int g =0,h=0,i=0;
	int addr = 0;
	__asm{
		mov g,ebp;
		mov  a,esp
		push 123;
		push 456;
		push 789;
		push 999;
		push 888;
		call ff;
		mov h,ebp;
		mov b,esp;
		pop c;
		mov d,esp;
		pop e;
		mov f,esp;
		mov i,ebp;
		mov eax,[ebp];
		mov addr,eax;
	}
	cout << "esp first := " << a << endl;
	cout << "esp second after push order := " << b << endl;
	cout << "after pop order, c := " << c << endl;
	cout << "esp third after pop order := " << d << endl;
	cout << "after pop order,e := " << e << endl;
	cout << "esp fourth after pop order := " << f << endl;

	cout << "ebp first := " << g << endl;
	cout << "ebp second after push order := " << h << endl;
	cout << "ebp third after two pop order := " << i << endl;
	cout << "main address := " << (int)main << endl;
	cout << "ebp pointer address content := " << addr << endl;
	cout << "ff address := " << int(ff) << endl; //被调用者的指令地址
	cout << "我已经执行过了!" << endl;
	return 0;
}
f executing
in f ebp := 3537220
in f esp := 3537200
in f ebp+4 := 660269
in f ebp-8 := 3537200
in f [ebp] := 3537288
esp first := 3537248
esp second after push order := 3537228
after pop order, c := 888
esp third after pop order := 3537232
after pop order,e := 999
esp fourth after pop order := 3537236
ebp first := 3537288
ebp second after push order := 3537288
ebp third after two pop order := 3537288
main address := 660160
ebp pointer address content := 3537360
ff address := 659856
我已经执行过了!


栈,ebp和esp寄存器的简单探索