逆向——如何区分全局变量和局部变量、堆栈内存区域
第三节 局部变量与全局变量的区别
记住知识点:
1、全局变量,在程序生成后,内存地址是固定了,只有重新编译后
,内存地址才会改变
。
2、全局变量,在汇编中是内存地址的格式存储;局部变量是以[ebp-xxx]的格式存储。
局部变量与全局变量的区别
全局变量与局部变量的区别在于作用域的不同,且存在时间也可能不同。不管有不有外部的变量,main函数中的变量都不能称为全局变量。
全局变量是可以被本程序所有对象或函数引用。
例:
图中的代码,t1为全局变量,可以在main函数中使用,也可以在a函数中使用。
而t2 t3则为局部变量,它们只能在花括号内部被使用。
所以a函数不能使用t2,main函数也不能使用t3。
注意:vs2017、vs2022和vc6局部变量的差别,第一个局部变量是从ebp-8开始:
那么ebp-4是放啥了???
放security cookie了!!!见:为何vs编译边出来的程序ebp-4存放的不是第一个局部变量?而是security_cookie——本质上就是存的随机数和ebp异或的值
第四课 内存图
int globalVar = 1; //全局、局部变量存储在数据段
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localVar = 1;
int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";
char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof (int)* 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int)* 4);
free(ptr1);
free(ptr3);
}
上述代码分别存储在什么地方呢?思考一下吧 ヾ(✿゚▽゚)ノ
如下是内存区域划分图,跟刚才你想的一样吗 ?????