- 运行环境:Windows10,Visual Studio 2017
-本次实验体会 ASLR(随机基址)的作用
源码:
#include <windows.h>
#include <stdio.h>
# include <stdlib.h>
#define DLL_NAME "kernel32.dll"
unsigned long gvar = 0;
void PrintAddress() {
printf("PrintAddress的地址:%p \n", PrintAddress);
gvar++;
}
int main()
{
BYTE* ptr;
int position = 0, address;
HINSTANCE handle;
handle = LoadLibrary(DLL_NAME);
if (!handle)
{
printf(" load dll erro !");
exit(0);
}
ptr = (BYTE*)handle;
address = (int)ptr + position;
printf("Kernel32.dll文件库的地址: 0x%x\n", address);
void *pvAddress = GetProcAddress(address, "LoadLibraryW");
printf("LoadLibrary函数地址:%p \n", pvAddress);
PrintAddress();
printf("变量gvar的地址:%p \n", &gvar);
system("pause");
return 0;
}
此代码的作用是输出Kernel32.dll库和LoadLibrary的地址,以及程序中自定义的函数PrintAddress和变量gvar的地址。
开启ASLR:
第一次:
第二次(重启计算机后):
从以上结果可知道两次运行结果各不相同,原因是开启了ASLR随机基址保护程序,使地址在不同时刻不相同。
未开启ASLR:
第一次:
第二次(重启计算机后):
以上结果可发现未开启ASLR,程序自定义函数PrintAddress和变量gvar的地址都不会发生变化,但kernel32.dll库的地址仍然发生变化,其原因是kernel32.dll库默认被系统ASLR保护。
以上是对于ASLR保护机制的小小体验。