逆向——如何区分全局变量和局部变量、堆栈内存区域

第三节 局部变量与全局变量的区别

记住知识点:

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异或的值

 

 

第四课 内存图
 
数据在内存中的存储区域

1、栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

2、堆:就是那些由new或malloc分配的内存块,在不适用时,要手动用delete或free来释放内存区域。

3、全局/静态存储区:全局变量和静态变量被分配到同一块内存中,他们共同占用同一块内存区。

4、常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

 

 

 

 


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);
}

上述代码分别存储在什么地方呢?思考一下吧 ヾ(✿゚▽゚)ノ
如下是内存区域划分图,跟刚才你想的一样吗 ?????

 

 

 

posted @ 2023-04-02 18:13  bonelee  阅读(214)  评论(0编辑  收藏  举报