逆向底子笔记一 进制篇
逆向底子笔记二 数据宽度和逻辑运算
逆向底子笔记三 通用寄存器和内存读写
逆向底子笔记四 堆栈篇
逆向底子笔记五 标志寄存器
逆向底子笔记六 汇编跳转和比较指令
逆向底子笔记七 堆栈图(重点)
逆向底子笔记八 反汇编分析C语言
逆向底子笔记九 C语言内联汇编和调用协定
逆向底子笔记十 汇编探求C程序入口
逆向底子笔记十一 汇编C语言根本范例
逆向底子笔记十三 汇编C语言范例转换
逆向底子笔记十四 汇编嵌套if else
逆向底子笔记十五 汇编比较三种循环
逆向底子笔记十六 汇编一维数组
逆向底子笔记十七 汇编二维数组 位移 乘法
逆向底子笔记十八 汇编 结构体和内存对齐
逆向底子笔记十九 汇编switch比较if else
逆向底子笔记二十 汇编 指针(一)
逆向底子笔记二十一 汇编 指针(二)
逆向底子笔记二十二 汇编 指针(三)
逆向底子笔记二十三 汇编 指针(四)
逆向底子笔记二十四 汇编 指针(五) 系列完结
全局变量和局部变量
在提及全局变量和局部变量之前,需要先谈谈程序运行时在内存中的状态
任何一个程序在运行时都会把内存分成如下几块区域:
区域功能区域属性代码区存储程序要执行的代码可读可执行堆栈存储参数、局部变量、临时数据操作体系分配堆动态申请的、大小可变的可读可写全局变量区存储全局变量可读可写常量区存储常量只读全局变量
- 全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后里面是否有值取决于声明时是否给定了初始值,如果没有,默认为0
- 全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值.
- 全局变量所占内存会一直存在,直到整个进程结束.
- 全局变量的反汇编识别:
MOV 寄存器,byte/word/dword ptr ds:[0x12345678]上面的0x12345678是固定的地址,每次程序启动都不变
通过寄存器的宽度,大概byte/word/dword 来判断全局变量的宽度
- 全局变量就是所谓的基址
局部变量
- 局部变量在程序编译完成后并没有分配固定的地址
- 在所属的方法没有被调用时,局部变量并不会分配内存地址,只有当所属的程序被调用了,才会在堆栈中分配内存
- 当局部变量所属的方法执行完毕后,局部变量所占用的内存将变成垃圾数据.局部变量消散
- 局部变量只能在方法内部使用,函数A无法使用函数B的局部变量
- 局部变量的反汇编识别
[ebp-4]
[ebp-8]
[ebp-0xC]
例子
#include "stdafx.h"//全局变量int global=0x610;int main(int argc, char* argv[]){ //局部变量 int temp=0x160; global=global+temp; return 0;}
4: #include "stdafx.h"5: //全局变量6: int global=0x610;7: int main(int argc, char* argv[])8: {00401010 push ebp00401011 mov ebp,esp00401013 sub esp,44h00401016 push ebx00401017 push esi00401018 push edi00401019 lea edi,[ebp-44h]0040101C mov ecx,11h00401021 mov eax,0CCCCCCCCh00401026 rep stos dword ptr [edi]9: //局部变量10: int temp=0x160;00401028 mov dword ptr [ebp-4],160h11:12: global=global+temp;0040102F mov eax,[global (00428a64)]00401034 add eax,dword ptr [ebp-4]00401037 mov [global (00428a64)],eax13:14: return 0;0040103C xor eax,eax15: }0040103E pop edi0040103F pop esi00401040 pop ebx00401041 mov esp,ebp00401043 pop ebp00401044 ret我们可以看到相关代码在这里:
9: //局部变量10: int temp=0x160;00401028 mov dword ptr [ebp-4],160h11:12: global=global+temp;0040102F mov eax,[global (00428a64)]00401034 add eax,dword ptr [ebp-4]00401037 mov [global (00428a64)],eax我们可以很清楚地看到局部变量是直接生存在[ebp-4]也就是堆栈中的
而全局变量则是生存在一个固定的内存地址00428a64里
同时在断点刚断下的时候,就是还没运行上面的代码时,观察[global (00428a64)]也就是全局变量地址里存储的内容时,可以看到
我们全局变量已经初始化并被赋值了,观察整个main函数的反汇编代码,我们并没有看到全局变量赋值相关的语句,但这并不能阐明程序在运行前就已经赋值了,别忘了也有可能是在mainCRTStartup中将这里初始化的,为了印证这一点,我们直接将程序用OD打开,然后会在mainCRTStartup函数执行前断下,以此来验证是否是一打开程序全局变量就已经初始化了
不懂mainCRTStartup的可以去回顾逆向底子笔记十 汇编探求C程序入口
输入之前全局变量的地址,然后检察
可以观察到左下角数据窗口里,我们的全局变量已经初始化了,验证完毕(●ˇ∀ˇ●)
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |