《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)
    ASLR绕过:
    攻击未启用ASLR的模块、利用部分覆盖进行定位内存地址(映像随机化只是对映像加载基址的前2个字节做随机化处理)、利用Heap spray技术定位内存地址,利用Java applet heap spray技术定位内存地址、为.NET控件禁用ASLR(去掉文件的IMAGE_DLL_CHARACTERISTIC_DYNAMIC_BASE,并将运行版本号改为小于2.5)
    SEHOP(作为对SafeSEH的补充,SEHOP是在SafeSEH的RtlIsValidHandler函数检验前进行的)绕过方法:
    不去攻击SEH,而是攻击函数返回地址或者虚函数等、利用未启用SEHOP的模块、伪造SEH链
    堆保护机制:
    PEB  random、Safe Unlink、heap cookie、元数据加密
    堆保护机制绕过方法:
    攻击堆中存储的变量(堆中的各项保护措施是对堆的关键结构进行保护,但对堆中存储的内容是不保护的)、利用chunk重设大小攻击堆(Safe Unlink在于从空表上拆卸chunk时对双向链表的有效性进行验证,但把chunk插入到空表的时候没有进行检验)、利用Lookaside表进行堆溢出(Safe Unlink未对快表中的单链表进行验证)
    内核漏洞按严重程度分类:
    远程拒绝服务、本地拒绝服务、远程任意代码执行、本地权限提升
    内核漏洞按按漏洞原理分类:
    拒绝服务、缓冲区溢出、内存篡改(任意地址写任意数据、固定地址写任意数据、任意地址写固定数据)、设计缺陷
    断点技巧: 
    畸形RetAddr断点、条件断点、消息断点、内存断点、硬件断点

评论

此博客中的热门博文

Cobalt Strike automigrate自动迁移进程脚本

菜刀连接php一句话木马返回200的原因及解决方法

vultr安装kali linux 折腾手记