ASLR初体验

  • 运行环境: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:
第一次:
未开启ASLR第一次
第二次(重启计算机后):
重启后
以上结果可发现未开启ASLR,程序自定义函数PrintAddress和变量gvar的地址都不会发生变化,但kernel32.dll库的地址仍然发生变化,其原因是kernel32.dll库默认被系统ASLR保护。
以上是对于ASLR保护机制的小小体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值