标签:
VS2013编译以下代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int test = 1;
test = 2;
return 0;
}
使用CFF Explorer或者PEID打开编译后生成的exe文件,查看imageBase和OEP,如下所示:
OEP: 0x00011073
ImageBase:0x00400000
所以该程序的启动点在:0x00411073
该程序的区段信息如下所示:
将其载入OD,其载入地址并非00400000,所以载入OD后,alt+e,先看看主模块的载入地址:
一般进程运行时都是先载入该exe文件,所以exe总能以其imagebase载入,但这里不知这个是为什么,这里可以不用管这个,直接以其载入地址0x00390000进行后面的分析,但是鄙人有强迫症,总想搞清楚这是为什么,所以先来看下为什么不能以imagebase载入。
联想到安全机制ASLR,难道是这个原因?多次载入,果然发现多次载入时主模块的载入地址每次都不同。。。
隐约记得VC6.0是不支持ASLR的,所以下面用VC6.0重新编译以下代码
#include "stdafx.h"
int main(int argc, char* argv[])
{
printf("Hello World!\n");
return 0;
}
果然,每次载入地址都是00400000,那么VS2013的ASLR是不是也可以关闭呢?记得好像哪里有说过可以关闭,找一找。。。
强大的网友:
---------------------------------------------------------------------------------------------------
通过加载程序时候不再使用固定的基址加载,从而干扰shellcode定位的一种保护机制
windows Vista出现后,ASLR 才真正开始发挥作用
VS2005 添加 /dynmicbase 就可以支持 ASLR
VS2008 linker->Randomized Base Address 设置
包含 映像随机化,堆栈随机化,PEB+TEB随机化
---------------------------------------------------------------------------------------------------
果然,将其关闭,再次测试
备注:关闭后,少了一个区段reloc,这个此处不分析为什么
搞定,此处只是为了便于多次分析,所以关闭ASLR,正常情况,为了安全还是要将ASLR打开的
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
下面从基地址(0x00400000)开始分析,如下所示:
我们知道PE文件在内库中是以1000h(一页)对其,所以先看该页:
。。。。。。
。。。。。。
end
这部分数据全是PE文件的结构数据,各种头部,区段数据等,和本主题没关系,继续向下第二页:
0x00401000,PEID和OD都可以知道这部分数据是.textbbs,
0x00401000---0x00402000这一页内存,结果全是0,《程序员的自我修养》中说“.bbs”段存放的是为初始化的全局变量和局部静态变量,这里没有用到未初始化的全局变量和局部静态变量,所以全是0.
下一个区段:.text(0x00411000)
明天再分析,先睡觉了
标签:
原文地址:http://www.cnblogs.com/sevensd/p/5877754.html