实验环境:
Winxp sp3
VS2010
实验配置:
禁用优化、关闭GS、关闭safeseh、开启DEP
思路:当程序需要一段可执行内存时,可以通过kernel32.dll的VirtualAlloc申请一段具有可执行属性的内存。因此可通过利用此函数将shellcode复制到申请的内存空间中,以绕过DEP。
如何利用?
将返回地址覆盖为VirtualAlloc的地址,参数输入进去即可。
VirtualAlloc(
LPVOID lpAddress, #申请内存区域的地址,
SIZE_T dwSize, #申请内存的大小
DWORD flAllocationType, #申请内存的类型
DWORD flProtect); #申请内存的访问控制类型,如读、写、执行等权限
参数设置:
我们将lpAddress=0x00030000,只要是一个未被占用的地址即可。
dwSize=0xff,申请的空间足够存放shellcode即可,我们选择255个字节
flAllocationType=0x00001000,查看MSDN可知这里是……
flProtext=0x00000040,内存属性设为可读可写可执行。
比较:
VirtualAlloc与VirtualProtect最大的区别在于VirutalAlloc各个参数不存在动态确定问题,可以直接写到shellcode里边。
实验程序:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
char shell[]={
"\x90\x90\x90\x90\x90\x90\x90\x90"};
int test()
{
printf("OK!");
char array[4]={
0};
memcpy(array,shell,sizeof(shell)+1);
return 0;
}
int main()
{
HMODULE hMod = LoadLibrary(L"shell32.dll");
test();
return 0;
}
第一阶段:利用VirtualAlloc函数申请一段具有执行权限的内存
1、找到VirtualAlloc的地址
OD载入程序,右键查找->所有模块名称中查找,输入VirtualAlloc。发现有很多VirtualAlloc
双击这里进入