ROP - 绕过DEP VirtualProtect

About DEP & ROP

DEP-数据执行保护, 软件DEP又称为Safe SEH, 硬件DEP主要思想是将一部分内存指定为可写但不可实行, 导致最终的shellcode无法执行. 这里介绍的是当对栈溢出进行利用时, 将shellcode布置在栈区, 因为DEP的存在导致栈区的shellcode不能执行, 此时就使用ROP链来处理DEP的情况了.

环境

WinXp Sp3 开启DEP
编译器 VS2015 默认开启DEP

核心思想

核心思想就是通过一系列的系统指令, 使得执行Windows的VirtualProtect函数(也有其他的方式), 该函数的主要功能是能够改变指定内存地址的内存属性, 这样能够使得该部分内存地址变得可以执行. 那么通过调用该函数使得shellcode部分代码可以执行即可达到绕过DEP的效果. VirtualProtect:
kernel32.dll 一般Windows程序都会加载该DLL

1
2
3
4
5
6
BOOL WINAPI VirtualProtect(
_In_ LPVOID lpAddress, //修改的内存其实地址
_In_ SIZE_T dwSize, //修改的内存区域大小
_In_ DWORD flNewProtect, //修改后的内存属性 0x40表示可执行, 详细可查看MSDN
_Out_ PDWORD lpflOldProtect //out 保存以前的内存属性
);

VirtualProtect()的指针覆盖EIP, 并且我们会将5个需要的参数放到栈顶, 模拟函数的调用, 先push四个参数, 然后push ret, 因此调用VirtualProtect之前函数的栈顶布局为如下:

Fuzz methods & tools BuTags - a chrome plugin
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×