《0day 2》笔记
windows中最重要的堆表有两种:空闲双向链表(Freelist)和快速单向链表Lookaside。快表从来不会发生堆块合并。
快表只有在精确匹配时才会分配,而空表有“找零钱”现象。
所有的释放块都链入堆表的末尾,分配的时候也先从堆表末尾拿。
调试态堆管理策略和常规堆管理策略有很大差异。
DWORD SHOOT的常用目标:
内存变量、代码逻辑、函数返回地址、攻击异常处理机制、函数指针、PEB中线程同步函数的入口地址(RtlEnterCriticalSection、RtlLeaveCriticalSection)。
异常处理流程:线程SEH异常处理函数,进程seh处理函数,系统默认异常处理程序(程序崩溃对话框)。
异常处理函数的第一轮调用用来尝试处理异常,第二轮的unwind调用往往执行释放资源等操作。
以下情况不会应用GS:
(1)函数不包括缓冲区;
(2)函数被定义为具有变量参数列表;
(3)函数使用无保护的关键字标记;
(4)函数在第一个语句中包含内嵌汇编代码;
(5)缓冲区不是8字节类型且大小不大于4个字节。
突破GS:
利用未被保护的内存
覆盖虚函数
攻击异常处理
同时替换栈中和.data中的cookie
SafeSEH
RtlIsValidHandler函数在以下情况允许异常处理函数执行:
(1)异常处理函数位于加载模块内存范围之外,DEP关闭。
(2)异常处理函数位于加载模块内存范围之内,相应模块未启用SafeSEH(安全SEH表为空),同时相应模块不是纯IL。
(3)异常处理函数位于加载模块内存范围之内,相应模块启用SafeSEH(安全SEH表不为空),异常处理函数地址包含在安全SEH表中。
不过有两种更为直接的方法可以突破SafeSEH:
(1)不攻击SEH,可以考虑覆盖返回地址或者虚函数表等信息。
(2)如果SEH的异常处理函数指针指向堆区,即使安全校验发现了SEH已经不可信,仍然会调用其已被修改过的异常处理函数。
DEP绕过:
(1)攻击未启用DEP的程序
(2)利用Ret2Libc
1.跳转到ZwSetInformationProcess关闭DEP
当DLL受SafeDisc版权保护系统保护时;
当DLL包含有.aspcak、.pcle、.sforce等字节时;
Windows Vista下面当DLL包含在注册表“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\DllNXOptions”键下边标识出不需要启动DEP的模块时。
2.跳转到VirtualProtect将shellcode所在内存页设置为可执行状态后再转入shellcode执行
3.跳转到VirtualAlloc开辟一段具有执行权限的内存空间后将shellcode复制到这段内存中执行
(3)利用可执行内存(进程的内存中存在一段可读可写可执行的内存)
(4)利用.NET(.NET中具有可执行属性的段) windows中最重要的堆表有两种:空闲双向链表(Freelist)和快速单向链表Lookaside。
(5)利用Java applet
ASLR包含了:
映像随机化(各模块的入口点地址的低位2个字节不变)、堆栈随机化、PEB与TEB随机化(依然可以通过其他方法获取到当前进程的PEB和TEB)
快表只有在精确匹配时才会分配,而空表有“找零钱”现象。
所有的释放块都链入堆表的末尾,分配的时候也先从堆表末尾拿。
调试态堆管理策略和常规堆管理策略有很大差异。
DWORD SHOOT的常用目标:
内存变量、代码逻辑、函数返回地址、攻击异常处理机制、函数指针、PEB中线程同步函数的入口地址(RtlEnterCriticalSection、RtlLeaveCriticalSection)。
异常处理流程:线程SEH异常处理函数,进程seh处理函数,系统默认异常处理程序(程序崩溃对话框)。
异常处理函数的第一轮调用用来尝试处理异常,第二轮的unwind调用往往执行释放资源等操作。
以下情况不会应用GS:
(1)函数不包括缓冲区;
(2)函数被定义为具有变量参数列表;
(3)函数使用无保护的关键字标记;
(4)函数在第一个语句中包含内嵌汇编代码;
(5)缓冲区不是8字节类型且大小不大于4个字节。
突破GS:
利用未被保护的内存
覆盖虚函数
攻击异常处理
同时替换栈中和.data中的cookie
SafeSEH
RtlIsValidHandler函数在以下情况允许异常处理函数执行:
(1)异常处理函数位于加载模块内存范围之外,DEP关闭。
(2)异常处理函数位于加载模块内存范围之内,相应模块未启用SafeSEH(安全SEH表为空),同时相应模块不是纯IL。
(3)异常处理函数位于加载模块内存范围之内,相应模块启用SafeSEH(安全SEH表不为空),异常处理函数地址包含在安全SEH表中。
不过有两种更为直接的方法可以突破SafeSEH:
(1)不攻击SEH,可以考虑覆盖返回地址或者虚函数表等信息。
(2)如果SEH的异常处理函数指针指向堆区,即使安全校验发现了SEH已经不可信,仍然会调用其已被修改过的异常处理函数。
DEP绕过:
(1)攻击未启用DEP的程序
(2)利用Ret2Libc
1.跳转到ZwSetInformationProcess关闭DEP
当DLL受SafeDisc版权保护系统保护时;
当DLL包含有.aspcak、.pcle、.sforce等字节时;
Windows Vista下面当DLL包含在注册表“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\DllNXOptions”键下边标识出不需要启动DEP的模块时。
2.跳转到VirtualProtect将shellcode所在内存页设置为可执行状态后再转入shellcode执行
3.跳转到VirtualAlloc开辟一段具有执行权限的内存空间后将shellcode复制到这段内存中执行
(3)利用可执行内存(进程的内存中存在一段可读可写可执行的内存)
(4)利用.NET(.NET中具有可执行属性的段) windows中最重要的堆表有两种:空闲双向链表(Freelist)和快速单向链表Lookaside。
(5)利用Java applet
ASLR包含了:
映像随机化(各模块的入口点地址的低位2个字节不变)、堆栈随机化、PEB与TEB随机化(依然可以通过其他方法获取到当前进程的PEB和TEB)
ASLR绕过:
攻击未启用ASLR的模块、利用部分覆盖进行定位内存地址(映像随机化只是对映像加载基址的前2个字节做随机化处理)、利用Heap spray技术定位内存地址,利用Java applet heap spray技术定位内存地址、为.NET控件禁用ASLR(去掉文件的IMAGE_DLL_CHARACTERISTIC_DYNAMIC_BASE,并将运行版本号改为小于2.5)
SEHOP(作为对SafeSEH的补充,SEHOP是在SafeSEH的RtlIsValidHandler函数检验前进行的)绕过方法:
SEHOP(作为对SafeSEH的补充,SEHOP是在SafeSEH的RtlIsValidHandler函数检验前进行的)绕过方法:
不去攻击SEH,而是攻击函数返回地址或者虚函数等、利用未启用SEHOP的模块、伪造SEH链
堆保护机制:
PEB random、Safe Unlink、heap cookie、元数据加密
堆保护机制绕过方法:
堆保护机制绕过方法:
攻击堆中存储的变量(堆中的各项保护措施是对堆的关键结构进行保护,但对堆中存储的内容是不保护的)、利用chunk重设大小攻击堆(Safe Unlink在于从空表上拆卸chunk时对双向链表的有效性进行验证,但把chunk插入到空表的时候没有进行检验)、利用Lookaside表进行堆溢出(Safe Unlink未对快表中的单链表进行验证)
内核漏洞按严重程度分类:
远程拒绝服务、本地拒绝服务、远程任意代码执行、本地权限提升
内核漏洞按按漏洞原理分类:
拒绝服务、缓冲区溢出、内存篡改(任意地址写任意数据、固定地址写任意数据、任意地址写固定数据)、设计缺陷
断点技巧:
畸形RetAddr断点、条件断点、消息断点、内存断点、硬件断点
评论
发表评论