SEH表的信息在内存中是加密存放的,所以突破它可能性不大······································································
chick if this is a valid handler 失败而告终 这是软件DEP的杰作
种类:
1)软件DEP 就是前面学习过的 SafeSEH 目的是阻止利用SEH的攻击 与CPU硬件无关 利用软件模拟实现DEP 对操作系统提供一定的保护。
现在就知道了 SafeSEH的检验过程会检查异常处理函数是否处于非可执行上了吧。
2)硬件DEP其实才是真正意义上的DEP,需要CPU支持,(AMD 称之为NX INTEL称之为XD)
操作系统通过设置内存夜的NX/XDsh属性标记,来指明不能从该内存执行代码。 标志0 ---该页面可以运行
OPTIN: 默认将DEP保护应用于 WINODWS 系统组件 和 服务
OPTOUT 为排除列表程序外的所有程序和服务启用DEP,也就是指定程序部启用DEP 默认无
ALWAYSON 对所有进程启用DEP的保护 目前只有64位操作系统 64位总是开启 不可以被关闭 IE是32位程序
ALWAYSOFF 对所有进程都禁用DEP
解决方法 总结:
1 覆盖SEH 去关闭DEP SEH上放置 pop pop pop esp ret nseh 放置关闭NX例程
暂无例子说明····
0BADF00D * pdep [-r <reg>] [-m <module>] [-n] [-o]
0BADF00D (look for dep bypass instructions such as pop pop pop esp ret)
0BADF00D You can optionally specify reg and module to filter on
0BADF00D Option -n : don't show pointers that contain null bytes
0BADF00D Option -o : don't show pointers from modules in the Windows folder
2 覆盖返回地址 strcpy 对shellcode字符要检查\x00
Ret2Libc学习NtSetInformationProcess DEP
3 覆盖返回地址 memcpy 对shellcode字符串无检查
VirtualProtect 2方法 -direct ret-dep-easy rm to mp3
利用可执行内存 实现 将代码复制进其中执行 暂无例子
下面可以进行选择 OPTIN 和 OPTOUT
还可以这样查看
在VS2008中看到 默认启用DEP的
还有在PE文件视角下 IMAGE_OPTIONAL_HEADER中的DllCharacteristics变量进行体现当它设置成为0x0100表示该程序采用 /NXCOMPAT 编译
VISTA 及后续版本的操作系统上会自动启用 DEP保护
这种保护石迄今为止 在本书中 我们遇得到的最有力保护机制
保护局限:
1)硬件CPU需要CPU支持,不是所有CPU都支持硬件DEP的支持
2)由于兼容性的原因 WINDOWS不能对所有的进程开启 DEP保护,否则可能出现异常
ATL,Active Template Library活动模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
EG: 一些第三方插件DLL 由于无法确认其是否支持DEP 对涉及一些DLL的程序不敢贸然开启DEP保护 .ATL7.1 + 以前版本的程序需要在数据页面上产生可执行代码,这种情况不能开启 DEP保护的
3)/NXCOMPAT 编译选项 或者是 IMAGE_DLLCHARACTERISTICS_NX_COMPAT的设置,只对VISTA 以上的系统有效
EG: 在XP SP3 等 这个设置会被忽略
4)早期的系统 有动态关闭DEP的 API函数
64位下 有 ALWAYSON 对所有进程启用DEP保护,在这个模式下,DEP不可以被关闭 目前64位操作系统上才工作在 ALWAYSON模式下
ALWATSOFF 对所有进程禁用DEP
DEP保护对象是进程级别的,当加载模块的只要有一个模块不支持DEP,这个进程就不能贸然开启DEP,否则产生异常
即使是WIN7下依然有很多程序没有启用DEP 想办法攻击未启用DEP保护的程序不失为一个简单有效的方法
从 Windows XP SP2 开始,Windows 的 32 位版本使用下列功能之一:
- 由 AMD 定义的 No-Execute Page-Protection (NX) 处理器功能。
- 由 Intel 定义的 Execute Disable Bit (XD) 功能。
在Vista / wnodws 2008 / windows 7 可以用 bcdedit 命令来修改设置
BCDEdit(启动配置数据存储编辑器)命令用于修改Win7/Win8启动菜单,相对于WinXP等之前的系统是通过修改Boot.ini文件来实现对系统启动菜单的修改
bcdedit /set nx OptIn
bcdedit /set nx OptOut
bcdedit /set nx AlwaysOn
bcdedit /set nx AlwaysOff
bcdedit 可以查看当前 NX 的值
WriteProcessMemory 函数 可以写入 oleaut32.dll 这个区间为 R E 有一个问题,就是 WPM 调用会暂时把这个位置标记为可读,
那么你用编码的 shellcode 将不会成功,坏字节也不会成功的,可以预先考虑在真正的shellcode 里面包含一些小 egghunter , 会调用
VirtualProtect 去设置可读可写
WPM 2 可以直接去写 WriteProcessMemory 函数中的 ZwWriteVirtualMemory 之后的位置,那么可以直接执行,但是要考虑 不会破坏kernel32.dll
的结构,因为shellcode 要用到kernel32.dll中的函数。所以要注意shellcode的大小限制
Message=ROP Chain for VirtualProtect() [(XP/2003 Server and up)] :
Message=ROP Chain for SetInformationProcess() [(XP/2003 Server only)] :
Message=ROP Chain for SetProcessDEPPolicy() [(XP SP3/Vista SP1/2008 Server SP1, can be called only once per process)] :
Message=ROP Chain for VirtualAlloc() [(XP/2003 Server and up)] :
!mona rop 可以查询 有关ROP的信息
!pvefindaddr ropcall 查看无 ASLR SAFESEH 供逃过DEP 的函数调用
发现了WIN7 不同系统中的DLL 基址 与函数的差是不变的,那么各个 retn 的地址差也是不变的,那么构造ROP就很简单了。